1 (изменено: Oberschlesien, 2009-05-27 17:14:53)

Тема: VBS: получить список только активных учетных записей из AD.

Необходимо получить список незаблокированных учетных записей компьютеров из AD.
Я как то делал такой скрипт:

Dim objGroup, objItem, objWsNet, objExcel

Set objWsNet = CreateObject("WScript.Network")
Set objGroup = GetObject("LDAP://CN=groupname,OU=OUname,DC=domainname,DC=com")
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
objExcel.Workbooks.Add
di = 1
For Each objItem In objGroup.Members
di = di + 1
objExcel.Cells(1, 2).Value = "groupname:"
objExcel.Cells(1, 2).Font.Bold = TRUE
objExcel.Cells(1, 2).Font.Size = 16
objExcel.Cells(di, 2).Value = objItem.Name
Next

Скрипт открывает Excel и туда пишет членов определенного OU, указанного по LDAP ("LDAP://CN=groupname,OU=OUname,DC=domainname,DC=com"), но нужно чтобы он туда бросал только незаблокированные учетные записи компьютеров.
Можно ли использовать провайдер WinNT, чтобы выгружать всех УЗ компьютеров домена? (Ex: Set x = GetObject("WinNT://nwtraders1/AIvanov,user")).

2

Re: VBS: получить список только активных учетных записей из AD.

Еще интересен вариант через ADO.

3

Re: VBS: получить список только активных учетных записей из AD.

Лучше рассчитывать на Dmitrii.

Oberschlesien пишет:

Можно ли использовать провайдер WinNT,

Можно:

Option Explicit

Const ADS_UF_ACCOUNTDISABLE = &H0002

Dim objIADsContainer
Dim objIADsUser

Dim intCounter


Set objIADsContainer = GetObject("WinNT://DomainName,domain")

objIADsContainer.Filter = Array("User")


intCounter = 0

WScript.Echo "--------------------------------------------------"

For Each objIADsUser In objIADsContainer
    If Not objIADsUser.AccountDisabled Then
        intCounter = intCounter + 1
        
        WScript.Echo intCounter & ". " & objIADsUser.Name
    End If
Next

WScript.Echo "--------------------------------------------------"
WScript.Echo "Total of " & intCounter & " accounts aren't disabled."


' или
WScript.Echo

intCounter = 0

WScript.Echo "--------------------------------------------------"

For Each objIADsUser In objIADsContainer
    If objIADsUser.Get("UserFlags") And ADS_UF_ACCOUNTDISABLE Then
    Else
        intCounter = intCounter + 1
        
        WScript.Echo intCounter & ". " & objIADsUser.Name
    End If
Next

WScript.Echo "--------------------------------------------------"
WScript.Echo "Total of " & intCounter & " accounts aren't disabled."


Set objIADsContainer = Nothing

WScript.Quit 0
Oberschlesien пишет:

Еще интересен вариант через ADO.

Option Explicit

Const ADS_UF_ACCOUNTDISABLE = 2

Dim objConnection
Dim objCommand
Dim objRecordSet

Dim intUAC
Dim intCounter

Set objConnection = WScript.CreateObject("ADODB.Connection")
objConnection.Open "Provider=ADsDSOObject;"

Set objCommand = WScript.CreateObject("ADODB.Command")
objCommand.ActiveConnection = objConnection
objCommand.Properties("Sort on") = "cn"

objCommand.CommandText = _
    "<LDAP://dc=DomainName,dc=com>;" & _
    "(&(objectClass=user)(objectCategory=person));" & _
    "userAccountControl,distinguishedName;" & _
    "subtree"

Set objRecordSet = objCommand.Execute

intCounter = 0

With objRecordSet
    Do Until .EOF
        intUAC = .Fields("userAccountControl")
        
        If intUAC AND ADS_UF_ACCOUNTDISABLE Then
        Else
            intCounter = intCounter + 1
            
            WScript.Echo intCounter & ". " & .Fields("distinguishedName")
        End If
        
        .MoveNext
    Loop
    
    .Close
End With

WScript.Echo "--------------------------------------------------"
WScript.Echo "Total of " & intCounter & " accounts aren't disabled."

' или
WScript.Echo


objCommand.CommandText = _
    "<LDAP://dc=DomainName,dc=com>;" & _
    "(&(objectClass=user)(objectCategory=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)));" & _
    "userAccountControl,distinguishedName;" & _
    "subtree"

Set objRecordSet = objCommand.Execute

intCounter = 0

With objRecordSet
    Do Until .EOF
        intCounter = intCounter + 1
        WScript.Echo intCounter & ". " & .Fields("distinguishedName")
        
        .MoveNext
    Loop
    
    .Close
End With

WScript.Echo "--------------------------------------------------"
WScript.Echo "Total of " & intCounter & " accounts aren't disabled."


objConnection.Close

Set objRecordSet  = Nothing
Set objCommand    = Nothing
Set objConnection = Nothing

WScript.Quit 0

4

Re: VBS: получить список только активных учетных записей из AD.

А если речь идет об учетных записях компьютеров, а не пользователей?

5

Re: VBS: получить список только активных учетных записей из AD.

objIADsContainer.Filter = Array("Computer")

для первого (ну, и можете вместо «objIADsUser» писать «objIADsComputer» для ясности, хотя все они светятся сквозь «головной» «IADs»), и:

    …
    "(objectCategory=сomputer);…
    …

для второго.

6

Re: VBS: получить список только активных учетных записей из AD.

Не, не пойдет. Собственно, в этом и вся соль, что с УЗ компьютеров не получается.
В первом посте темы так и было:
"Необходимо получить список незаблокированных учетных записей компьютеров из AD."

Такой темы на форуме не было, может кому и помимо меня пригодиться.

7

Re: VBS: получить список только активных учетных записей из AD.

Oberschlesien пишет:

Не, не пойдет. Собственно, в этом и вся соль, что с УЗ компьютеров не получается.

Расшифруйте для меня по-русски. Ничего не понял, что не пойдёт, а особенно насчёт «с УЗ компьютеров»?

8

Re: VBS: получить список только активных учетных записей из AD.

OFF: 2Oberschlesien: у Вас в первом посте изначально, с двух часов было прописано насчёт компьютеров? Или Вы потом кой-чего поправляли? Если верно первое, то я, похоже, не доглядел (меня смущает написанное «GetObject("WinNT://nwtraders1/AIvanov,user"»). Потому я, с чистой совестью, и писал про работу с users.

9 (изменено: Oberschlesien, 2009-05-27 22:16:56)

Re: VBS: получить список только активных учетных записей из AD.

alexii, я правил это точно, а вот что - не помню, кажется, в первом варианте были указаны все типы учетных записей (далее и выше по тексту - УЗ).
OFF: Честно говоря, очень удивляет, что в Инете появились такие ребята как Вы. Я немного удивлен. Нет "понтов" и агрессии, уважают правописание, с интересом рассматривают любой вопрос, не умничают не по делу, модерят космонавтов, которые вместо ответа кидают 1234 ссылок и пишут типа "вот тут почитай". Но форум, похоже, обречен стать попсовым.

10

Re: VBS: получить список только активных учетных записей из AD.

Oberschlesien, тогда не понял, отчего вариант #4 с правкой из #6 не подойдёт? Я даже проверял у себя — во всех четырёх вариантах запросов (по два на каждого из провайдеров, WinNT: и LDAP:) отработало одинаково. Я просто не стал приводить полных текстов (поскольку они, фактически, идентичны, за исключением правок из #6). Как сие отрабатывает у Вас?

11

Re: VBS: получить список только активных учетных записей из AD.

Option Explicit

Const ADS_UF_ACCOUNTDISABLE = &H0002

Dim objIADsContainer
Dim objIADsComputer

Dim intCounter


Set objIADsContainer = GetObject("WinNT://domain")

objIADsContainer.Filter = Array("Computer")


intCounter = 0

WScript.Echo "--------------------------------------------------"

For Each objIADsComputer In objIADsContainer
    If Not objIADsComputer.AccountDisabled Then
        intCounter = intCounter + 1
        
        WScript.Echo intCounter & ". " & objIADsComputer.Name
    End If
Next

WScript.Echo "--------------------------------------------------"
WScript.Echo "Total of " & intCounter & " accounts aren't disabled."


' или
WScript.Echo

intCounter = 0

WScript.Echo "--------------------------------------------------"

For Each objIADsComputer In objIADsContainer
    If objIADsComputer.Get("UserFlags") And ADS_UF_ACCOUNTDISABLE Then
    Else
        intCounter = intCounter + 1
        
        WScript.Echo intCounter & ". " & objIADsComputer.Name
    End If
Next

WScript.Echo "--------------------------------------------------"
WScript.Echo "Total of " & intCounter & " accounts aren't disabled."


Set objIADsContainer = Nothing

WScript.Quit 0

Line 21, Column 5: Объект не поддерживает это свойство или метод 'AccountDisabled': 800A01B6


Если не останавливать дебагинг, то начинает показывать имена машин.

12

Re: VBS: получить список только активных учетных записей из AD.

Посмотрим днём.

13

Re: VBS: получить список только активных учетных записей из AD.

Oberschlesien, попробуйте такой вариант:

Dim objWsNet, objGroup, objItem
Dim intCounter, strDomain, strList, strTemp
Const strGroup = "Компьютеры домена"
Set objWsNet = CreateObject("WScript.Network")
strDomain = objWsNet.UserDomain
Set objWsNet = Nothing
Set objGroup = GetObject("WinNT://" & strDomain & "/" & strGroup & ",group")
intCounter = 0: strList = vbNullString
For Each objItem In objGroup.Members
    If Not objItem.AccountDisabled Then
        intCounter = intCounter + 1
        'strTemp = objItem.Name
        'strList = strList & intCounter & ". " & Left(strTemp, Len(strTemp) - 1) & vbNewLine
    End If
Next
Set objItem = Nothing
Set objGroup = Nothing
WScript.Echo "Всего включенных записей: " & intCounter '& vbNewLine & "===" & vbNewLine & strList
WScript.Quit 0

14 (изменено: Oberschlesien, 2009-05-31 09:19:18)

Re: VBS: получить список только активных учетных записей из AD.

Как то так что ли:

Dim objFSO, objGroup, objItem, Text
Set objFSO = CreateObject("Scripting.FileSystemObject")
Const strGroup = "Domain Computers"
Set objGroup = GetObject("WinNT://domain/" & strGroup & ",group")
Set Text = objFSO.CreateTextFile ("с:\report.xls", True)
Text.Write "Дата выгрузки: " & Date() & ". " & "Учетные записи ПК, которые незаблокированны:" & VbNullString
For Each objItem In objGroup.Members
If Not objItem.AccountDisabled Then
Text.WriteLine "" & objItem.Name
End If
Next

15

Re: VBS: получить список только активных учетных записей из AD.

вот хороший пример.