Windows
在大型組織 AD 中遞歸列出使用者
我有一個遞歸列出組成員的腳本。問題是超過 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