powershell中的net localgroup administrators等效

时间:2014-01-15 20:42:51

标签: powershell local administrator

我已经通过GPO在所有桌面上配置了winrm,因此我现在可以使用invoke-command cmdlet在远程计算机上本地运行命令。当我在我的本地机器上运行net localgroup administrators时,这会起作用并给我我想要的东西。问题是我对这些数据无能为力。我无法将结果输出到变量,所以我可以说删除特定的帐户。

是否有内置cmdlet可以让我与net localgroup administrators执行相同操作?

4 个答案:

答案 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功能以启用它们。