Windows

在大型組織 AD 中遞歸列出使用者

  • June 28, 2017

我有一個遞歸列出組成員的腳本。問題是超過 5K,所以我不能使用 Get-ADGroupMember,而且我還需要只獲取啟用的使用者。儘管有 microsoft 文件,但 UAC 並不只顯示啟用的使用者。我有這個,但它沒有啟用過濾器。

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 存在一些非常古老的限制,否則將它用於返回超過 5k 使用者的查詢應該沒有問題。我剛剛從執行 PowerShell 4 的 2008 R2 機器上對其進行了測試,我的 Get-ADUser 查詢返回了幾乎 7k 使用者,只有 -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

引用自:https://serverfault.com/questions/857911