网络连接打印机在ASP.Net应用程序中不可用

时间:2012-05-06 20:35:09

标签: asp.net iis printing impersonation

我有一个在IIS 7.5上运行的ASP.Net 4.0 Web应用程序,我可以使用System.Drawing.Printing.PrinterSettings.InstalledPrinters命令获取已安装打印机的列表,并将应用程序中的每个报告分配给上面列出的任何打印机!

服务器上可能有一些网络连接打印机,所有完全权限设置为应用程序的用户帐户,一切正常,直到应用程序的用户帐户退出窗口,此时System.Drawing.Printing.PrinterSettings.InstalledPrinters仅返回本地打印机,未列出任何网络连接打印机!

我试图通过以下方式向用户模拟ASP.Net进程并访问网络打印机,但没有成功:

  • 我将应用程序池Process Model配置为以a身份运行 特定用户身份。
  • 我将应用程序的身份模仿给特定用户 Web.Config:

    <identity impersonate="true" userName="user" password="pass"/>

  • 最后使用advapi32.dll API在代码中实现模拟

在上述所有方法中,WindowsIdentity在打印时返回真实用户名:

System.Security.Principal.WindowsIdentity.GetCurrent().Name

但看起来模拟不是问题,用户注销的那一刻,所有网络连接打印机都不见了!

有人知道如何解决这个问题吗?即使用户未登录,有没有办法访问网络连接打印机?

2 个答案:

答案 0 :(得分:3)

网络连接打印机,共享文件夹和地图驱动器只有在用户登录操作系统时才能访问,它们几乎不是某些网络资源的快捷方式,全部断开连接,并且在相应用户注销时无法访问!

使用System.Printing.PrintServerGetPrintQueues方法,您可以获取打印服务器托管的打印队列集合:

PrintServerUNCName是相应服务器的UNC name,如\\MyServerName

var printers = new PrintServer("PrintServerUNCName").GetPrintQueues()
    .Where(t =>
    {
        try { return t.IsShared && !t.IsNotAvailable; }
        catch { return false; }
    })
    .Select(t => t.FullName)
    .ToArray();

答案 1 :(得分:0)

尝试以下可能有用的链接。您必须按名称在服务器上添加打印机,并使用名称而不是UNC访问打印机。

Printing from ASP.NET to a network printer