powershell审计windows用户组成员需区分本地组与域组:本地组用get-localgroupmember(需本地管理员权限),域组用get-adgroupmember(需ad模块及域权限);批量采集推荐invoke-command结合加密凭据,关键字段principalsource可识别越权成员;域组审计应聚焦高风险组并过滤非用户对象;结果比对可用compare-object追踪增删变化。
powershell 可以高效自动化审计 windows 用户组成员,但需区分本地组与域组场景,聚焦可执行、可验证、可汇总的操作路径,避免盲目遍历或权限失败导致结果失真。
明确审计目标:本地组 or 域组?
两者管理命令和权限模型完全不同:
-
本地组(如 Administrators、Remote Desktop Users):用
Get-LocalGroupMember,需目标主机本地管理员权限,适合工作组或非域管服务器 -
域组(如 Domain Admins、IT-Support):用
Get-ADGroupMember,需域控制器连接权限及ActiveDirectory模块,适用于域环境
混用命令会报错。例如在非域主机运行 Get-ADGroupMember 会提示“无法找到指定的模块”;在无本地管理员权限的机器上调用 Get-LocalGroupMember 则直接拒绝访问。
批量采集本地组成员(推荐脚本结构)
适用于 10–200 台 Windows 主机(Win10/11、Server 2016+),前提是已启用 WinRM 并配置好凭据:
- 准备
servers.txt,每行一个主机名或 IP - 使用
Import-Clixml加载加密凭据(如admin.cred),避免明文密码硬编码 - 核心命令示例(导出 Administrators 组成员到 CSV):
Get-LocalGroupMember -Group "Administrators" |
Select-Object @{n='Computer';e={$env:COMPUTERNAME}}, Name, PrincipalSource, ObjectClass |
Export-Csv -Path "\centralshareuditdmins_$(Get-Date -f yyyyMMdd).csv" -Append -NoTypeInformation
}
注意:-Append 确保所有主机结果写入同一文件;PrincipalSource 字段能区分域用户、本地用户、内置账户,是识别越权成员的关键字段。
域环境中审计关键安全组成员
不建议全量导出所有域组,应聚焦高风险组(如 Account Operators、Backup Operators、Domain Admins),并过滤非用户类成员(如计算机、嵌套组):
- 先加载模块:
Import-Module ActiveDirectory - 获取成员并排除计算机和组对象:
Where-Object { $_.objectClass -eq 'user' } |
Get-ADUser -Property DisplayName, LastLogonDate, Enabled |
Select DisplayName, SamAccountName, LastLogonDate, Enabled, DistinguishedName |
Export-Csv "domain-admins-audit.csv" -NoTypeInformation
加入 LastLogonDate 和 Enabled 字段,能快速识别长期未登录或已禁用但仍留在高权限组中的账号,这是合规审计常见扣分项。
结果比对与异常标记(实用技巧)
单次导出只是快照,真正有价值的审计在于变化追踪。可用 PowerShell 实现简易基线比对:
- 首次运行保存为
baseline_admins.csv - 后续运行生成新 CSV,用以下命令找出新增/缺失成员:
$new = Invoke-Command ... | Sort-Object Name
$added = Compare-Object $old $new -Property Name -PassThru | Where-Object SideIndicator -eq '=>'
$removed = Compare-Object $old $new -Property Name -PassThru | Where-Object SideIndicator -eq '
输出 $added 和 $removed 即为变更清单,可直接邮件通知安全负责人,无需人工逐行核对。











