在 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
这是针对单个用户的,对于所有用途,你可能需要一个脚本