在Windows域环境中,我如何计算拥有更多组员资格的前N名用户?
我想知道间接和直接的小组。 所以,我希望这个计数也包括嵌套组,以便计数属于其他组的成员的组。
我在ServerFault中发现了另外一个问题( Powershell – 查找属于多个AD组的用户 ),但是恐怕答案中的脚本只是为用户提供了直接成员关系,而不是嵌套组。
在Windows域环境中,如何计算拥有更多组员成员的前N位用户?
我想知道间接和直接的小组。
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
输出到控制台的前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我的情况(点击提供的链接)。
显示嵌套组的列表
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
可能会做的伎俩。