Недавно мне потребовалось создать группу для каждой организационной единицы, OU, а затем «населить» ее пользователями. Я написал сценарий, полагая, что это будет интересный инструмент для тех, кто ищет ответ на вопрос, как управляться с PowerShell. Текст сценария приведен в листинге.
Что он делает? Прежде всего, определяет корневой домен, где мы хотим выполнить поиск. В данном случае я ищу корень домена savilltech.net, который выглядит как DC=savilltech, DC=net. Я сохраняю его в переменной. Не стоит явно указывать пути в середине сценария, лучше переместить их к началу, поскольку так будет легче изменить их в дальнейшем.
Теперь мне нужно найти все организационные единицы OU непосредственно по этому пути. Я могу сделать это при помощи Get-ADOrganizationalUnit и указания для ключа -SearchScope значения OneLevel. Это означает, что будет выполнен просмотр на один уровень ниже, но по этим OU не будет поиска. Существуют и другие доступные возможности, если вы хотите поискать более тщательно, например переключатель Subtree, позволяющий увидеть все организационные единицы. Мы сохраняем результаты в другую переменную — $OUs.
Теперь я хочу взглянуть на каждую OU. При использовании оператора foreach список объектов в $OUs будет помещен в $OU, где я могу поработать с каждым объектом. Например, к атрибутам можно получить доступ через использование $OU.
Первое основное действие — это New-ADGroup. Здесь следует отметить два момента:
- У нас есть символ продолжения строки, обратная кавычка «`», поэтому единая команда может быть разбита на несколько строк.
- Использование параметра -PassThru в конце команды, который указывает на продолжение обработки объекта конвейером. В данном случае это будет означать, что он присвоен переменной $NewGroup.
Затем будет найден список всех пользователей, после чего для каждого из них пользовательский объект передается по конвейеру (с помощью символа «|»), и пользователь добавляется к группе.
Вот и все. Очень простой сценарий, но он демонстрирует несколько примечательных свойств PowerShell.
$RootDomain = "DC=savilltech,DC=net" $OUs = Get-ADOrganizationalUnit -filter * -searchbase "$RootDomain" -SearchScope OneLevel foreach($OU in $OUs) { $GroupOU = "OU=Groups,$($OU.DistinguishedName)" $UserOU = "OU=Users,$($OU.DistinguishedName)" $NewGroupName = "$($OU.Name)Users" $NewGroup = New-ADGroup -Name $NewGroupName -GroupCategory Security -GroupScope Global ` -DisplayName $NewGroupName -Path $GroupOU ` -Description "$($OU.Name) Users Group" -PassThru #Now add all the users to it $Users = Get-ADUser -Filter * -SearchBase $UserOU foreach($User in $Users) { $User | Add-ADPrincipalGroupMembership -MemberOf $NewGroupName } }