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

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

在 Windows 域环境中,如何计算出组成员最多的前 N ​​名用户?

我想要了解间接组和直接组。因此,我希望此计数也包括嵌套组,以便统计属于其他组的组。

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

答案1

在 Windows 域环境中,如何统计组成员最多的前 N ​​名用户?

我想了解间接群体和直接群体。

嵌套 AD 组成员计数

AD 启用的用户帐户组成员身份嵌套方法可能需要相当长的时间,因此如果您的 AD 很大(或者可能不是太大),请耐心等待。如果您想运行这些,获取所有启用的用户帐户的非嵌套 AD 组成员身份的 Powershell 逻辑位于我提供的嵌套逻辑下方。 Get-NestedAdGroupMembership 函数来源

前 10 条最高计数记录输出到控制台

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

所有记录按降序输出到控制台

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 条最高计数记录输出到控制台

$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

所有记录按降序输出到控制台

$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 -Filter {Enabled -eq $True}在上述所有逻辑示例中,我在命令中都使用了语法,Get-ADUser因此可以进行过滤以确保您只查询已启用AD 用户帐户对象。这意味着已禁用账户将不是除非删除或更改此过滤器,否则将包含在结果中。

上述例子全部已经过测试并确认在我的案例中可以按预期工作,因此这些都已经过验证可以成功运行。


潜在问题

如果你遇到以下错误信息:由于内部错误,服务器无法处理请求在 Powershell 中运行上述这些过程时,您可能需要查看这篇文章以找到在我的情况下有效的潜在解决方案(单击提供的链接)。


进一步阅读和资源

答案2

我的环境即将升级,所以我无法测试这个,但是

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

可能会奏效。

答案3

显示具有嵌套组的组列表

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

dsquery user -name “Jon Smith” | dsget user -memberof -expand

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

相关内容