Назад | Перейти на главную страницу

Рекурсивный список пользователей в AD большой организации

У меня есть сценарий, который рекурсивно перечисляет членов группы. Проблема в том, что их больше 5К, поэтому я не могу использовать Get-ADGroupMember, и мне также нужно получить только включенных пользователей. UAC, несмотря на документацию Microsoft, не показывает только включенных пользователей. У меня есть это, но фильтр не включен.

Function Get-MyLargeGroup {
[cmdletbinding()]
Param(
[Parameter(Position=0,ValueFromPipeline,ValueFromPipelineByPropertyName)]
[ValidateNotNullorEmpty()]
[string]$Name)

Begin {
    Write-Verbose "Starting $($MyInvocation.MyCommand)"
} #begin

Process {
Write-Verbose "Retrieving members from $Name"
$mygroup = Get-ADGroup -Identity $Name -Properties Members

foreach ($member in $mygroup.members) {
  $object = $member | Get-ADObject -Properties samaccountname,enabled
  if ($object.ObjectClass -eq 'Group') {
    Write-Verbose "Found nested group $($object.distinguishedname)"
    #recursively run this command for the nested group
    & $MyInvocation.MyCommand -name $object.Name
  } 
  else {
   Select-Object -InputObject $object -property ObjectClass,Name,SamAccountname,DistinguishedName,enabled
  }
} #foreach
} #process

End {
    Write-Verbose "Ending $($MyInvocation.MyCommand)"
} #end

} #end function

Если нет каких-то действительно старых ограничений с Get-ADUser, о которых я не знаю, не должно возникнуть проблем с его использованием для запроса, который вернет более 5 тысяч пользователей. Я только что протестировал его из коробки 2008 R2 с PowerShell 4, и мой запрос Get-ADUser вернул почти 7 тысяч пользователей с одними только параметрами -Filter * и -SearchBase. Мне также непонятно, почему вы думаете, что UAC имеет какое-либо отношение к возможности фильтровать включенных пользователей.

Тем не менее, вам действительно не нужен рекурсивный сценарий для этой задачи. Вы можете использовать фильтр LDAP, который вернет полный вложенный список членов группы, называемый LDAP_MATCHING_RULE_IN_CHAIN.

# first, get the DN of the group
$groupDN = (Get-ADGroup $Name).DistinguishedName

# now use it to get the nested members
Get-ADUser -LDAPFilter "(memberOf:1.2.840.113556.1.4.1941:=$groupDN)" -Property SamAccountname,Enabled | select ObjectClass,Name,SamAccountname,DistinguishedName,enabled

# alternatively, you can filter out the disabled users in the same query
Get-ADUser -LDAPFilter "(&(memberOf:1.2.840.113556.1.4.1941:=$groupDN)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))" -Property SamAccountname,Enabled | select ObjectClass,Name,SamAccountname,DistinguishedName,enabled

Причина, по которой ваш сценарий не работает для включенных пользователей, заключается в том, что «enabled» не является допустимым свойством командлета Get-ADObject. Это действительно для Get-ADUser и Get-ADComputer. С Get-ADObject вам необходимо декодировать значение из атрибута userAccountControl.

Ограничение в 5000 записей для Get-ADGroupMember - это ограничение, устанавливаемое веб-службами AD, работающими на ваших контроллерах домена. Ты можешь изменить параметр ADWS чтобы можно было возвращать более крупные результаты.

Вы можете вернуть более 5000 членов группы без изменения параметров ADWS, используя PowerShell ниже:

(Get-ADGroup -Identity "SomeGroupName" -Properties Members).members

Вам нужно будет просмотреть эти результаты с помощью командлета Get-ADObject, чтобы запросить дополнительную информацию об объекте.