1

Тема: VBScript: подключение сетевых принтеров с использованием AD

Скрипт удаляет все сетевые принтеры, затем находит текущего пользователя в Active Directory, считывает из указанного поля Active Directory список принтеров и пытается подключить их.
Список принтеров должен храниться в одном поле Active Directory, разделитель - перевод строки. Принтеры должны храниться в формате "\\serverName\PrinterName". Принтером по умолчанию назначается первый принтер в списке.
Скрипт ведёт лог по указанному пути (перезаписывается при каждом запуске).

Option Explicit
On Error Resume Next

Dim Domain, Field, LogPath ' настройки
Dim WshNetwork, AdoConn, FSO ' объекты серверов автоматизации
Dim TextStream ' объект файлового потока лога
Dim Printers ' коллекция установленных принтеров
Dim i ' счётчик, флаг
Dim PrnName ' имя установленного принтера
Dim Query ' текст запроса к Active Directory
Dim Rs ' объект рекордсета
Dim ObjectOfAD ' объект текущего пользователя в Active Directory
Dim Info ' список принтеров, хранящихся в Active Directory (строка)
Dim PrinterPath ' имя устанавливаемого принтера

' => НАСТРОЙКИ ====================================================================================
Domain = "DC=mydomain,DC=ru" ' имя домена
Field = "info" ' имя поля Active Directory, в котором хранится список принтеров
LogPath = "C:\PrintersConnection.log" ' путь к файлу лога
' <= НАСТРОЙКИ ====================================================================================

Set FSO = CreateObject("Scripting.FileSystemObject")
Set TextStream = FSO.OpenTextFile(LogPath, 2, True)

Set WshNetwork = CreateObject("WScript.Network")
Set Printers = WshNetwork.EnumPrinterConnections
i = 0
While i <= Printers.Count-1
    PrnName = Printers.Item(i+1)
    If Left(PrnName, 2) = "\\" Then ' только сетевые принтеры
        WshNetwork.RemovePrinterConnection PrnName
        If Err.Number Then
            TextStream.WriteLine "не удалось удалить сетевой принтер: " & PrnName
            TextStream.WriteLine Err.Number & " " & Err.Description
            Err.Clear
        Else
            TextStream.WriteLine "удалён сетевой принтер: " & PrnName
        End If
    Else
        TextStream.WriteLine "обнаружен несетевой принтер: " & PrnName
    End If
    i = i+2
Wend
Set AdoConn = CreateObject("ADODB.Connection")
If Err.Number Then
    TextStream.WriteLine "не удалось создать объект ADODB.Connection"
    TextStream.WriteLine Err.Number & " " & Err.Description
    Err.Clear
End If
AdoConn.Provider = "ADSDSOObject"
AdoConn.Open "Active Directory Provider"
Query = "SELECT ADsPath FROM 'LDAP://" & Domain & "' WHERE sAMAccountName='" & WshNetwork.UserName & "'"
Set Rs = AdoConn.Execute(Query)
If Err.Number Then
    TextStream.WriteLine "не удалось выполнить запрос к Active Directory: " & Query
    TextStream.WriteLine Err.Number & " " & Err.Description
    Err.Clear
End If
If Not Rs.EOF Then
    Set ObjectOfAD = GetObject(Rs.Fields(0).Value)
    Info = ObjectOfAD.Get(Field)
    i = True
    If Len(Info) = 0 Then
        TextStream.WriteLine "поле Active Directory '" & Field & "' пусто"
    End If
    For Each PrinterPath In Split(Info, vbCrLf)
        WshNetwork.AddWindowsPrinterConnection PrinterPath
        If Err.Number Then
            TextStream.WriteLine "не удалось подключить принтер: " & PrinterPath
            TextStream.WriteLine Err.Number & " " & Err.Description
            Err.Clear
        Else
            TextStream.WriteLine "подключён принтер: " & PrinterPath
        End If
        If i Then
            WshNetwork.SetDefaultPrinter PrinterPath
            If Err.Number Then
                TextStream.WriteLine "не удалось назначить принтером по умолчанию: " & PrinterPath
                TextStream.WriteLine Err.Number & " " & Err.Description
                Err.Clear
            Else
                TextStream.WriteLine "принтер назначен принтером по умолчанию: " & PrinterPath
                i = False
            End If
        End If
    Next
Else
    TextStream.WriteLine "запрос к Active Directory вернул пустой результат: " & Query
End If
AdoConn.Close
TextStream.Close
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

2

Re: VBScript: подключение сетевых принтеров с использованием AD

Скрипт, "обратный" предыдущему.

Скрипт находит все подключённые сетевые принтеры, затем находит текущего пользователя в Active Directory и записывает в указанное поле Active Directory список принтеров.
Список принтеров будет храниться в одном поле Active Directory, разделитель - перевод строки. Принтеры хранятся в формате "\\serverName\PrinterName". Принтер по умолчанию записывается как первый принтер в списке.
Скрипт ведёт лог по указанному пути (перезаписывается при каждом запуске).

Option Explicit
On Error Resume Next

Dim Domain, Field, LogPath ' настройки
Dim strPrinters ' строка с принтерами для записи в Active Directory
Dim WshNetwork, FSO, WMI, AdoConn ' объекты серверов автоматизации
Dim TextStream ' объект файлового потока лога
Dim colPrinters ' коллекция принтеров WMI
Dim Prn ' при переборе коллекции принтеров WMI объект принтера по умолчанию
Dim DefaultPrn ' имя принтера по умолчанию
Dim Printers ' коллекция установленных принтеров
Dim i ' счётчик
Dim PrnName ' имя установленного принтера
Dim Query ' текст запроса к Active Directory
Dim Rs ' объект рекордсета
Dim ObjectOfAD ' объект текущего пользователя в Active Directory

' => НАСТРОЙКИ ====================================================================================
Domain = "DC=mydomain,DC=ru" ' имя домена
Field = "info" ' имя поля Active Directory, в котором хранится список принтеров
LogPath = "C:\PrintersConnection.log" ' путь к файлу лога
' <= НАСТРОЙКИ ====================================================================================

Set FSO = CreateObject("Scripting.FileSystemObject")
Set TextStream = FSO.OpenTextFile(LogPath, 2, True)

strPrinters = ""

' чтение установленных принтеров
Set WMI = GetObject("winmgmts:\\.\Root\CIMV2")
If Err.Number Then
    TextStream.WriteLine "не удалось подключиться к WMI"
    Err.Clear
End If
Set colPrinters = WMI.ExecQuery("SELECT Caption FROM Win32_Printer WHERE Default=TRUE")
DefaultPrn = ""
If Err.Number Then
    TextStream.WriteLine "не удалось выполнить запрос SELECT Caption FROM Win32_Printer WHERE Default=TRUE"
    Err.Clear
Else
    For Each Prn In colPrinters
        strPrinters = strPrinters & Prn.Caption
        DefaultPrn = Prn.Caption
        Exit For
    Next
End If

Set WshNetwork = CreateObject("WScript.Network")
Set Printers = WshNetwork.EnumPrinterConnections
i = 0
While i <= Printers.Count-1
    PrnName = Printers.Item(i+1)
    If Left(PrnName, 2) = "\\" Then ' только сетевые принтеры
        TextStream.WriteLine "обнаружен сетевой принтер: " & PrnName
        If PrnName <> DefaultPrn Then
            strPrinters = strPrinters & vbCrLf & PrnName
        End If
    Else
        TextStream.WriteLine "обнаружен несетевой принтер: " & PrnName
    End If
    i = i+2
Wend

' запись в Active Directory
Set AdoConn = CreateObject("ADODB.Connection")
If Err.Number Then
    TextStream.WriteLine "не удалось создать объект ADODB.Connection"
    TextStream.WriteLine Err.Number & " " & Err.Description
    Err.Clear
End If
AdoConn.Provider = "ADSDSOObject"
AdoConn.Open "Active Directory Provider"
Query = "SELECT ADsPath FROM 'LDAP://" & Domain & "' WHERE sAMAccountName='" & WshNetwork.UserName & "'"
Set Rs = AdoConn.Execute(Query)
If Err.Number Then
    TextStream.WriteLine "не удалось выполнить запрос к Active Directory: " & Query
    TextStream.WriteLine Err.Number & " " & Err.Description
    Err.Clear
End If
If Not Rs.EOF Then
    Set ObjectOfAD = GetObject(Rs.Fields(0).Value)
    ObjectOfAD.Put Field, strPrinters ' собственно запись
    ObjectOfAD.SetInfo
    If Err.Number Then
        TextStream.WriteLine "не удалось записать данные в Active Directory"
        TextStream.WriteLine Err.Number & " " & Err.Description
        Err.Clear
    End If
End If
AdoConn.Close
TextStream.Close
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.