Vbscript 使用VBS添加本地打印机端口

Vbscript 使用VBS添加本地打印机端口,vbscript,Vbscript,首先,我为我的英语感到抱歉 我有一个关于windows WMI以及如何将本地端口添加到共享打印机的问题。我有以下脚本: Set objWMIService = GetObject("winmgmts:") Set objNewPort = objWMIService.Get _ ("Win32_TCPIPPrinterPort").SpawnInstance_ objNewPort.Name = "Ricoh3300C" objNewPort.Protocol = 2 objNewPort.Ho

首先,我为我的英语感到抱歉

我有一个关于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”的打印机。我在google上花了很多时间试图找到一个脚本,我所看到的只是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


我不确定是否可以使用普通用户凭据添加端口。请告诉VBS错误发生在哪一行。删除错误时的
继续下一步
以查看错误发生在哪一行。我发现第二个脚本给出该错误是因为需要管理员帐户(我有管理员帐户,但我在W7中没有以管理员身份运行),但第一个脚本添加了一个TCPIP端口,在正常帐户中没有问题,我可以添加带有该端口的打印机,但我想使用Cups打印机服务器来管理所有打印机,我需要创建一个指向服务器网络地址的本地端口。所有的问题都是因为我想为打印机使用一个自定义名称,如果我将该打印机添加为网络打印机,我会得到一个类似“Ricoh3300C PS in ServerName”的名称,例如我想要“Ricoh 3300 Color”。
    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);