1

我想在计算机和网络上安装所有打印机名称。我在下面使用这些功能来获取所有打印机的列表。所有这些功能。在控制台和表单应用程序中正常工作,我可以获得所有打印机的列表,但是当我尝试使用这些功能时。在 Windows 服务中,我只能安装在没有网络的计算机上。还有我的服务在LocalSystem账户下工作。

功能 1:

        WinsPool.PrinterEnumFlags Flags = WinsPool.PrinterEnumFlags.PRINTER_ENUM_CONNECTIONS | WinsPool.PrinterEnumFlags.PRINTER_ENUM_LOCAL;
        const int ERROR_INSUFFICIENT_BUFFER = 122;
        uint cbNeeded = 0;
        uint cReturned = 0;
        if (WinsPool.EnumPrinters(Flags, null, 2, IntPtr.Zero, 0, ref cbNeeded, ref cReturned))
        {
            return null;
        }
        int lastWin32Error = Marshal.GetLastWin32Error();
        if (lastWin32Error == ERROR_INSUFFICIENT_BUFFER)
        {
            IntPtr pAddr = Marshal.AllocHGlobal((int)cbNeeded);
            if (WinsPool.EnumPrinters(Flags, null, 2, pAddr, cbNeeded, ref cbNeeded, ref cReturned))
            {
                WinsPool.PRINTER_INFO_2[] printerInfo2 = new WinsPool.PRINTER_INFO_2[cReturned];
                int offset = pAddr.ToInt32();
                Type type = typeof(WinsPool.PRINTER_INFO_2);
                int increment = Marshal.SizeOf(type);
                for (int i = 0; i < cReturned; i++)
                {
                    printerInfo2[i] = (WinsPool.PRINTER_INFO_2)Marshal.PtrToStructure(new IntPtr(offset), type);
                   string printerName =  printerInfo2[i].pPrinterName;
                    offset += increment;
                }
                Marshal.FreeHGlobal(pAddr);
            }
            lastWin32Error = Marshal.GetLastWin32Error();
        }

功能 2:

        foreach (string printer in System.Drawing.Printing.PrinterSettings.InstalledPrinters)
        {
            string printerName = printer;
        }

功能 3:

            ManagementObjectSearcher searcher = 
                new ManagementObjectSearcher("root\\CIMV2", 
                "SELECT * FROM Win32_Printer"); 

            foreach (ManagementObject queryObj in searcher.Get())
            {
               string printerName = queryObj["Name"].ToString();
            }
4

3 回答 3

2

打印机通常安装到特定的 Windows 帐户,因此只有当您以该帐户登录时才能看到它们。对于需要访问打印机的 Windows 服务,通常将其作为所需打印机可见的命名帐户运行,即不要将其作为 LocalSystem 运行。

于 2013-04-03T08:31:46.493 回答
1

以下是如何开始:

public partial class Service : ServiceBase
{
    List<string> printers = new List<string>();
    public Service()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        getPrinters();
    }

    private void getPrinters()
    {
        foreach (string printer in System.Drawing.Printing.PrinterSettings.InstalledPrinters)
        {
            printers.Add(printer);
        }

    }

    static void Main()
    {
        (new Service()).OnStart(null); // allows easy debugging of OnStart()
    }
于 2013-04-03T18:57:34.413 回答
0

我知道这是几年前的事了……但我今天遇到了同样的问题,终于解决了……

转到您的 ServiceProcessInstaller 属性并在杂项选项卡上更改帐户为用户。

在此之后,每当您安装该服务时,系统都会提示您输入用户,首先向您的用户添加密码并像这样登录:

<machine_name>\<user_name>
<password>
<password_again>
于 2021-05-12T11:02:24.270 回答