Назад | Перейти на главную страницу

Настройка принтеров на основе членства в группе AD

Я пытаюсь создать сценарий входа в 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