基于AD组成员身份的设置打印机

我正在尝试为Active Directory创build一个login脚本,用于在客户端计算机上安装打印机。 我有一个基本的脚本,我们现在正在使用,下面列出,从我们的打印服务器安装一系列打印机到本地机器。 我引用了下面的一些想法,但是这并不能解决我所面临的一些挑战。

我留下了以下挑战,我似乎无法在网上find答案:

  • 每次脚本运行时防止计算机强制安装打印机。 理想情况下,它会检查打印机是否先安装,然后再次尝试安装。 没有这个,机器启动起来很慢。
  • 查询机器所属的计算机组成员身份,然后根据返回的成员/情况分配默认打印机。

在此先感谢您的帮助。

====================================
代码如下
====================================

On Error Resume Next PrintServer = "\\PrintServer\HP 4000 - Area1" set objNetwork = createobject("Wscript.Network") objNetwork.AddWindowsPrinterConnection(PrintServer) objNetwork.SetDefaultPrinter PrintServer PrintServer = "\\PrintServer\HP 4250 - Area2" set objNetwork = createobject("Wscript.Network") objNetwork.AddWindowsPrinterConnection(PrintServer) PrintServer = "\\PrintServer\HP 4350 - Area3" set objNetwork = createobject("Wscript.Network") objNetwork.AddWindowsPrinterConnection(PrintServer) PrintServer = "\\PrintServer\Dell 5200 - Area4" set objNetwork = createobject("Wscript.Network") objNetwork.AddWindowsPrinterConnection(PrintServer) PrintServer = "\\PrintServer\HP 4240 - Area5" set objNetwork = createobject("Wscript.Network") objNetwork.AddWindowsPrinterConnection(PrintServer) PrintServer = "\\PrintServer\HP 4240 - Area6" set objNetwork = createobject("Wscript.Network") objNetwork.AddWindowsPrinterConnection(PrintServer) PrintServer = "\\PrintServer\HP 4240 - Area7" set objNetwork = createobject("Wscript.Network") objNetwork.AddWindowsPrinterConnection(PrintServer) PrintServer = "\\PrintServer\HP 4240 - Area8" set objNetwork = createobject("Wscript.Network") objNetwork.AddWindowsPrinterConnection(PrintServer) PrintServer = "\\PrintServer\HP 4240 - Area9" set objNetwork = createobject("Wscript.Network") objNetwork.AddWindowsPrinterConnection(PrintServer) 

有很多方法来解决这个问题。 对于第2部分,我有一个查询组成员的VBScript,并返回一个错误级别,你可以在你的批处理中使用。 PowerShell也可以做到这一点。

这里是VBScript:

  'On Error Resume Next ' GroupCheck - GjM - returns errorlevel 1 if user is member of group, else returns 0 ' EX: groupcheck.vbs <groupname> ' ' option explicit Dim objADSysInfo, strUser, objGroup, objNetwork, strGroup, objUser, group, bMatched Dim strGroupToTest, objArgs set objArgs = wscript.arguments strGroupToTest = objargs(0) bMatched = False '************************ 'Make no changes below this point (unless you know why!) '************************ Set objADSysInfo = CreateObject("ADSystemInfo") strUser = objADSysInfo.UserName Set objUser = GetObject("LDAP://" & strUser) For Each group in objUser.memberOf Set objGroup = GetObject("LDAP://" & group) If trim(objGroup.CN) = trim(strGroupToTest) Then bMatched = True 'wscript.echo "Group match" Exit For End If Next If bMatched then 'wscript.echo "User in group" wscript.quit 1 else 'wscript.echo "User not in group" wscript.quit 0 End If 

这是一个批量程序来调用它:

 :: Test to see if we should run this script cscript /nologo Groupcheck.vbs "groupname" if %errorlevel% EQU 0 ( echo Failed groupcheck, exiting... Goto :EOF ) Else ( echo Passed group check.... 'map your printer here ) 

对于第1部分,我发现一些VBScript在这里枚举打印机。 寻找showprn文件。 还发现这个信息从命令行安装打印机可能比你所拥有的VBScript更容易。

当窗户看起来很困难的时候,你首先要问的问题是“为什么这么难,也许有一种不同的方式”。 在这种情况下,虽然您可以在login脚本中映射打印机,但您可能不应该这样做。 您可以使用组策略首选项将不需要脚本的人员应用到所需的组。

看一眼:

GP首选项:添加一个新的打印机,设置为默认

您应该使用组策略首选项的一个原因

如何使用组策略首选项dynamic地映射打印机与漫游configuration文件

如果可能,我会使用组策略添加打印机。 如果您必须使用vbs,下面是我们用来为特定组执行各种操作的vbscript(添加打印机,添加映射的驱动器等)。我们将此脚本设置为通过组策略为所有用户运行。

 Dim strComputerName Dim strUserName Dim strDomainName Dim wshShell Dim bForce Dim bUpdateProfile Dim adsobj bForce = true bUpdateProfile = true on error resume next Set wshNetwork = WScript.CreateObject( "WScript.Network" ) Set wshShell = WScript.CreateObject("WScript.Shell" ) do while wshNetwork.username = "" WScript.Sleep 250 loop strComputerName = wshNetwork.computerName strUserName = wshNetwork.userName strDomainName = wshNetwork.userDomain adspath = "WinNT://" & strDomainName & "/" & strUserName set adsobj = getobject(adspath) '========= MAKE CHANGES BELOW ========= cRemoveExistingDrives() '=== Map company-wide drives and printers cMapNetworkDrive "S:", "\\server\Shared$" cAddNetworkPrinter "\\server\HP3050" '=== Map Group Specific Drives and printers for each prop in adsobj.groups select case UCASE(prop.name) case "ACCOUNTING USERS" cAddNetworkPrinter "\\server\AcctngPrinter" wshNetwork.SetDefaultPrinter "AcctngPrinter" cMapNetworkDrive "X:", "\\server\accounting$" case "HR USERS" cAddNetworkPrinter "\\server\HRPrinter" wshNetwork.SetDefaultPrinter "HRPrinter" cMapNetworkDrive "Y:", "\\server\hr$" end select next '========= NO CHANGES BELOW THIS LINE =========== Sub cRemoveExistingDrives() on error resume next Dim colNetDrives Set colNetDrives = wshNetwork.EnumNetworkDrives If colNetDrives.Count = 0 then 'No drives Else For x = 0 to colNetDrives.count-1 Step 2 wshNetwork.RemoveNetworkDrive colNetDrives.Item(x), bForce, bUpdateProfile Next End If End Sub Sub cMapNetworkDrive(strDriveLetter, strPath) on error resume next wshNetwork.RemoveNetworkDrive strDriveLetter, bForce, bUpdateProfile wshNetwork.MapNetworkDrive strDriveLetter, strPath End Sub Sub cAddNetworkPrinter(strPath) on error resume next wshNetwork.AddWindowsPrinterConnection strPath End Sub 

我非常喜欢使用Kixtart 。 它具有类似于语法的C,您可以基于AD成员身份定制您的login脚本。

用Kixtart你可以做到;

 If InGroup("group1") $rc = AddPrinterConnection("\\server\printer_a") $rc = AddPrinterConnection("\\server\printer_b") $rc = AddPrinterConnection("\\server\printer_c") EndIf If InGroup("group2") $rc = AddPrinterConnection("\\server\printer_d") $rc = AddPrinterConnection("\\server\printer_e") $rc = AddPrinterConnection("\\server\printer_f") EndIf