Недавно мне потребовалось создать группу для каждой организационной единицы, OU, а затем «населить» ее пользователями. Я написал сценарий, полагая, что это будет интересный инструмент для тех, кто ищет ответ на вопрос, как управляться с PowerShell. Текст сценария приведен в листинге.

Что он делает? Прежде всего, определяет корневой домен, где мы хотим выполнить поиск. В данном случае я ищу корень домена savilltech.net, который выглядит как DC=savilltech, DC=net. Я сохраняю его в переменной. Не стоит явно указывать пути в середине сценария, лучше переместить их к началу, поскольку так будет легче изменить их в дальнейшем.

Теперь мне нужно найти все организационные единицы OU непосредственно по этому пути. Я могу сделать это при помощи Get-ADOrganizationalUnit и указания для ключа -SearchScope значения OneLevel. Это означает, что будет выполнен просмотр на один уровень ниже, но по этим OU не будет поиска. Существуют и другие доступные возможности, если вы хотите поискать более тщательно, например переключатель Subtree, позволяющий увидеть все организационные единицы. Мы сохраняем результаты в другую переменную — $OUs.

Теперь я хочу взглянуть на каждую OU. При использовании оператора foreach список объектов в $OUs будет помещен в $OU, где я могу поработать с каждым объектом. Например, к атрибутам можно получить доступ через использование $OU.. Вы можете заметить, что у меня иногда встречаются переменные в $ (), например $ ($OU.Name). В основном это потому, что, когда я получаю доступ к атрибуту переменной внутри строки, которую использую по умолчанию, при указании точки в ссылке на переменную она прерывается и вместо атрибута становится просто частью строки. Заключение ссылки и всего остального внутрь $ () позволит воспринимать все это как объект, то есть атрибут.

Первое основное действие — это New-ADGroup. Здесь следует отметить два момента:

  1. У нас есть символ продолжения строки, обратная кавычка «`», поэтому единая команда может быть разбита на несколько строк.
  2. Использование параметра -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
}
}