2013-05-27 33 views
0

首先,我很抱歉我的英語。添加與VBS的本地打印機端口

我有一個關於Windows WMI的問題,以及如何將本地端口添加到共享打印機。我有此腳本:

Set objWMIService = GetObject("winmgmts:") 
Set objNewPort = objWMIService.Get _ 
("Win32_TCPIPPrinterPort").SpawnInstance_ 
objNewPort.Name = "Ricoh3300C" 
objNewPort.Protocol = 2 
objNewPort.HostAddress = "XXX.XXX.X.XXX" 
objNewPort.PortNumber = "9100" 
objNewPort.SNMPEnabled = False 
objNewPort.Put_ 

有了這個,我可以添加與IP地址的打印機,但我想補充的Samba服務器的打印機中包含「\\ XXX.XXX.X.XXX \ printerColor」地址。我在谷歌上花了很多時間試圖找到一個腳本,並且我看到的所有內容都是針對TCPIP端口的。我不想這樣做,但在當地的港口。

我試圖用prnadmin.dll使用這個腳本,沒有運氣。

function PortAdd(strPort, portType) 

    on error resume next 

    dim oMaster 
    dim oPort 
    dim iResult 

    set oMaster = CreateObject("PrintMaster.PrintMaster.1") 
    set oPort = CreateObject("Port.Port.1") 

    iResult = kErrorFailure 

    oPort.PortName = strPort 
    oPort.PortType = portType 

    oMaster.PortAdd oPort 

    if Err = 0 then 

     iResult = kErrorSuccess 

    else 

     wscript.echo "Error: 0x" & Hex(Err.Number) & ". " & Err.Description 

    end if 

    PortAdd = iResult 

end function 

我得到這個錯誤:

Error: 0x1A8. Se requiere un objeto 

英語就像

Error: 0x1A8. An object is required 

我怎樣才能解決這個錯誤,或者我可以用什麼腳本添加本地端口?提前致謝。

我忘了說我想用沒有管理員權限的普通用戶來做。第一個腳本在那個用戶中工作正常,但是對於TCPIP。

+0

我不確定添加端口是否可以用普通用戶憑證完成。請告知在哪一行發生VBS錯誤。 – Tomalak

+0

刪除'On Error Resume Next'以查看錯誤發生在哪一行。 –

+0

我發現第二個腳本給出了這個錯誤,因爲需要管理員帳戶(我管理員帳戶,但我沒有在W7作爲管理員運行),但第一個腳本添加一個TCPIP端口沒有問題在普通帳戶,我可以添加具有該端口的打印機沒有問題,但我想使用Cups打印機服務器來管理所有打印機,我需要創建一個指向服務器網絡地址的本地端口。所有的問題是因爲我想爲打印機使用自定義名稱,如果我添加打印機作爲網絡打印機,我會得到一個名稱,如「Ricoh3300C-PS在ServerName」,並且我想要「Ricoh 3300 Color」例如。 –

回答

1

考慮使用XcvData,例如,

private static void AddPort(string portName) 
    { 
     var def = new PRINTER_DEFAULTS(); 

     def.pDatatype = null; 
     def.pDevMode = IntPtr.Zero; 
     def.DesiredAccess = 1; //Server Access Administrator 

     IntPtr hPrinter = IntPtr.Zero; 

     int n = OpenPrinter(",XcvMonitor Local Port", ref hPrinter, def); 
     if (n == 0) 
      throw new Exception("Local Port monitor has not been opened."); 

     if (!portName.EndsWith("\0")) 
      portName += "\0"; 

     // .NET strings are formed by 2-byte characters 
     var size = (uint) (portName.Length*2); 

     IntPtr portPtr = Marshal.AllocHGlobal((int) size); 
     Marshal.Copy(portName.ToCharArray(), 0, portPtr, portName.Length); 

     uint needed, xcvResult; 

     XcvData(hPrinter, "AddPort", portPtr, size, IntPtr.Zero, 0, out needed, out xcvResult); 

     ClosePrinter(hPrinter); 
     Marshal.FreeHGlobal(portPtr); 
    } 

    [DllImport("winspool.drv", EntryPoint = "XcvDataW", SetLastError = true)] 
    private static extern bool XcvData(
     IntPtr hXcv, 
     [MarshalAs(UnmanagedType.LPWStr)] string pszDataName, 
     IntPtr pInputData, 
     uint cbInputData, 
     IntPtr pOutputData, 
     uint cbOutputData, 
     out uint pcbOutputNeeded, 
     out uint pwdStatus);