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

时间:2013-05-27 15:58:06

标签: vbscript

首先,我很抱歉我的英语。

我有一个关于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。

1 个答案:

答案 0 :(得分: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);