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

     2023-02-22     35

关键词:

【中文标题】如何在 Windows 服务中获取所有打印机名称?【英文标题】:How to get all printer name in windows service? 【发布时间】:2013-04-03 08:05:00 【问题描述】:

我想获取计算机和网络上安装的所有打印机名称。 我在下面使用这些功能来获取所有打印机的列表。所有这些功能。在控制台和表单应用程序中正常工作,我可以获得所有打印机的列表,但是当我尝试使用这些功能时。在 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();
            

【问题讨论】:

“我的服务在 LocalSystem 帐户下工作” - 然后它将在任何网络打印机上显示为您的机器帐户 - 您的机器帐户是否有权访问任何这些打印机? 是的,我有权访问所有内容。 有,但是你的机器有吗? 【参考方案1】:

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

【讨论】:

【参考方案2】:

这里是如何开始:

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()
    

【讨论】:

【参考方案3】:

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

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

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

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

【讨论】:

如何在 .NET 中获取计算机名称

...名称【问题讨论】:重复问题link@Malachi,这个问题是关于Windows服务的。@Sam一个windows服务只是一个在后台运行的windows应用程序,所以实际上是一回事。@Malachi,是的,我知道你的意思。但是,我认为在此问 查看详情

如何在 .NET 中获取打印机信息?

】如何在.NET中获取打印机信息?【英文标题】:HowtogetPrinterInfoin.NET?【发布时间】:2010-09-2217:02:16【问题描述】:在标准PrintDialog中,有四个值与选定的打印机相关联:状态、类型、位置和注释。如果我知道打印机的名称,如何... 查看详情

在 Excel 中使用 VBA,如何获取服务器上所有 OLAP Cube 的名称?

】在Excel中使用VBA,如何获取服务器上所有OLAPCube的名称?【英文标题】:UsingVBAinExcel,howdoIgetthenamesofallOLAPCubesonaserver?【发布时间】:2015-03-0420:27:59【问题描述】:公司为我们的每个客户创建一个OLAP多维数据集数据库。我使用多... 查看详情

批处理或 PowerShell 命令获取 Windows 中所有打开的应用程序的名称

】批处理或PowerShell命令获取Windows中所有打开的应用程序的名称【英文标题】:BatchorPowerShellcommandtogetthenamesofalltheopenapplicationsinWindows【发布时间】:2014-02-1200:13:32【问题描述】:我们有一个命令行实用程序,可以在服务器上打开... 查看详情

如何在 Windows 中获取 COM 端口的友好名称?

】如何在Windows中获取COM端口的友好名称?【英文标题】:HowdoIgetthefriendlynameofaCOMportinWindows?【发布时间】:2008-11-2011:12:46【问题描述】:我有一个通过USB连接的GSM调制解调器。调制解调器创建2个串行端口。第一个自动连接到调... 查看详情

Microsoft Access 报表 - 如何在打印视图中循环浏览报表的所有页面?

】MicrosoftAccess报表-如何在打印视图中循环浏览报表的所有页面?【英文标题】:MicrosoftAccessReport-Howtocyclethroughallpagesofareportinprintview?【发布时间】:2016-02-2912:34:25【问题描述】:我有一份报告,其中列出了公司名称和该公司的详... 查看详情

如何在 C++ 中获取操作系统名称?

...C++中操作系统的名称。我尝试使用GetVersionExA,这是一种Windows方法。但是这种方法已被弃用。有没有办法恢复操作系统的名称,例如“Windows10Enterprise”,这要归功于标准c++或windows或Qt...?【问题讨论】:你读 查看详情

如何在 IOS 中获取所有名册名称

】如何在IOS中获取所有名册名称【英文标题】:HowcanIgetallrosternamewithpresenceinIOS【发布时间】:2013-11-1110:16:39【问题描述】:我正在iPhone中创建一个聊天应用程序,我想显示当前存在的花名册,但我得到了所有花名册的ID。NSXMLElem... 查看详情

如何在 iOS 二进制文件中打印所有 Objective-C 类的名称?

】如何在iOS二进制文件中打印所有Objective-C类的名称?【英文标题】:HowtoprintthenamesofallObjective-CclassesinaniOSbinary?【发布时间】:2019-12-0510:21:31【问题描述】:我想使用"otool"或"objcdump"打印在iOS二进制文件中找到的所有Objective-C类... 查看详情

如何在 asp.net 4.0 中获取所有网络打印机

】如何在asp.net4.0中获取所有网络打印机【英文标题】:Howtogetallnetworkprintersinasp.net4.0【发布时间】:2011-09-2809:26:16【问题描述】:请任何人帮助我获得所有网络打印机。我使用“System.Drawing.Printing.PrinterSettings.InstalledPrinters”将所... 查看详情

如何在非 Windows 操作系统的 WiX 安装程序中获取操作系统名称?

】如何在非Windows操作系统的WiX安装程序中获取操作系统名称?【英文标题】:HowtogetOperatingSystemNameinWiXInstallerinnonwindowsOperatingSystems?【发布时间】:2013-01-2312:59:40【问题描述】:最近我了解到我们可以使用Wine在Linux中执行为Windows... 查看详情

如何在私有数据库 CloudKit 中获取 RecordType 的所有名称

】如何在私有数据库CloudKit中获取RecordType的所有名称【英文标题】:HowtogetallnameofRecordTypeinaprivateDatabaseCloudKit【发布时间】:2015-02-0509:32:09【问题描述】:我想知道如何在CloudKit中的私有数据库中获取一个包含所有记录类型名称... 查看详情

获取煎茶触控平台名称

...:console.log(Ext.os.Name)为所有浏览器打印操作系统名称(“Windows”==>在windows机器中),但我想知道有没有办法获得当前的Platform("chrome","safari","firefox","windows","ios","ios-clas 查看详情

如何使用bat脚本获取电脑上所有windows服务的信息

如何使用bat脚本获取电脑上所有windows服务的信息,包括服务名称,显示名称、状态、启动类型以及可执行文件的路径;并将这些信息输出到一个txt文件,虽然我知道可以使用sc命令获取我想要的信息和>>输出到txt,但是我还... 查看详情

在变量中使用/Powershell 获取默认打印机共享名称

】在变量中使用/Powershell获取默认打印机共享名称【英文标题】:GetDefaultPrinterShareNamew/PowershellinVariable【发布时间】:2019-03-2120:40:22【问题描述】:我正在尝试将当前默认打印机存储在Powershell中的变量中,以便使用不同的打印服... 查看详情

如何在 Windows 11 中找到 Windows 产品名称?

】如何在Windows11中找到Windows产品名称?【英文标题】:HowcanIfindtheWindowsproductnameinWindows11?【发布时间】:2021-11-2607:56:47【问题描述】:昨天发布的Windows11几乎在所有地方都将自己报告为Windows10.0-RtlGetVersion说是10.0,如果你问VerifyV... 查看详情

如何在 laravel 中获取所有模型/迁移名称并添加单个新列

】如何在laravel中获取所有模型/迁移名称并添加单个新列【英文标题】:Howtogetallmodels/migrationsnamesinlaravelandaddsinglenewcolumn【发布时间】:2017-12-2016:12:23【问题描述】:我在数据库中有88个表,我需要在每个表中添加一个新列,一... 查看详情

如何在graphql中获取响应中的所有字段而不在查询中传递任何字段名称

】如何在graphql中获取响应中的所有字段而不在查询中传递任何字段名称【英文标题】:Howtogetallfieldsinaresponseingraphqlwithoutpassinganyfieldnamesinaquery【发布时间】:2021-05-1421:48:54【问题描述】:我正在使用golang构建一个graphql界面。我... 查看详情