我已经通过GPO在所有桌面上配置了winrm,因此我现在可以使用invoke-command
cmdlet在远程计算机上本地运行命令。当我在我的本地机器上运行net localgroup administrators
时,这会起作用并给我我想要的东西。问题是我对这些数据无能为力。我无法将结果输出到变量,所以我可以说删除特定的帐户。
是否有内置cmdlet可以让我与net localgroup administrators
执行相同操作?
答案 0 :(得分:5)
虽然可以运行net localgroup groupname
并解析其输出,但这并不是一种PoSh方式。我建议改为使用WinNT provider:
$computers = 'HostA', 'HostB', 'HostC', ...
$groupname = 'Administrators'
$computers | % {
$group = [ADSI]("WinNT://$_/$groupname,group")
$group.PSBase.Invoke('Members') | % {
$_.GetType().InvokeMember('Name', 'GetProperty', $null, $_, $null)
}
}
如果您想使用Invoke-Command
,您可以执行以下操作:
$computers = 'HostA', 'HostB', 'HostC', ...
$groupname = 'Administrators'
Invoke-Command -Computer $computers -ScriptBlock {
$group = [ADSI]("WinNT://$env:COMPUTERNAME/$($args[0]),group")
$group.PSBase.Invoke('Members') | % {
$_.GetType().InvokeMember('Name', 'GetProperty', $null, $_, $null)
}
} -ArgumentList $groupname
答案 1 :(得分:3)
您可以从输出中解析名称。
以下是使用V4的示例:
(net localgroup administrators).where({$_ -match '-{79}'},'skipuntil') -notmatch '-{79}|The command completed'
答案 2 :(得分:0)
使用任何版本的PowerShell,只需对要检查的任何一台机器执行以下操作:
get-wmiobject -class Win32_Group -computer <computername>(, <computer2> ...)
这将为您提供本地用户帐户。这也为您提供了管理对象,您可以根据需要使用它来删除组,或者使用PSv3和更新的其他cmdlet安装在Windows Server上(运行get-module -list
),您可以使用它可能更容易(但仍然使用WMI而不是WinRM)
答案 3 :(得分:0)
我希望以@Ansgar Wiechers的答案为基础。就我的目的而言,获取每个用户的名字是不够的;我必须获取用户的域名,以便查看用户帐户是本地帐户还是域帐户。
我只是致电PSBase.Invoke('Members')
而不是致电Members()
。为了获取每个用户的路径,我使用[ADSI]
生成了对象,然后获得了Path
属性。这是我最终用来获取本地计算机上本地Administrators组成员的代码:
([ADSI]"WinNT://localhost/Administrators,group").Members() | % { ([ADSI]$_).Path.Substring(8) }
对于多台计算机,它看起来像这样:
$computers = 'HostA', 'HostB', 'HostC', ...
$computers | % {
([ADSI]"WinNT://$_/Administrators,group").Members() | % {
([ADSI]$_).Path.Substring(8)
}
}
最后,我扩展了我的脚本以查询我域中的所有计算机,列出每台计算机上的本地管理员,并将所有结果导出到XML文件:
Import-Module ActiveDirectory
Get-ADComputer -Filter { enabled -eq $true } | % {
$result = New-Object PSObject
Add-Member -InputObject $result -MemberType NoteProperty -Name "Name" -Value $_.Name
$local_administrators = ([ADSI]"WinNT://$($_.Name)/Administrators,group").Members() | % { ([ADSI]$_).Path.Substring(8) }
Add-Member -InputObject $result -MemberType NoteProperty -Name "Local Administrators" -Value $local_administrators
$result
} | Export-Clixml "Local Administrators on Machines in the Domain.xml"
您必须安装远程服务器管理工具才能执行Import-Module ActiveDirectory
。对于Windows 7 SP1,您可以转到https://www.microsoft.com/en-us/download/details.aspx?id=7887下载并安装这些工具,然后转到添加或删除Windows功能以启用它们。