1

Тема: VBS: перечисление групп, к которым принадлежит пользователь

Доброго времени суток.

Преподаватель выдал задание:
-Перечисление групп, к которым принадлежит пользователь, результат автоматически сформировать в виде отчета в MS-Word.

Сделать нужно на языке WSH.

Подскажите как подобное сделать?

2

Re: VBS: перечисление групп, к которым принадлежит пользователь

Видимо никто не знает

3

Re: VBS: перечисление групп, к которым принадлежит пользователь

А лихо поиском воспользоваться ?

Времени не хватает... :-(

4

Re: VBS: перечисление групп, к которым принадлежит пользователь

ArtemHS пишет:

Видимо никто не знает

Никто не хочет решать за Вас те задания, которые Вы бы должны выполнять самостоятельно.
Вам могли бы помочь, если бы видели труд, приложенный к решению задачи Вами лично.
Могли бы даже и решить за Вас, если бы задача того стоила, но она тривиальна. Подобные задачи даже на этом форуме уже обсуждались многократно (не говоря уж о просторах "инета").

5

Re: VBS: перечисление групп, к которым принадлежит пользователь

Дабы не плодить новую тему, спрошу здесь.

Собственно, задача: нужно получить список групп, в которые входит пользователь как непосредственно, так и опосредованно (через вложенность групп).

Делаю следующим образом:

On Error Resume Next

'установка соединения с доменом
Set objConnection = CreateObject("ADODB.Connection")
objConnection.Open "Provider=ADsDSOObject;"

Set objCommand = CreateObject("ADODB.Command")
objCommand.ActiveConnection = objConnection

objCommand.CommandText = _
 "<LDAP://OU=scripts_test,OU=Пользователи,OU=Новосибирск_nov,OU=Площадки,DC=domain,DC=local>;" & _
 "(&(objectCategory=person)(objectClass=user));" & _
 "ADsPath;subtree"
 'соединились с доменом к OU указанной в objCommand.CommandText, просмотр идет вглубь OU
Set objRecordSet = objCommand.Execute

'цикл пробегающий по всем юзерам, находящихся в указанной OU
While Not objRecordset.EOF
    strADsPath = objRecordset.Fields("ADsPath")
    'получаем объект пользователя
    Set objUser = GetObject(strADsPath)

    
    'получаем массив, состоящий из групп,непосредственным членом которых является пользователь
    arrMemberOf = objUser.GetEx("memberOf") 'Получили группы непосредственным членом которых является пользователь
    
    'для каждой группы в массиве arrMemberOf вызываем рекурсивную функцию
    For Each Group in arrMemberOf
        indirectlyFunction(Group)
    Next

    'передвигаемся к следующему пользователю
    objRecordset.MoveNext
Wend

function indirectlyFunction(strGroup)

    Set objIndGroup = GetObject("LDAP://"+strGroup)
        Wsh.Echo "Еще одна группа = " & objIndGroup.cn
    objIndGroup.GetInfo
    arrMembersOf = objIndGroup.GetEx("memberOf")
        For Each strMemberOf in arrMembersOf
            indirectlyFunction(strMemberOf)
        Next

End function

Вот только выходят не все группы, вглубь максимум уходят на одну.

6

Re: VBS: перечисление групп, к которым принадлежит пользователь

1. holydiver, новый вопрос - новая тема.
2. Вариант рекурсивного алгоритма смотрите по ссылке, которую в своём сообщении привёл Евген.
3. Вариант не рекурсивного алгоритма смотрите здесь: VBScript: список групп домена, членом которых является пользователь.

7

Re: VBS: перечисление групп, к которым принадлежит пользователь

Пардон, на будущее буду знать. Просто вопросы совпадают

Уже оба алгоритма просмотрел, оба работают как надо. Хотелось бы просто узнать в чем у меня ошибка, что делаю не так.. Получить результат - это одно, но еще бы и профит, дабы в дальнейшем как можно меньше глупых вопросов задавать

8

Re: VBS: перечисление групп, к которым принадлежит пользователь

holydiver пишет:

... что делаю не так...

Из приведённого кода не видно, где накапливается информация о том, что пользователь является косвенным членом той или иной группы.

9

Re: VBS: перечисление групп, к которым принадлежит пользователь

А мне даже и не надо нигде ее накапливать, я сразу эту группу (точнее ее поле "Заметки" - objIndGroup.GetInfo) передаю в функцию, и там в зависимости от того, что в этих заметках написано - происходят определенные действия.

Немного переписал функцию, правда немного криво... на работает как надо

int_current_group_vlojennost=0
int_max_group_vlojennost = 6

function indirectlyFunction (Group)
    On Error Resume Next
    int_current_group_vlojennost = int_current_group_vlojennost + 1
    Set objIndGroup = GetObject("LDAP://"+Group)
    Wsh.Echo "группа = " & objIndGroup.cn
    objIndGroup.GetInfo
    
    If int_current_group_vlojennost < int_max_group_vlojennost Then
        Err.Clear
        arrMembersOf = objIndGroup.GetEx("memberOf")
        if Err.Number <> 0 Then
        Else
            For Each strMemberOf in arrMembersOf
                indirectlyFunction (strMemberOf)
            Next
        End If
    End If
    int_current_group_vlojennost = int_current_group_vlojennost - 1
End function