如何列出特定Security group中所有已启用的用户成员
获取指定安全组内所有已启用用户的可落地方案
本地Active Directory场景
执行前先确认本机已安装RSAT-AD-PowerShell模块,执行以下命令即可:
# 将<目标安全组名称>替换为你实际要查询的组名 Get-ADGroupMember -Identity "<目标安全组名称>" -Recursive | # 过滤掉组、计算机等非用户对象 Where-Object ObjectClass -eq 'user' | # 拉取用户属性,筛选已启用账号 ForEach-Object { Get-ADUser -Identity $_.DistinguishedName } | Where-Object Enabled -eq $true | # 按需选择要输出的字段 Select-Object Name, SamAccountName, UserPrincipalName, Enabled
- 不需要查询嵌套在子组内的用户时,删除
-Recursive参数即可 - 需要导出为表格文件的话,在整条命令末尾追加
| Export-Csv -Path ".\启用用户列表.csv" -NoTypeInformation -Encoding UTF8,会在当前执行目录生成CSV文件 - 常见错误原因:没有过滤非用户对象,会把组内的计算机账号、嵌套子组也统计到结果里,导致数据不准
Azure AD/微软365云环境场景
注意:旧版AzureAD/AzureADPreview模块已停止官方维护,存在大量兼容性问题,统一使用Microsoft Graph PowerShell模块操作即可
执行以下命令完成查询:
# 首次执行会弹出授权窗口,授予对应读取权限即可 Connect-MgGraph -Scopes "User.Read.All","GroupMember.Read.All" # 将<目标安全组ObjectID>替换为Azure门户中查到的组ID $targetGroupId = "<目标安全组ObjectID>" # 要查询嵌套成员请将Get-MgGroupMember替换为Get-MgGroupTransitiveMember Get-MgGroupMember -GroupId $targetGroupId -All | # 过滤非用户对象 Where-Object { $_.AdditionalProperties.'@odata.type' -eq '#microsoft.graph.user' } | # 拉取用户属性筛选已启用账号 ForEach-Object { Get-MgUser -UserId $_.Id } | Where-Object AccountEnabled -eq $true | Select-Object DisplayName, Mail, UserPrincipalName, AccountEnabled
- 常见错误原因:直接从组成员返回结果里判断账号启用状态,组成员接口默认不返回
AccountEnabled属性,必须单独拉取用户详情才能拿到准确的启用状态,会导致筛选结果错误。
内容的提问来源于stack exchange,提问作者Ethan
相关产品推荐
相关产品推荐

