1

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

Есть скрипт, который получает список принтеров из AD и выгружает его в файл, затем получает принтер по умолчанию и его выгружает в другой файл:

Dim objRoot, objConnection, objCommand, objRSet
Dim intNumRecords, strDomain, strPrinters

'Запись данных в фаил 
Dim fso, txtfile, txtfile1 
Set fso = CreateObject("Scripting.FileSystemObject") 
Set txtfile  =fso.OpenTextFile("C:\PrintersAD.nmp", 8, True) 

Set objRoot = GetObject("LDAP://RootDSE")
strDomain = objRoot.Get("DefaultNamingContext")
Set objRoot = Nothing
Set objConnection = CreateObject("ADODB.Connection")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand = CreateObject("ADODB.Command")
Set objCommand.ActiveConnection = objConnection
objCommand.CommandText = "<LDAP://" & strDomain & ">;(objectClass=printqueue);Name;Subtree"
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Timeout") = 30
Set objRSet = objCommand.Execute
intNumRecords = objRSet.RecordCount
If intNumRecords > 0 Then
    'strPrinters = "Обнаружено записей: " & intNumRecords & vbNewLine & "===" & vbNewLine
    objRSet.MoveFirst
    Do Until objRSet.EOF
        'strPrinters = strPrinters & objRSet.Fields("Name").Value & vbNewLine
    txtfile.WriteLine(objRSet.Fields("Name").Value) 
        objRSet.MoveNext
    Loop
    'Wscript.Echo strPrinters
Else
    'WScript.Echo "Ничего не обнаружено."
End If
txtfile.Close 

'Найдём принтер по умолчанию 

Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & "." & "\root\cimv2")
Set colInstalledPrinters= objWMIService.ExecQuery ("Select * from Win32_Printer")

For Each objPrinter In colInstalledPrinters

  if (UCase(objPrinter.Default)="ИСТИНА") or (UCase(objPrinter.Default)="TRUE") then

    Set txtfile1 =fso.OpenTextFile("C:\DefaultPrinter.nmp", 8, True) 
    txtfile1.WriteLine(objPrinter.Name) 

    'Wscript.Echo "Обнаружен принтер по умолчанию " & objPrinter.Name & _
    '                  "  " & objPrinter.PortName & "  " &  objPrinter.Default
  End if

Next
txtfile1.Close 

Set objRSet = Nothing
Set objCommand = Nothing
Set objConnection = Nothing
WScript.Quit 0

Как переделать этот скрипт, чтобы он получал принтеры не из АД, а список навроди того, который выводится при ручной установке сетевого принтера?

2

Re: VBScript: Как получить список сетевых принтеров, но не из AD

Хоть скажите, слишком тупой или слишком сложный вопрос... :-(

3

Re: VBScript: Как получить список сетевых принтеров, но не из AD

AFAIK при установке сетевого принтера он их тянет либо из АД, либо с конкретного принтсервера....
если вы пользуете принтсервер, что Вам мешает в скрипте указать его? (сервер)

4

Re: VBScript: Как получить список сетевых принтеров, но не из AD

2abc Проблема следующая: При ручной установке сетевого принтера есть два варианта 1. Найти принтер в АД,  2. Подключиться к принтеру или выполнить обзор принтеров. Через вар.1 принтер может быть не виден (если не поставили галочку в шаре). При вар.2 - его всегда видно через обзор принтеров. Так вот, нужно получить список как при обзоре принтеров... Я не силён в скриптах, только начинаю осваивать, не пинайте сильно, плиз. Что нужно поменять в скрипте?

5

Re: VBScript: Как получить список сетевых принтеров, но не из AD

Уважаемый Mike-Killer, AFAIK при 2 варианте вы по факту не сканируете сеть на наличие притеров в сети (расшареных), а задаете конкретный IP адрес машины (сервера). Т.е. вы сканируете шары по машинам (серверу).
И, на сколько я понимаю, Вам необходимо просканить сеть на наличие шар, выделить из них шары принтеров.
Я правильно Вас понял?

6

Re: VBScript: Как получить список сетевых принтеров, но не из AD

Совершенно верно!

7

Re: VBScript: Как получить список сетевых принтеров, но не из AD

Я так понимаю, что надо получить список машин через провайдера WinNT: (в принципе, можно и через LDAP:, один шут потом придётся соединяться с каждой в отдельности), затем подключиться к каждой и опросить её на предмет наличия PrintQueue: IADsPrintQueue Interface (Windows). Полученные значения можно собирать в массив или в коллекцию.

8

Re: VBScript: Как получить список сетевых принтеров, но не из AD

Интересно, а винда в вар.2 (см. сообщ. выше) тоже самое делает? Ещё раз повторю, не силён я пока в скриптах :-(... Может набросаете коду, если не сложно... плиз...

9

Re: VBScript: Как получить список сетевых принтеров, но не из AD

Нет, там не задействуется функционал ADSI (имеется в виду обзор сети на наличие принтеров). Другое дело, что сам ADSI при использовании провайдера «WinNT:» скорее всего реализуется обращением к тем же функциям WinAPI.

10 (изменено: abc, 2009-07-17 11:02:50)

Re: VBScript: Как получить список сетевых принтеров, но не из AD

Добрый день!

Можно поиграться с этим кодом:

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colPrn = objWMIService.ExecQuery("Select * from Win32_Printer")

For each objPrinter in colPrn
    Wscript.Echo "Local Name: " & objPrinter.Name
    Wscript.Echo "Share Name: " & objPrinter.ShareName
    Wscript.Echo "Server Name: " & objPrinter.ServerName
    Wscript.Echo "Shared? : " & objPrinter.Shared
    Wscript.Echo "Status Info: " & objPrinter.StatusInfo
    Wscript.Echo "System Name: " & objPrinter.SystemName
Next

Выводит список локальных расшареных принтеров.

11

Re: VBScript: Как получить список сетевых принтеров, но не из AD

2(abc) Подходит... Пасибо abc, alexii.

12

Re: VBScript: Как получить список сетевых принтеров, но не из AD

Господа, а как заставить скрипт представленный by Mike-Killer выгружать список принтеров и их портов из АД?

13

Re: VBScript: Как получить список сетевых принтеров, но не из AD

Ramzess пишет:

... выгружать список принтеров и их портов из АД?

Вот пример сценария, из которого можете сделать нужный вариант:

Dim objRoot, objConnection, objCommand, objRSet
Dim intNumRecords, strDomain, strLog, arrTemp, strTemp
Dim objFS, objFile, objWShell

strLog = "Printers_List.log"
Set objRoot = GetObject("LDAP://RootDSE")
strDomain = objRoot.Get("DefaultNamingContext")
Set objRoot = Nothing
Set objConnection = CreateObject("ADODB.Connection")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand = CreateObject("ADODB.Command")
Set objCommand.ActiveConnection = objConnection
strAttributes = "printerName,uNCName,portName,driverName,serverName,shortServerName,Location"
objCommand.CommandText = "<LDAP://" & strDomain & ">;(objectCategory=printQueue);" & strAttributes & ";Subtree"
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Timeout") = 30
On Error Resume Next
Set objRSet = objCommand.Execute
If Err.Number = 0 Then
    intNumRecords = objRSet.RecordCount
    If intNumRecords > 0 Then
        Set objFS = CreateObject("Scripting.FileSystemObject")
        strLog = objFS.BuildPath(objFS.GetParentFolderName(WScript.ScriptFullName), strLog)
        Set objFile = objFS.CreateTextFile(strLog, True)
        objFile.WriteLine "Обнаружено записей: " & intNumRecords & vbNewLine & "==="
        objRSet.MoveFirst
        Do Until objRSet.EOF
            For i = 0 To objRSet.Fields.Count - 1
                strTemp = vbNullString
                If IsArray(objRSet.Fields(i)) Then
                    arrTemp = objRSet.Fields(i)
                    For j = 0 To UBound(arrTemp)
                        strTemp = strTemp & arrTemp(j) & ";"
                        If Err.Number <> 0 Then Err.Clear
                    Next
                    Erase arrTemp
                Else
                    strTemp = objRSet.Fields(i).Value
                    If Err.Number <> 0 Then Err.Clear
                End If
                objFile.WriteLine objRSet.Fields(i).Name & " = " & strTemp
            Next
            objFile.WriteLine "---"
            objRSet.MoveNext
        Loop
        objFile.Close
        Set objFile = Nothing
        Set objFS = Nothing
        Set objWShell = CreateObject("WScript.Shell")
        objWShell.Run "notepad.exe " & strLog, 1
        Set objWShell = Nothing    
    Else
        WScript.Echo "Ничего не обнаружено."
    End If
Else
    WScript.Echo "Ошибка выполения запроса: " & Err.Number & vbNewLine & Err.Description
    Err.Clear
End If
Set objRSet = Nothing
On Error GoTo 0
Set objCommand = Nothing
objConnection.Close
Set objConnection = Nothing
WScript.Quit 0

14

Re: VBScript: Как получить список сетевых принтеров, но не из AD

Добрый день!
А возможно ли получить у объекта objPrinter свойство Безопасность - требуется узнать, какие группы могут его использовать?