【问题标题】:Network Connected Printer not available in ASP.Net Application网络连接的打印机在 ASP.Net 应用程序中不可用
【发布时间】:2025-11-26 18:10:02
【问题描述】:

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

服务器上可能有一些 联网打印机 都设置了应用程序用户帐户的完全权限,一切正常,直到应用程序用户帐户从 Windows 注销,此时System.Drawing.Printing.PrinterSettings.InstalledPrinters 只返回本地打印机,没有列出网络连接的打印机!

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

  • 我将应用程序池Process Model 配置为作为 特定的用户身份。
  • 我将应用程序的身份模拟给特定用户 网络配置:

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

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

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

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

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

有人知道如何解决这个问题吗?即使用户没有登录,是否有任何方法可以访问网络连接的打印机?

【问题讨论】:

  • 我们遇到了同样的问题...您找到解决方案了吗?

标签: asp.net iis printing impersonation


【解决方案1】:

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

Printing from ASP.NET to a network printer

【讨论】:

    【解决方案2】:

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

    使用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();
    

    【讨论】:

      最近更新 更多