我正在寻找一个 PowerShell 脚本,该脚本将查询并输出给定 Windows 服务器上的所有本地和 AD 用户、服务帐户和组。我需要该脚本以递归方式列出在该服务器上具有权限的每个组的成员。我正在寻找一个脚本,它可以为我提供一个良好的起点,让我可以根据自己的特定需求进行定制。谢谢。
答案1
午休时我很无聊,所以我给你做了这个。
$strLocalMachine = $env:computername
$arrLocalGroups = Get-CimInstance -ClassName Win32_Group -filter "Domain = '$strLocalMachine'"
$arrDomainGroups = Get-CimInstance -ClassName Win32_Group -filter "Domain = '[YOUR DOMAIN NAME HERE]'"
ECHO ""
ECHO "Local Groups"
ECHO ""
foreach($objLocalGroup in $arrLocalGroups)
{
$groupname = $objLocalGroup.Name
$group = [ADSI]"WinNT://./$groupname"
ECHO "-----$($objLocalGroup.caption)-----"
@($group.Invoke("Members")) | foreach {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}
}
ECHO ""
ECHO "Domain Groups"
ECHO ""
foreach($objDomainGroup in $arrDomainGroups)
{
$groupname = $objDomainGroup.name
$groupmembers = Get-QADGroupMember $groupname
ECHO "-----$groupname-----"
foreach($entry in $groupmembers)
{
IF($entry.type -eq 'group')
{
Echo "$($entry.name)`n GROUP MEMBERS"
$subgroupmembers = Get-QADGroupMember $($entry.name)
foreach($member in $subgroupmembers){ECHO " $($member.name)"}
}
else{echo "$($entry.name)"}
$entry = $null
}
}
这与免费 Quest AD 命令行开关枚举域组成员身份。如果您已安装 RSAT 或在 DC 上运行此命令,则可以修改它以使用 Microsoft AD cmdlet 执行相同操作。
我还没有在多台机器上测试过这个,所以不能保证它在我的测试 Win 7 机器之外能运行得如何,但只要你以域管理员身份运行,这应该是没问题的。
我觉得域组输出对于我的域成员 PC 来说太高了。该命令
Get-CimInstance -ClassName Win32_Group -filter "Domain = '[YOUR DOMAIN NAME HERE]'"
返回的值比我预期的要多得多,所以 YMMV,但如果它们是正确的组,那么它应该逐步执行并列出成员资格。恐怕我不知道如何识别本地组的成员是用户还是组。行 :
@($group.Invoke("Members")) | foreach {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}
应该允许我们调用除名称之外的成员,但我无法让它工作。如果有人可以为您澄清这一点,您应该能够使用它来列出本地组的成员。
希望这可以帮助。