【问题标题】:Printers visible to exe not visible to web app?对 exe 可见的打印机对 Web 应用程序不可见?
【发布时间】:2018-06-21 18:02:50
【问题描述】:

已解决 - 感谢史蒂夫。问题是我使用的 App Pool 使用的是默认的 App Pool Identity,它没有足够的权限。更改为使用具有足够权限的帐户的应用程序池解决了该问题。

我有一个简单的 C# 类来获取可用打印机的列表。从简单的控制台应用程序中调用时,它会返回本地定义的打印机(9 台打印机)的完整列表。当从 aspx web 应用程序中的代码调用时,它只返回默认打印机。 Web 应用程序以服务器上的本地管理员用户身份安装和运行,并且所有打印机都在该用户的配置文件中定义。

注意 - 我远程桌面到服务器并在那里运行控制台 exe 应用程序,它会显示所有打印机。我正在尝试获取服务器上定义的所有打印机的列表。

是否有一些我遗漏的安全问题?

类代码:

using System.Management;

/// <summary>
/// Returns a list of printers available on the current system.
/// </summary>
public static class PrinterList
{
public class Printer
{
    public string name { get; set; }
    public string server { get; set; }
    public string location { get; set; }
    public string portname { get; set; }
    public string sharename { get; set; }
}
public static Printer[] GetInstalledPrinterList()
{
    Printer[] printers = new Printer[0];

    ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * from Win32_Printer");
    ManagementObjectCollection coll = searcher.Get();
    foreach (ManagementObject printer in coll)
    {
        string name = printer.GetPropertyValue("Name").ToString();
        if ((!name.ToLower().Contains("send to onenote")) &&
            (!name.ToLower().Contains("xps document writer")) &&
            (!name.ToLower().Contains("print to pdf")) &&
            (!name.ToLower().Contains(" fax")) &&
            (!name.ToLower().Equals("fax")))
        {
            string server = "";
            if (printer.GetPropertyValue("ServerName") != null)
                server = printer.GetPropertyValue("ServerName").ToString();
            string location = "";
            if (printer.GetPropertyValue("Location") != null)
                location = printer.GetPropertyValue("Location").ToString();
            string portname = "";
            if (printer.GetPropertyValue("PortName") != null)
                portname = printer.GetPropertyValue("PortName").ToString();
            string sharename = "";
            if (printer.GetPropertyValue("ShareName") != null)
                sharename = printer.GetPropertyValue("ShareName").ToString();

            Printer newPrinter = new Printer();
            newPrinter.name = name;
            newPrinter.server = server;
            newPrinter.location = location;
            newPrinter.portname = portname;
            newPrinter.sharename = sharename;

            Printer[] newlist = new Printer[printers.Length + 1];
            for (int i = 0;i < printers.Length; i++)
            {
                newlist[i] = printers[i];
            }
            newlist[printers.Length] = newPrinter;
            printers = newlist;
        }
    }
    return printers;
}

}

【问题讨论】:

    标签: c# asp.net printing


    【解决方案1】:

    您的 asp.net c# 代码在您的服务器上运行,而不是在客户端的计算机上。这是要记住的非常重要的事实。

    通过在 asp.net 上调用 get printers,您基本上可以获得连接到服务器的可用打印机,而不是来自客户端的打印机。

    编辑:原来您使用的是应用程序池的默认帐户。通过对应用程序池使用具有管理员权限的帐户可以解决问题。

    【讨论】:

    • 这正是我想要的——服务器上的打印机。当我运行 exe 时,它​​也在服务器上。但是 exe(使用同一个类)返回所有打印机,而 Web 应用程序只显示一个默认打印机。
    • @KimCrosser 通常,您的 asp.net 将托管在 IISxxx 用户帐户下运行的 IIS 上,或者将 IIS 配置为使用管理员帐户或授予该 IIS 帐户管理员权限。您还需要在 IIS 中为您的网站授予“完全信任”权限。
    • 该网站和我的 Web 应用程序都运行 .NET 信任级别 = 完整(内部)。该站点和我的 Web 应用程序还使用了一个登录帐户,该帐户是服务器上管理员组的成员。
    • @KimCrosser 你是如何运行它们的?在 IIS 或其他主机服务器中?
    • 啊哈!你让我指出了正确的方向。问题是我使用的 App Pool 使用的是默认的 App Pool Identity。当我更改为使用具有管理员权限的登录帐户的应用程序池时,问题就解决了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    相关资源
    最近更新 更多