Rate this post

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

SRootDomain = "DC=savilltech,DC=net"n$OUs = Get-ADOrganizationalUnit -filter * -searchbase "$RootDomain" -SearchScope OneLevelnforeach($OU in $OUs)n{nSGroupOU = "OU=Groups,$($OU.DistinguishedName)" SUserOU = "OU=Users,$($OU.Distinguishedl\lame)" SNewGroupName = "$($OU.Name)Users"nSNewGroup = New-ADGroup -Name SNewGroupName -GroupCategory Security -GroupScope Global`n-DisplayName SNewGroupName -Path SGroupOU`n-Description "$($0U.Name) Users Group"-PassThrun#Now add all the users to itnSUsers = Get-ADUser -Filter * -SearchBase SUserOUnforeach($User in SUsers)n{nSUser | Add-ADPrincipalGroupMembership -MemberOf SNewGroupNamen} n}

Что он делает? Прежде всего, определяет корневой домен, где мы хотим выполнить поиск. В данном случае я ищу корень домена savilltech.net, который выглядит как DC=savilltech, DC=net. Я сохраняю его в переменной. Не стоит явно указывать пути в середине сценария, лучше переместить их к началу, поскольку так будет легче изменить их в дальнейшем. Теперь мне нужно найти все организационные единицы OU непосредственно по этому пути. Я могу сделать это при помощи Get-ADOrganizationalUnit и указания для ключа -SearchScope значения One Level. Это означает, что будет выполнен просмотр на один уровень ниже, но по этим OU не будет поиска. Существуют и другие доступные возможности, если вы хотите поискать более тщательно, например переключатель Subtree, позволяющий увидеть все организационные единицы. Мы сохраняем результаты в другую переменную — $OUs.nnТеперь я хочу взглянуть на каждую OU. При использовании оператора foreach список объектов в $OUs будет помещен в SOU, где я могу поработать с каждым объектом. Например, к атрибутам можно получить доступ через использование $OU.<attribute>. Вы можете заметить, что у меня иногда встречаются переменные в $ (), например $ (SOU.Name). В основном это потому, что, когда я получаю доступ к атрибуту переменной внутри строки, которую использую по умолчанию, при указании точки в ссылке на переменную она прерывается и вместо атрибута становится просто частью строки. Заключение ссылки и всего остального внутрь $ () позволит воспринимать все это как объект, то есть атрибут. Первое основное действие — это New-ADGroup.nnЗдесь следует отметить два момента:1. У нас есть символ продолжения строки, обратная кавычка «`», поэтому единая команда может быть разбита на несколько строк.n2. Использование параметра -PassThru в конце команды, который указывает на продолжение обработки объекта конвейером. В данном случае это будет означать, что он присвоен переменной SNewGroup.nnЗатем будет найден список всех пользователей, после чего для каждого из них пользовательский объект передается по конвейеру (с помощью символа «|»), и пользователь добавляется к группе.nВот и все. Очень простой сценарий, но он демонстрирует несколько примечательных свойств PowerShell.