1

我正在编写一个应用程序来检查来自打印服务器的网络打印机是否连接到远程机器,但是远程部分有问题......我正在使用 System.Printing 并通过远程主机名/IP 地址传递“compID”变量。我遇到的问题是代码总是在我的本地机器而不是远程机器上返回网络打印机:

EnumeratedPrintQueueTypes[] compEnumerationFlags = { EnumeratedPrintQueueTypes.Connections };

PrintServer compPrinters = new PrintServer("\\\\" + compID);
PrintQueueCollection printQueuesOnComputer = compPrinters.GetPrintQueues(compEnumerationFlags);

List<string> compPrinterList = new List<string>();

foreach (PrintQueue printer in printQueuesOnComputer)
    {
        compPrinterList.Add(printer.Name);
    }

string csv = string.Join("\n", compPrinterList.ToArray());
Microsoft.VisualBasic.Interaction.MsgBox(csv);

原谅最后的混乱点,但这对我来说只是一种快速而肮脏的方式来看看目前的结果。

奇怪的是,如果我将“compID”变量更改为我们的实际打印服务器并将标志从“Connections”更改为“Shared”,那么代码会成功从我们的打印服务器返回所有共享打印机。

所有这些都是在我们的域上以管理员身份运行的,所以这应该不是问题。我是否忽略了一些简单的事情,或者我可以使用 PrintServer 连接的机器类型是否存在某种限制?

4

1 回答 1

0

所以我有一个解决方法,经过一些测试后似乎可以很好地完成这项工作。打印机将在某个时候使用rundll32 printui.dll,PrintUIEntry /ga /c\\%computername% /n\\%printserver%\%printername%

在我导入的应用程序中printui.dll

[DllImport("printui.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        private static extern void PrintUIEntryW(IntPtr hwnd, IntPtr hinst, string lpszCmdLine, int nCmdShow);

然后稍后我使用/ge远程机器上的标志列出所有每台机器的连接,将其输出到临时文本文件,然后检查打印机名称是否包含在文本文件中:

PrintUIEntryW(IntPtr.Zero, IntPtr.Zero, "/c \\\\" + compID + " /ge /q /f c:\\temp\\printers.txt", 0);

string file = File.ReadAllText("c:\\temp\\printers.txt");
if (file.Contains(printerID))
{
    exist = true;
}
File.Delete("c:\\temp\\printers.txt");

我知道这可能不是最好的解决方法,但它似乎在我所在的环境中工作,所以我提供这个作为答案。

于 2013-05-07T13:01:29.990 回答