web-dev-qa-db-ja.com

大規模な組織ADでユーザーを再帰的にリストする

グループメンバーを再帰的にリストするスクリプトがあります。問題は、5Kを超えているため、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
3
user206106

私が知らないGet-ADUserに本当に古い制限がない限り、5,000人を超えるユーザーを返すクエリにGet-ADUserを使用しても問題はありません。 PowerShell4を実行している2008R2ボックスからテストしたところ、Get-ADUserクエリは-Filter *パラメーターと-SearchBaseパラメーターのみで約7,000人のユーザーを返しました。また、UACが有効なユーザーをフィルタリングできることと関係があると思う理由もわかりません。

とにかく、このタスクに再帰的なスクリプトは実際には必要ありません。 LDAP_MATCHING_RULE_IN_CHAIN と呼ばれるグループのメンバーの完全なネストされたリストを返す使用可能なLDAPフィルターがあります。

# 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
3
Ryan Bolger

スクリプトが有効なユーザーに対して機能しない理由は、「enabled」がGet-ADObjectコマンドレットの有効なプロパティではないためです。 Get-ADUserおよびGet-ADComputerに有効です。 Get-ADObjectを使用する場合は、 serAccountControl属性から値をデコードする にする必要があります。

Get-ADGroupMemberの5,000レコードの制限は、ドメインコントローラーで実行されているADWebサービスによって設定された制限です。 ADWSパラメータを変更 して、より大きな結果を返すことができます。

以下のPowerShellを使用して、ADWSパラメーターを変更せずに5,000を超えるグループメンバーを返すことができます。

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

追加のオブジェクト情報を照会するには、Get-ADObjectコマンドレットを使用してこれらの結果をループする必要があります。

0
twconnell