2014-01-15 39 views
1

我已經通過GPO在所有桌面上配置了winrm,因此我現在可以使用invoke-command cmdlet在遠程計算機上本地運行命令。當我在本地機器上運行net localgroup administrators時,這種方式可以運行,併爲我提供所需的功能。問題是我無法對這些數據做任何事情。我無法將結果分發給變量,因此我可以說刪除特定的帳戶。在PowerShell中等效的net localgroup管理員

是否有一個內置的cmdlet,可以讓我的操作與net localgroup administrators一樣?

回答

5

雖然可以運行net localgroup groupname和解析它的輸出,它是不是這樣做的一個非常時髦的方式。我建議你使用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 
+0

謝謝,我已經有了這個腳本。我想爲此使用invoke-command cmdlet。 – JoeRod

0

使用PowerShell的任何版本,你可以簡單地做你要檢查哪個機器下面:

get-wmiobject -class Win32_Group -computer <computername>(, <computer2> ...) 

這會給你的本地用戶帳戶。這也爲您提供了可用於刪除組的ManagementObjects,或者在Windows服務器上安裝使用PSv3和更新的附加cmdlet(運行get-module -list),您可以使用該腳本可能更容易(但仍然使用WMI而不是WinRM)。

+0

我已經可以做到這一點的WMI腳本已經試圖擺脫那個雖然。 – JoeRod

+0

爲什麼? WMI(CIM,更是如此)是PowerShell的一部分。 PSv3等在PSv4中增加了更多全部內置在CIM/WMI中的功能。它不會消失,PS不是一種替代品。 – Heath

+2

請注意,「Win32_Group」不僅會列出本地組,還會列出域組。 –

3

您可以從輸出中分析名稱。

下面是使用V4的例子:

(net localgroup administrators).where({$_ -match '-{79}'},'skipuntil') -notmatch '-{79}|The command completed' 
+0

感謝這給了我想找的東西,希望它更容易一些。 – JoeRod

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" 

你必須安設l遠程服務器管理工​​具爲了做Import-Module ActiveDirectory。對於Windows 7 SP1,您可以前往https://www.microsoft.com/en-us/download/details.aspx?id=7887下載並安裝這些工具,然後轉到添加或刪除Windows功能以啓用它們。