Я пытаюсь создать сценарий входа в Active Directory, который будет использоваться для установки принтеров на клиентских компьютерах. У меня есть базовый скрипт, который мы сейчас используем, перечисленный ниже, который устанавливает серию принтеров на локальный компьютер с нашего сервера печати. Я сослался на после публикации для некоторых идей, но это не помогает решить некоторые из возникающих у меня проблем.
У меня остались следующие проблемы, на которые я не могу найти ответы в Интернете:
Заранее спасибо за вашу помощь.
====================================
Код, указанный ниже
====================================
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.
Когда кажется, что в окнах что-то сложно, первый вопрос, который вы должны задать себе, - «почему это так сложно, может быть, есть другой способ». В этом случае пока вы жестяная банка отображать принтеры в сценарии входа в систему, вероятно, не стоит. Вы можете использовать предпочтения групповой политики, чтобы применять примтеры к нужным группам без сценариев.
Взгляни на:
Предпочтения GP: Добавить новый принтер, установить по умолчанию
Одна из причин, по которой вам следует использовать предпочтения групповой политики
Мне очень нравится использовать Kixtart. Он имеет синтаксис, подобный C, и вы можете настраивать сценарии входа в систему на основе членства в AD.
С 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
Я бы использовал групповую политику для добавления принтеров, если это возможно. Если вам необходимо использовать 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