如何在 Windows 服务中获取所有打印机名称?
Posted
技术标签:
【中文标题】如何在 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>
【讨论】:
以上是关于如何在 Windows 服务中获取所有打印机名称?的主要内容,如果未能解决你的问题,请参考以下文章