Найти пользователей, которые не являются членами определенной группы GG? - PullRequest
0 голосов
/ 03 июня 2019

Я использую сценарий для экспорта пользователей с определенными группами GG в активном каталоге, но я хочу сделать наоборот, я имею в виду, что я хочу экспортировать пользователей, которые не являются членами этих групп.Я прикрепил часть кода, которую я делаю сейчас:

$Group = 'GG_LCS_UsersType4'
$Users = Get-ADGroupMember $Group -Recursive -Server $Domain |
         Get-ADUser |
         select SamAccountName, Enabled |
         Export-Csv Temp.csv -NoTypeInformation -Encoding UTF8
Import-Csv Temp.csv |
    Select-Object *, @{Name='Group';Expression={"$Group"}},
        @{Name='Domain';Expression={"$Domain"}} |
    Export-Csv "${Domain}_LicenseControlReport.csv" -NoTypeInformation -Encoding UTF8 -Append

Так что теперь я хочу, чтобы пользователи, которые не являются членами 'GG_LCS_UsersType4', 'GG_LCS_UsersType3', 'GG_LCS_UsersType2', 'GG_LCS_UsersType1' * 1004

1 Ответ

2 голосов
/ 03 июня 2019

В зависимости от того, насколько динамичным вы хотите, чтобы ваш код был, есть несколько способов подойти к этому вопросу.

Сценарий 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.

...