使用应用程序池标识在 IIS 上的 ASP.NET 中查询 Win32_Printer 时权限被拒绝

Posted

技术标签:

【中文标题】使用应用程序池标识在 IIS 上的 ASP.NET 中查询 Win32_Printer 时权限被拒绝【英文标题】:Permission denied while querying Win32_Printer in ASP.NET on IIS using Application Pool Identity 【发布时间】:2019-01-08 20:12:37 【问题描述】:

我正在使用应用程序池标识(Windows 2016 服务器机器)在 IIS 上的 ASP.net 代码中查询 Win32_Printer。在其中一台服务器上,我收到拒绝访问错误。该代码在其他服务器上运行良好。我比较了两台服务器,但找不到权限差异。我需要向 IIS App Pool Identity 用户授予什么权限才能进行此调用?这是代码sn-p。


        public static List<string> GetPrinterNames()
    
        var query = new System.Management.ObjectQuery("SELECT * FROM Win32_Printer");
        var searcher = new System.Management.ManagementObjectSearcher(query);
        var printerList = new List<string>();
        foreach (var dummyPrinterObject in searcher.Get())
        
            printerList.Add(dummyPrinterObject["DeviceID"] as string);
        

        return printerList;
    

【问题讨论】:

您能否确认在其他服务器上应用程序池标识设置为 ApplicationPoolIdentity 而不是其他自定义或预定义标识,例如LocalService 这会将Web服务器的打印机列表返回给客户端。你确定要这样吗? @Mohsin Mehmood,是的。身份设置为 ApplicationPoolIdentity。附带说明一下,将其设置为 LocalService 实际上会显示打印机。但我不想使用 LocaService。相反,我想授予 ApplicationPoolIdentity 或 IIS_USR 权限以查询打印机列表。 @ManojChoudhari,是的 Manoj。我们希望用户从列表中选择打印机并从服务器打印文档。 【参考方案1】:

使用

public static System.Drawing.Printing.PrinterSettings.StringCollection InstalledPrinters  get; 

示例显示在this documentation link:

private void PopulateInstalledPrintersCombo()

    // Add list of installed printers found to the combo box.
    // The pkInstalledPrinters string will be used to provide the display string.
    String pkInstalledPrinters;
    for (int i = 0; i < PrinterSettings.InstalledPrinters.Count; i++)
        pkInstalledPrinters = PrinterSettings.InstalledPrinters[i];
        comboInstalledPrinters.Items.Add(pkInstalledPrinters);
    

【讨论】:

以上是关于使用应用程序池标识在 IIS 上的 ASP.NET 中查询 Win32_Printer 时权限被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

IIS应用程序池添加ASP.NET v4.0

IIS 中 ASP.net 应用程序的单独应用程序池

在 IIS 上使用 .NET Core 运行 ASP.NET 5 (MVC 6)

ASP.NET C# 如何在程序中控制IIS服务或应用程序池重启?

如何在 IIS 7、Windows 7 上将 ASP.NET 4.0 添加为应用程序池

IIS 中的服务不可用消息