我使用 System.Management 命名空间和 WMI 在远程服务器上安装打印机/端口。安装打印机/端口后,我想打印一个测试页,捕获打印测试页是否(理论上)成功,并将结果显示给用户。在打印测试页之前,我已经完成了所有工作。
我已经看过这篇文章,以及这篇文章,关于这个主题,但似乎都没有做到这一点,因为我没有看到如何将它们应用于我刚刚安装的当前打印机。
无论如何,这是我用来安装打印机的代码(端口代码类似,可能没有必要......还有我用来登录远程服务器的附加代码,但只要你知道我正在创建一个附加了 ConnectionOptions 对象的 ManagementScope 对象,也没有理由显示该代码):
foreach (Printers p in lstPrinters)
{
search = printerQuery + "'" + p.PrinterName + "'";
query = new SelectQuery(search);
try
{
using (var searcher = new ManagementObjectSearcher(scope, query))
{
ManagementObjectCollection printers = searcher.Get();
ObjectGetOptions oPrinterOptions =
new ObjectGetOptions(null, TimeSpan.MaxValue, true);
ManagementPath mPathPrinter =
new ManagementPath("Win32_Printer");
ManagementClass mClassPrinter =
new ManagementClass(scope, mPathPrinter, oPrinterOptions);
ManagementObject mNewPrinter = mClassPrinter.CreateInstance();
mNewPrinter["Comment"] = p.Comment;
mNewPrinter["DeviceID"] = p.DeviceID;
mNewPrinter["DriverName"] = p.DriverName;
mNewPrinter["Location"] = p.Location;
mNewPrinter["Network"] = p.Network;
mNewPrinter["PortName"] = p.PortName;
mNewPrinter["Shared"] = p.Shared;
mNewPrinter["ShareName"] = p.ShareName;
// If no ports are returned, add the port.
// Otherwise, update the current port object.
PutOptions poPutPrinter = new PutOptions();
poPutPrinter.Type = PutType.UpdateOrCreate;
poPutPrinter.UseAmendedQualifiers = true;
mNewPrinter.Put(poPutPrinter);
}
}
}
我以为我可以做这样的事情......这类似于我上面列出的第二篇文章链接中的一个例子:
ManagementBaseObject retValue = mNewPrinter.InvokeMethod("PrintTestPage", null);
if (Convert.ToInt32(retValue["ReturnValue"]) == 0)
{
MessageBox.Show("Test page printed successfully.");
}
理论上,至少在我的脑海中,以上将确保通过将我的mNewPrinter
ManagementObject 变量分配给 InvokeMethod,PrintTestMethod 链接到该特定服务器上的该打印机。
谢谢...