В зависимости от того, насколько динамичным вы хотите, чтобы ваш код был, есть несколько способов подойти к этому вопросу.
Сценарий 1 (пользователи не входят в одну группу):
$group = 'GG_LCS_UsersType4'
$groupDN = (Get-ADGroup $group).DistinguishedName
$users = (Get-ADUser -filter {objectclass -eq "user"} -properties memberof).where{$_.memberof -notcontains $groupDN}
$users | Select-Object SamAccountName,Enabled |
Export-Csv Temp.csv -NoTypeInformation -Encoding UTF8
Сценарий 2 (пользователи не входят в несколько групп):
$groups = 'GG_LCS_UsersType4', 'GG_LCS_UsersType3', 'GG_LCS_UsersType2', 'GG_LCS_UsersType1'
$whereFilter = $groups | Foreach-Object {
$g = (Get-ADGroup $_).DistinguishedName
"{0} '{1}'" -f '$_.memberOf -notcontains',$g
}
$whereFilter = [scriptblock]::Create($whereFilter -join " -and ")
$users = (Get-ADUser -filter {objectclass -eq "user"} -properties memberof).where($whereFilter)
$users | Select-Object SamAccountName,Enabled |
Export-Csv Temp.csv -NoTypeInformation -Encoding UTF8
Сценарий 1 запрашивает Отличительное Имя группы и сохраняет, что приводит к $groupDN
. Get-ADUser
используется для запроса всех пользователей AD, а затем результат фильтруется для вывода пользователей, у которых нет группового отличительного имени в атрибуте .MemberOf
. Метод .where()
используется с оператором -notcontains
для фильтрации после запроса.
Сценарий 2 проходит по нескольким группам и создает массив строк, которые позже будут использоваться в методе .where()
. Строки создаются с использованием оператора форматирования (-f
), даже если в этом случае конкатенация выглядит лучше. Каждая запись массива просто содержит $_.memberOf -notcontains <Group Distinguished Name>
. Записи объединяются оператором -and
, а затем преобразуются в ScriptBlock, который представлен $whereFilter
. Поскольку метод .where()
принимает тип ScriptBlock в качестве параметра, мы можем просто передать $whereFilter
.
$Users
содержит объекты пользователя, возвращаемые из запросов. Я выбрал свойства, которые вы указали в своем вопросе, но их можно легко настроить для любых свойств, которые вы хотите.
Честно говоря, может быть проще опрашивать всех пользователей AD. Затем выполните фильтрацию по запросу всех пользователей AD. Основная причина, по которой поиск не так прост, кроме отсутствия надежных команд в модуле ActiveDirectory, заключается в том, что вы ищете массив значений в массиве. Проверка отдельных значений в массиве намного проще, и PowerShell может обрабатывать запросы такого типа в большинстве типов объектов Collection.