Vbscript 使用VBS添加本地打印机端口
首先,我为我的英语感到抱歉 我有一个关于windows WMI以及如何将本地端口添加到共享打印机的问题。我有以下脚本: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
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);