Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在windows服务中获取所有打印机名称?_C#_Service_Windows Services_Printers - Fatal编程技术网

C# 如何在windows服务中获取所有打印机名称?

C# 如何在windows服务中获取所有打印机名称?,c#,service,windows-services,printers,C#,Service,Windows Services,Printers,我想在计算机和网络上安装所有打印机名称。 我在下面使用了这些函数来获取所有打印机的列表。所有这些功能。在控制台和表单应用程序中工作正常,我可以得到所有打印机的列表,但当我尝试使用这些函数时。在windows服务中,我只能在没有网络的计算机上安装。还有我在LocalSystem帐户下工作的服务 函数1: WinsPool.PrinterEnumFlags Flags = WinsPool.PrinterEnumFlags.PRINTER_ENUM_CONNECTIONS | Win

我想在计算机和网络上安装所有打印机名称。 我在下面使用了这些函数来获取所有打印机的列表。所有这些功能。在控制台和表单应用程序中工作正常,我可以得到所有打印机的列表,但当我尝试使用这些函数时。在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();
        }
        foreach (string printer in System.Drawing.Printing.PrinterSettings.InstalledPrinters)
        {
            string printerName = printer;
        }
            ManagementObjectSearcher searcher = 
                new ManagementObjectSearcher("root\\CIMV2", 
                "SELECT * FROM Win32_Printer"); 

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

        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();
        }
        foreach (string printer in System.Drawing.Printing.PrinterSettings.InstalledPrinters)
        {
            string printerName = printer;
        }
            ManagementObjectSearcher searcher = 
                new ManagementObjectSearcher("root\\CIMV2", 
                "SELECT * FROM Win32_Printer"); 

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

打印机通常安装在特定的Windows帐户上,因此只有当您以该帐户的身份登录时,打印机才可见。对于需要访问打印机的Windows服务,正常情况下可以将其作为所需打印机可见的命名帐户运行,也就是说,不要将其作为LocalSystem运行。

以下是如何启动:

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()
    }
公共部分类服务:ServiceBase
{
列表打印机=新列表();
公共服务()
{
初始化组件();
}
启动时受保护的覆盖无效(字符串[]args)
{
getPrinters();
}
私有void getPrinters()
{
foreach(系统中的字符串打印机。绘图。打印。打印机设置。已安装打印机)
{
打印机。添加(打印机);
}
}
静态void Main()
{
(新服务()).OnStart(null);//允许轻松调试OnStart()
}

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

转到ServiceProcessInstaller属性,并在“杂项”选项卡“帐户到用户”上进行更改

之后,无论何时安装服务,都会提示您输入用户 首先向用户添加密码,然后按如下方式登录:

<machine_name>\<user_name>
<password>
<password_again>
\

“我的服务在LocalSystem帐户下工作”-然后它将作为您的计算机帐户出现在任何网络打印机上-您的计算机帐户有权访问这些打印机中的任何一台吗?是的,我有权访问所有打印机。您有,但您的计算机有吗?