Mak*_*Sim 5 c# vb.net printing asp.net winapi
这是第335次被问到此问题,但我没有找到答案。我正在尝试通过WinSpool API从ASP.net C#应用程序直接将原始数据发送到打印机。
我的代码只是这里的副本。
错误在这里
if( OpenPrinter( szPrinterName.Normalize(), out hPrinter, IntPtr.Zero ) )
Run Code Online (Sandbox Code Playgroud)
它对于本地打印机工作正常,但对于共享网络打印机,OpenPrinter
(GetLastError
实际结果)始终为5 - Access Denied
。
我试过了
PRINTER_DEFAULTS
具有不同组合的不同值DesiredAccess
我必须注意,我只想打印,而不是更改打印机配置或需要管理权限的内容。
我可以使用“打印机选项”页面和其中嵌入的测试工具从服务器打印到此共享打印机。这样打印机即可工作。如何通过API访问它?
更新:如果从Windows应用程序或控制台应用程序中调用,此代码看起来工作正常。那么为什么在Web应用程序中拒绝访问?
更新2:问题可能是由于以下事实引起的:安装在主机PC上并与虚拟PC共享的打印机(或在生产环境中:打印机安装在域内并共享到DMZ中的PC),并且没有正确的方法授予该打印机权限虚拟PC的用户(或域外的用户)
更新3:这是另一个事实。如果我从资源管理器中的虚拟设备浏览到主机PC(例如\\host_pc\C$
),则会收到输入用户名和密码以访问主机PC的通知。如果在此之后选中“保存密码”,整个“访问被拒绝”问题将消失,直到我在主机PC上更改密码为止。
默认情况下,在 IIS 下运行的 ASP.Net 网站在低权限本地用户帐户下运行IIS_APPPOOL\mysite
。为了允许客户端从网站访问域资源,您需要将 IIS 运行所用的用户(称为应用程序池标识)更改为对所有内容(网络和网络)拥有正确权限的域用户。打印机和 IIS 本身)。
最简单的解决方案(可能还有更安全的解决方案)是将 IIS APPPool 更改为使用内置 NetworkService 帐户。该帐户会作为 MyDomain\MyHostName$ 自动添加到您的域中,因此您可以使用该帐户授予打印机权限(或任何其他需要的权限)。
要更改应用程序池身份,只需打开 IIS 管理器,选择正确的应用程序池,然后单击“高级设置”,然后查找设置“身份”。
更多信息请访问: http://www.iis.net/learn/manage/configuring-security/application-pool-identities