Экспорт пользователей из AD с определенным членством в группе - PullRequest
1 голос
/ 15 марта 2019

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

  1. SamAccountName
  2. DISPLAYNAME
  3. Комментарий
  4. Определенное имя группы (Группа A)

Ниже приведен код, который у меня есть сейчас. Это работает, но дает мне все группы, мне нужна только одна конкретная группа (Группа A), чтобы быть в списке. Если пользователь не является членом этой группы, он должен быть указан в экспорте, но без списка группы

Get-ADGroup -Filter {name -like "Domain Users"} | 
Get-ADGroupMember | Where-Object { $_.objectClass -eq 'user' } | 
Get-ADUser -Properties comment,displayname,MemberOf | 
select saMAccountName,displayname,comment,@{Name="MemberOf";Expression={$_.MemberOf -Join ";"}} | 
Sort-Object SamAccountName | Export-csv -path C:\Install\Export-AD.csv -NoTypeInformation

Надеюсь, у вас есть несколько советов и указаний о том, как отфильтровать имя группы.

1 Ответ

1 голос
/ 15 марта 2019

Вы можете просто добавить операцию сравнения (-like) в выражение для MemberOf. Вы можете увидеть пример этого ниже. Тем не менее, я бы рекомендовал против этого единственного дополнения из-за неэффективной природы Where-Object и ненужных запросов , которые происходят здесь.

Get-ADGroup -Filter {name -like "Domain Users"} | Get-ADGroupMember | Where-Object { $_.objectClass -eq 'user' } | Get-ADUser -Properties comment,displayname,MemberOf | select saMAccountName,displayname,comment,@{Name="MemberOf";Expression={($_.MemberOf -like "Group A") -join ";"}} | Sort-Object SamAccountName | Export-csv -path C:\Install\Export-AD.csv -NoTypeInformation

Я не знаю, насколько эффективно это работает в вашей AD. Я проверил это с 722 членами группы, и потребовалось 22,221 секунд для запуска.

Я бы попробовал что-то вроде этого, поскольку это будет значительно быстрее :

$GroupFilterDN = (Get-ADGroup "DOMAIN users").DistinguishedName
$GroupCheck = (Get-ADGroup "Group A").DistinguishedName
Get-ADUser -filter {(memberof -eq $GroupFilterDN -or PrimaryGroup -eq $GroupFilterDN) -and (ObjectClass -eq "user")} -Properties comment,displayname,MemberOf | 
select saMAccountName,displayname,comment,@{Name="MemberOf";Expression={$_.MemberOf.where({$_ -in $GroupCheck}) -join ";"}} | 
Sort-Object SamAccountName | Export-csv -path C:\Install\Export-AD.csv -NoTypeInformation

Вам необходимо заменить строку Group A на имя вашей группы в переменной $GroupCheck. $GroupFilter содержит группу, по которой вы хотите фильтровать. В вашем примере вы хотите фильтровать пользователей домена. Переменная содержит DN для этой группы. $GroupCheck содержит группу, для которой вы хотите найти участников. Переменная содержит DN для этой группы. В вашем примере вы назвали эту группу А. Необходимо добавить проверку PrimaryGroup, так как в вашем примере вы используете пользователей домена. Пользователи домена не отображаются в свойстве MemberOf. Метод where({$_ -in $GroupCheck}) предназначен для случаев, когда $GroupCheck имеет несколько групп. $GroupCheck в настоящее время будет иметь только одну группу, но можно настроить несколько.

Код устраняет необходимость использования команды Get-ADGroupMember, которая содержит Where-Object. Затем добавляется операция сравнения (-eq) для выражения MemberOf.

Я протестировал второй блок кода, и он завершился за 3,847 секунды с той же группой членов 722.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...