0

我使用 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.");
}

理论上,至少在我的脑海中,以上将确保通过将我的mNewPrinterManagementObject 变量分配给 InvokeMethod,PrintTestMethod 链接到该特定服务器上的该打印机。

谢谢...

4

1 回答 1

0

我想我使用以下方法解决了我自己的问题:

ManagementBaseObject outParams =
    mNewPrinter.InvokeMethod("PrintTestPage", null, null);

if (Convert.ToInt32(outParams["returnValue"]) == 0)
{
    MessageBox.Show("Test page printed successfully.");
}

出于某种原因,我不得不将额外的 null 添加到mNewPrinter.InvokeMethod("PrintTestPage, null). 否则,它会返回错误。

于 2013-05-22T12:29:00.700 回答