C# - 枚举远程计算机上的网络打印机(C# - Enumerating network print

2019-10-18 03:08发布

我写一个应用程序,以检查是否从打印服务器的网络打印机连接到一台远程机器,但有麻烦的遥控部分...我使用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”变量我们的实际打印服务器,并从“连接到‘共享’更改标志,那么代码成功返回从我们的打印服务器的所有共享打印机。

所有这一切正在作为我们的域管理员,所以应该希望不会是一个问题在这里。 有没有简单的东西我俯瞰,还是有某种的类型的机器的限制,我可以用打印服务器连接?

Answer 1:

所以我有一个解决办法,这似乎做的工作一点测试后不够好。 使用的打印机将被连接到机器在somepoint 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");

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



文章来源: C# - Enumerating network printers on remote machine