列出大多数AD组中的顶级用户

在Windows域环境中,我如何计算拥有更多员资格的前N名用户?

我想知道间接和直接的小组。 所以,我希望这个计数也包括嵌套组,以便计数属于其他组的成员的组。

我在ServerFault中发现了另外一个问题( Powershell – 查找属于多个AD组的用户 ),但是恐怕答案中的脚本只是为用户提供了直接成员关系,而不是嵌套组。

在Windows域环境中,如何计算拥有更多组员成员的前N位用户?

我想知道间接和直接的小组。

嵌套的AD组成员计数

AD启用的用户帐户组成员资格嵌套方法可能需要相当长的一段时间,所以如果你的AD很大(或不太可能),请耐心等待。 获取所有已启用用户帐户的非嵌套AD组成员资格的Powershell逻辑低于我提供的嵌套逻辑,如果要运行这些逻辑。 Get-NestedAdGroupMembership函数源

输出到控制台的前10个最高计数logging

function Get-NestedAdGroupMembership { Param( [parameter(Mandatory=$true)] [alias("account", "username")] $user, [parameter(Mandatory=$false)] $grouphash = @{} ) $groups = @(Get-ADPrincipalGroupMembership -Identity $user | select -ExpandProperty distinguishedname) foreach ($group in $groups) { if ( $grouphash[$group] -eq $null) { $grouphash[$group] = $true $group Get-NestedAdGroupMembership $group $grouphash } } } $TempDir = $env:Temp $TempPSFile = "$TempDir\~PSTempADMembershipCount.lst" $Users = Get-ADUser -Filter {Enabled -eq $True} | Select-Object sAMAccountName If (Test-Path $TempPSFile){ Remove-Item $TempPSFile } ForEach ($User in $Users){ $SamName = $User.sAMAccountName $Count = Get-NestedAdGroupMembership $User.sAMAccountName | Measure-Object | Select-Object -Expand Count "$SamName,$count" | Out-File -Filepath $TempPSFile -Append } Import-Csv -Header Username,GroupCount -Path $TempPSFile | Sort-Object {[int] $_.GroupCount} -Descending | Select-Object -First 10 

所有logging输出到控制台降序

 function Get-NestedAdGroupMembership { Param( [parameter(Mandatory=$true)] [alias("account", "username")] $user, [parameter(Mandatory=$false)] $grouphash = @{} ) $groups = @(Get-ADPrincipalGroupMembership -Identity $user | select -ExpandProperty distinguishedname) foreach ($group in $groups) { if ( $grouphash[$group] -eq $null) { $grouphash[$group] = $true $group Get-NestedAdGroupMembership $group $grouphash } } } $TempDir = $env:Temp $TempPSFile = "$TempDir\~PSTempADMembershipCount.lst" $Users = Get-ADUser -Filter {Enabled -eq $True} | Select-Object sAMAccountName If (Test-Path $TempPSFile){ Remove-Item $TempPSFile } ForEach ($User in $Users){ $SamName = $User.sAMAccountName $Count = Get-NestedAdGroupMembership $User.sAMAccountName | Measure-Object | Select-Object -Expand Count "$SamName,$count" | Out-File -Filepath $TempPSFile -Append } Import-Csv -Header Username,GroupCount -Path $TempPSFile | Sort-Object {[int] $_.GroupCount} -Descending | Select-Object 

非嵌套AD组成员计数

输出到控制台的前10个最高计数logging

 $TempDir = $env:Temp $TempPSFile = "$TempDir\~PSTempADMembershipCount.lst" $Users = Get-ADUser -Filter {Enabled -eq $True} | Select-Object sAMAccountName If (Test-Path $TempPSFile){ Remove-Item $TempPSFile } ForEach ($User in $Users){ $SamName = $User.sAMAccountName $Count = Get-ADPrincipalGroupMembership $User.sAMAccountName | Measure-Object | Select-Object -Expand Count "$SamName,$count" | Out-File -Filepath $TempPSFile -Append } Import-Csv -Header Username,GroupCount -Path $TempPSFile | Sort-Object {[int] $_.GroupCount} -Descending | Select-Object -First 10 

所有logging输出到控制台降序

 $TempDir = $env:Temp $TempPSFile = "$TempDir\~PSTempADMembershipCount.lst" $Users = Get-ADUser -Filter {Enabled -eq $True} | Select-Object sAMAccountName If (Test-Path $TempPSFile){ Remove-Item $TempPSFile } ForEach ($User in $Users){ $SamName = $User.sAMAccountName $Count = Get-ADPrincipalGroupMembership $User.sAMAccountName | Measure-Object | Select-Object -Expand Count "$SamName,$count" | Out-File -Filepath $TempPSFile -Append } Import-Csv -Header Username,GroupCount -Path $TempPSFile | Sort-Object {[int] $_.GroupCount} -Descending 

笔记

在上面所有的逻辑示例中,我在Get-ADUser命令中使用了Get-ADUser -Filter {Enabled -eq $True}的语法,以便确保只查询ENABLED AD用户帐户对象。 这意味着DISABLED帐户不会被包含在结果中,除非这个filter被删除或更改。

上面的例子都经过了testing,证实在我的情况下按预期工作,所以这些都经过validation能够成功运行。


潜在的问题

如果遇到错误消息:服务器在上面运行这些进程时由于 Powershell中的内部错误而无法处理该请求 ,那么您可能需要查看本文,以获取可用的解决scheme我的情况(点击提供的链接)。


进一步阅读和资源

  • GET-ADUser便有
  • select-对象
  • 除去项目
  • 的ForEach
  • GET-ADPrincipalGroupMembership
  • 测量,对象
  • 出文件
  • import-CSV
  • sorting对象

显示嵌套组的列表

dsget user“cn = Jon Smith,cn = users,dc = microsoft,dc = com”-memberof -expand

dsquery用户名“Jon Smith”| dsget user -memberof -expand

这是针对单个用户的,对于所有的使用你可能需要一个脚本

我的环境将升级,所以我不能testing这个,但类似的东西

 Get-ADUser -Filter * -Properties memberOf | Where-Object {$_.memberof.count -ge 1} | Sort-Object -Property $_.memberof.count -Descending | Select-Object -First 10 

可能会做的伎俩。