2013-04-16 13 views
6

プログラムで管理された参照やヒントを参照すると、ManagementClassなどを使用してネットワークプリンタをローカルコンピュータに追加できます。しかし、私はこれを行う上で実際のチュートリアルを見つけることができませんでした。ManagementClassを使用してローカルコンピュータにプリンタを追加する

誰かがこれを行うために実際にManagementClassを使用しましたか?私はこれをやっている

var connectionOption = new ConnectionOption(); 
var mgmScope = new ManagementScope("root\cimv2",connectionOptions); 

var printerClass = new ManagementClass(mgmScope, new ManagementPath("Win32_Printer"),null); 
var printerObj = printerClass.CreateInstance(); 

printerObj["DeviceID"] = prnName;  // 
printerObj["DriverName"] = drvName; // full path to driver 
printerObj["PortName"] = "myTestPort:"; 

var options = new PutOptions {Type = PutType.UpdateOrCreate}; 
printerObj.Put(options); 

このすべては、このことについて、私は、私が行方不明ですかを把握カントエラー「一般エラー」

.....任意のヘルプや思考を作成しているん感謝されます。

私は必要なプリンタは、プリントサーバーに関連付けられていないとき、私が必要...私はより良い私がやろうとしていますかを説明する必要があると思う: TCPIP生のポートを作成し、 は/ TCPを介してプリンタを接続しますip、 ドライバをインストールします。 はオプションでデフォルト設定です。

私はWMIが基本的にこのすべてを処理できると思っていましたが、そうは思われませんでした。

ありがとうございました!

答えて

1

私は2ステッパーを行うになってしまった...

最初のオフ発射するコマンドラインを構築する:

rundll32.exe printui.dll,PrintUIEntry /if /b "test" /f x2DSPYP.inf /r 10.5.43.32 /m "845 PS" 

を次にスポーン:

public static string ShellProcessCommandLine(string cmdLineArgs,string path) 
    { 
     var sb = new StringBuilder(); 
     var pSpawn = new Process 
     { 
      StartInfo = 
       { 
        WorkingDirectory = path, 
        FileName = "cmd.exe", 
        CreateNoWindow = true, 
        Arguments = cmdLineArgs, 
        RedirectStandardInput = true, 
        RedirectStandardOutput = true, 
        UseShellExecute = false 
       } 
     }; 
     pSpawn.OutputDataReceived += (sender, args) => sb.AppendLine(args.Data); 
     pSpawn.Start(); 
     pSpawn.BeginOutputReadLine(); 
     pSpawn.WaitForExit(); 

     return sb.ToString(); 
    } 

これはうまくいくと思われます。理想的な方法ではありませんが、プリントサーバー上にないプリンタでは、ジョブを実行するようです。

9

WMI Win32_Printerクラスは、AddPrinterConnection〜 というローカルプリンタのリストにネットワークプリンタを追加するメソッドを提供します。以下のコード は、Win32_Printerクラスを使用してネットワークプリンタを接続する方法を示しています。

AddPrinterConnectionは、特定の条件下では、リモートプリンタに接続するために に失敗します。下の例では、ほとんどのエラーケースのうち を挙げています。これを行うために

using (ManagementClass win32Printer = new ManagementClass("Win32_Printer")) 
{ 
    using (ManagementBaseObject inputParam = 
    win32Printer.GetMethodParameters("AddPrinterConnection")) 
    { 
    // Replace <server_name> and <printer_name> with the actual server and 
    // printer names. 
    inputParam.SetPropertyValue("Name", "\\\\<server_name>\\<printer_name>"); 

    using (ManagementBaseObject result = 
     (ManagementBaseObject)win32Printer.InvokeMethod("AddPrinterConnection", inputParam, null)) 
    { 
     uint errorCode = (uint)result.Properties["returnValue"].Value; 

     switch (errorCode) 
     { 
     case 0: 
      Console.Out.WriteLine("Successfully connected printer."); 
      break; 
     case 5: 
      Console.Out.WriteLine("Access Denied."); 
      break; 
     case 123: 
      Console.Out.WriteLine("The filename, directory name, or volume label syntax is incorrect."); 
      break; 
     case 1801: 
      Console.Out.WriteLine("Invalid Printer Name."); 
      break; 
     case 1930: 
      Console.Out.WriteLine("Incompatible Printer Driver."); 
      break; 
     case 3019: 
      Console.Out.WriteLine("The specified printer driver was not found on the system and needs to be downloaded."); 
      break; 
     } 
    } 
    } 
} 
+0

サーバ名を知りませんが、IPアドレスしか持たない時があります...これは、インストールする方法が必要であることを意味します。ドライバ。私は捨てられた種類の葉を私に与えた。 – Kixoka

+0

@Kevin:サーバー名の代わりにIPを使用することもできます。サーバー名をIPアドレスに置き換えてください。上記のコードは、IPアドレスでも動作します。 – Hans

+0

ok ..試してみてください! :) – Kixoka

0

私はその問題でほぼ一週間を過ごしました!私の目標はもう少し複雑で、SharePoint Add-Inによって呼び出されるWCFサービスにC#コードをラップしたいのですが、このWCFサービスはクライアントをリモートで呼び出してプリンタをインストールする必要があります。 WMIで頑張りました。

$printerPort = "IP_"+ $printerIP 
$printerName = "Xerox WorkCentre 6605DN PCL6" 
Add-PrinterPort -Name $printerPort -PrinterHostAddress $printerIP 
Add-PrinterDriver -Name $printerName 
Add-Printer -Name $printerName -DriverName $printerName -PortName $printerPort 

本当にトリッキーな部分の名前を知っている:平均時間で は、私は本当に最も単純には、PowerShellのバリアントを(ポートを作成するために、最初の必要があります)ソリューションをRundll32の使用するために管理し、またやりましたプリンタでは、INFファイル内の文字列と一致する必要があります。

しかし、C#ソリューションに戻る:私は、属性としてprinterName、printerIP、およびmanagementScopeを持つクラスを作成しました。そして、driverName = printerName

private string PrinterPortName 
    { 
     get { return "IP_" + printerIP; } 
    } 

    private void CreateManagementScope(string computerName) 
    { 
     var wmiConnectionOptions = new ConnectionOptions(); 
     wmiConnectionOptions.Impersonation = ImpersonationLevel.Impersonate; 
     wmiConnectionOptions.Authentication = AuthenticationLevel.Default; 
     wmiConnectionOptions.EnablePrivileges = true; // required to load/install the driver. 
     // Supposed equivalent to VBScript objWMIService.Security_.Privileges.AddAsString "SeLoadDriverPrivilege", True 

     string path = "\\\\" + computerName + "\\root\\cimv2"; 
     managementScope = new ManagementScope(path, wmiConnectionOptions); 
     managementScope.Connect(); 
    } 

    private bool CheckPrinterPort() 
    { 
     //Query system for Operating System information 
     ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_TCPIPPrinterPort"); 
     ManagementObjectSearcher searcher = new ManagementObjectSearcher(managementScope, query); 

     ManagementObjectCollection queryCollection = searcher.Get(); 
     foreach (ManagementObject m in queryCollection) 
     { 
      if (m["Name"].ToString() == PrinterPortName) 
       return true; 
     } 
     return false; 
    } 

    private bool CreatePrinterPort() 
    { 
     if (CheckPrinterPort()) 
      return true; 

     var printerPortClass = new ManagementClass(managementScope, new ManagementPath("Win32_TCPIPPrinterPort"), new ObjectGetOptions()); 
     printerPortClass.Get(); 
     var newPrinterPort = printerPortClass.CreateInstance(); 
     newPrinterPort.SetPropertyValue("Name", PrinterPortName); 
     newPrinterPort.SetPropertyValue("Protocol", 1); 
     newPrinterPort.SetPropertyValue("HostAddress", printerIP); 
     newPrinterPort.SetPropertyValue("PortNumber", 9100); // default=9100 
     newPrinterPort.SetPropertyValue("SNMPEnabled", false); // true? 
     newPrinterPort.Put(); 
     return true; 
    } 

    private bool CreatePrinterDriver(string printerDriverFolderPath) 
    { 
     var endResult = false; 
     // Inspired from https://msdn.microsoft.com/en-us/library/aa384771%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396 
     // and http://microsoft.public.win32.programmer.wmi.narkive.com/y5GB15iF/adding-printer-driver-using-system-management 
     string printerDriverInfPath = IOUtils.FindInfFile(printerDriverFolderPath); 
     var printerDriverClass = new ManagementClass(managementScope, new ManagementPath("Win32_PrinterDriver"), new ObjectGetOptions());    
     var printerDriver = printerDriverClass.CreateInstance(); 
     printerDriver.SetPropertyValue("Name", driverName); 
     printerDriver.SetPropertyValue("FilePath", printerDriverFolderPath); 
     printerDriver.SetPropertyValue("InfName", printerDriverInfPath); 

     // Obtain in-parameters for the method 
     using (ManagementBaseObject inParams = printerDriverClass.GetMethodParameters("AddPrinterDriver")) 
     { 
      inParams["DriverInfo"] = printerDriver; 
      // Execute the method and obtain the return values.    

      using (ManagementBaseObject result = printerDriverClass.InvokeMethod("AddPrinterDriver", inParams, null)) 
      { 
       // result["ReturnValue"] 
       uint errorCode = (uint)result.Properties["ReturnValue"].Value; // or directly result["ReturnValue"] 
       // https://msdn.microsoft.com/en-us/library/windows/desktop/ms681386(v=vs.85).aspx 
       switch (errorCode) 
       { 
        case 0: 
         //Trace.TraceInformation("Successfully connected printer."); 
         endResult = true; 
         break; 
        case 5: 
         Trace.TraceError("Access Denied."); 
         break; 
        case 123: 
         Trace.TraceError("The filename, directory name, or volume label syntax is incorrect."); 
         break; 
        case 1801: 
         Trace.TraceError("Invalid Printer Name."); 
         break; 
        case 1930: 
         Trace.TraceError("Incompatible Printer Driver."); 
         break; 
        case 3019: 
         Trace.TraceError("The specified printer driver was not found on the system and needs to be downloaded."); 
         break; 
       } 
      } 
     } 
     return endResult; 
    } 

    private bool CreatePrinter() 
    { 
     var printerClass = new ManagementClass(managementScope, new ManagementPath("Win32_Printer"), new ObjectGetOptions()); 
     printerClass.Get(); 
     var printer = printerClass.CreateInstance(); 
     printer.SetPropertyValue("DriverName", driverName); 
     printer.SetPropertyValue("PortName", PrinterPortName); 
     printer.SetPropertyValue("Name", printerName); 
     printer.SetPropertyValue("DeviceID", printerName); 
     printer.SetPropertyValue("Location", "Front Office"); 
     printer.SetPropertyValue("Network", true); 
     printer.SetPropertyValue("Shared", false); 
     printer.Put(); 
     return true; 
    } 


    private void InstallPrinterWMI(string printerDriverPath) 
    { 
     bool printePortCreated = false, printeDriverCreated = false, printeCreated = false; 
     try 
     {     
      printePortCreated = CreatePrinterPort(); 
      printeDriverCreated = CreatePrinterDriver(printerDriverPath); 
      printeCreated = CreatePrinter(); 
     } 
     catch (ManagementException err) 
     { 
      if (printePortCreated) 
      { 
       // RemovePort 
      } 
      Console.WriteLine("An error occurred while trying to execute the WMI method: " + err.Message); 
     } 
    } 

最後にドライバをインストールしてください。クリーンなWindows上で動作する場合、私はまださらなるテストが必要です。私のテスト中に多くのドライバをインストール/アンインストールしましたか?

関連する問題