2013-05-27 34 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);