将默认打印机设置为更改名称的打印机
Posted
技术标签:
【中文标题】将默认打印机设置为更改名称的打印机【英文标题】:Set default printer to printer that changes names 【发布时间】:2013-05-28 16:03:38 【问题描述】:我有一个用户希望在她登录到我们的终端服务器时将她的本地桌面打印机设置为默认打印机。我为此创建了一个简单的登录脚本
Set WSHNetwork = CreateObject("WScript.Network")
WSHNetwork.SetDefaultPrinter "HP LaserJet 6P (redirected 3)"
问题在于,无论出于何种原因,打印机名称都会不断更改最后一位数字。 HP LaserJet 6P(重定向)、HP LaserJet 6P(重定向 2) 和 HP LaserJet 6P(重定向 1)打印机出现了。
我不太了解 VBScript,无法解释这些变化,希望有人能帮助我找出正在使用的名称的哪个变体,并将其设置为默认打印机。
我找到了一个可能有帮助的 sn-p,但我不确定如何正确实施它。
Function printerExists(str)
printerExists = False
Dim objWMIService
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Dim colPrinters
Set colPrinters = objWMIService.ExecQuery("Select * From Win32_Printer")
Dim objPrinter
For Each objPrinter In colPrinters
If objPrinter.Name = str Then
printerExists = True
Exit For
End If
Next
End Function
【问题讨论】:
我建议修复名称更改而不是尝试解决它。 我已经调查过了,但显然客户端打印机是动态添加到终端服务器的。因此,取决于有多少其他本地打印机通过 RDP 会话连接到终端服务器,决定了打印机重命名为什么。除了共享她的打印机然后将其添加到终端服务器然后将共享设置为她的默认值(然后不应该更改)之外,我找不到任何解决方法。这实际上可能是比这个登录脚本更好的解决方案。嗯... 【参考方案1】:如果您无法解决更改名称的问题,您应该能够解决它。
从循环结构开始。在这种情况下,我们将使用 for 循环:
For i = 0 To 5
'things happen
next
我选择将数字限制为 5 或更低,但可以根据您的需要进行更改。 然后我们需要一个方法来包含打印机名称的所有可能性。如果所有 te 名称都包含一个不带任何特殊代码的数字,但这里我们将使用 if 语句表示如果该数字为 0,则不包含该数字。
If i = 0 Then
testPrinter = "HP LaserJet 6P (redirected)"
Else
testPrinter = "HP LaserJet 6P (redirected " & i & ")"
End If
然后,我们将利用您提供的printerExists函数来判断打印机是否存在,如果存在则设置默认打印机。
If printerExists(testprinter) = True Then
WSHNetwork.SetDefaultPrinter testPrinter
WScript.Quit
End If
为了完成脚本,我们将所有部分放在一起并添加printerExists 函数。最终的脚本最终看起来像这样:
Set WSHNetwork = CreateObject("WScript.Network")
i = 1 : testPrinter = "HP LaserJet 6P (redirected)"
For i = 0 To 5
If i = 0 Then
testPrinter = "HP LaserJet 6P (redirected)"
Else
testPrinter = "HP LaserJet 6P (redirected " & i & ")"
End If
If printerExists(testprinter) = True Then
WSHNetwork.SetDefaultPrinter testPrinter
WScript.Quit
End If
next
Function printerExists(str)
printerExists = False
Dim objWMIService
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Dim colPrinters
Set colPrinters = objWMIService.ExecQuery("Select * From Win32_Printer")
Dim objPrinter
For Each objPrinter In colPrinters
If objPrinter.Name = str Then
printerExists = True
Exit For
End If
Next
End Function
请记住字符串比较,例如函数中使用的比较:
If objPrinter.Name = str Then
区分大小写。
【讨论】:
【参考方案2】:您可以更改该代码以查找包含名称第一部分的任何内容,"HP LaserJet 6P (redirected"
:
Dim WSHNetwork
Dim objWMIService
Dim colPrinters
Dim objPrinter
Set WSHNetwork = CreateObject("WScript.Network")
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colPrinters = objWMIService.ExecQuery("Select * From Win32_Printer")
For Each objPrinter In colPrinters
If InStr(objPrinter.Name, "HP LaserJet 6P (redirected") Then
WSHNetwork.SetDefaultPrinter objPrinter.Name
Exit For
End If
Next
Set WSHNetwork = nothing
Set objWMIService = nothing
Set colPrinters = nothing
【讨论】:
【参考方案3】:打印机的名称是动态的,因为它通过终端服务器或远程桌面连接从本地工作站的打印机列表进行重定向。如果其他人的打印机与上面代码中被测试的打印机型号相同,那么其他人的打印机可能会被错误地设置为这个人的默认值。
RDP 连接或终端服务器总是会尝试将本地默认打印机设置为重定向的默认打印机,因此要将“HP Laserjet 6P(重定向)”设置为您的默认设置,您必须将“HP Laserjet 6P”设置为本地工作站是您连接到服务器之前的默认设置。
【讨论】:
以上是关于将默认打印机设置为更改名称的打印机的主要内容,如果未能解决你的问题,请参考以下文章