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);
}
}
}
私はこのようなことができると思っていました...これは、上にリストした2番目の記事リンクの例に似ています:
ManagementBaseObject retValue = mNewPrinter.InvokeMethod("PrintTestPage", null);
if (Convert.ToInt32(retValue["ReturnValue"]) == 0)
{
MessageBox.Show("Test page printed successfully.");
}
理論的には、少なくとも私の頭の中では、上記により、mNewPrinter
ManagementObject 変数を InvokeMethod に割り当てることで、PrintTestMethod がその特定のサーバー上のそのプリンターにリンクされることが保証されます。
ありがとう...