2017-02-22 49 views
0

我使用以下從http://iislogs.com/steveschofield/2009/01/09/list-local-administrators-on-a-machine-using-powershell-adsi/的Powershell來提取在PC和內部網絡的服務器中配置的本地和域管理員帳戶。用於在網絡上列出本地管理員的Powershell

PowerShell腳本如下:

function LogToFile ([string]$strFileName, [string]$strComputer) 
{ 
Add-Content $strFileName $strComputer 
} 

$strComputer = 「server1.loc.mydomain.com」 
$computer = [ADSI](「WinNT://」 + $strComputer + 「,computer」) 
$Group = $computer.psbase.children.find(「Administrators」) 
$members= $Group.psbase.invoke(「Members」) | %{$_.GetType().InvokeMember(「Name」, ‘GetProperty’, $null, $_, $null)} 

ForEach($user in $members) 

{ 
Write-Host $user 
$a = $strComputer + 「!」 + $user.ToString() 
LogToFile 「C:\local-admins.txt」 $a 
} 

執行時,它產生的結果在txt文件中,格式如下:

server1.loc.mydomain.com!Administrator 
server1.loc.mydomain.com!JohnDoe 
server1.loc.mydomain.com!Support 
server1.loc.mydomain.com!Domain Administrators 
  1. 有人可以幫助我改變對TXT輸出文件,所以結果顯示爲以下格式:

    server1.loc.mydomain.com!Administrator!JohnDoe!Support!Domain Administrators 
    

如果以這種方式報告,那麼我可以輕鬆導出到csv並使用它。 如果可以將它轉換爲以所需格式而不是txt格式導出到CSV,那將會非常酷。

  1. 如何讓第6行的代碼例如如果我想掃描名稱爲server1,server2,... server38的整個子網......我不必爲每臺機器手動更改該行。我試過服務器*,服務器[*],它給我錯誤。

我在PS中是一個完整的新手,但是試圖將事物拼湊在一起來解決我的需求,並希望您可以爲我提供所需的幫助。

謝謝。

+0

'$ a = @($ strComputer; $ members)-join'!'' –

+0

幾乎就在那裏。但是現在它會根據管理員的數量在同一行中生成所需的輸出。例如。如果有4個管理員,輸出是(>添加只是爲了更清楚強調) > server1.loc.mydomain.com!Administrator!JohnDoe!Support!Domain Administrators > server1.loc.mydomain.com!Administrator !JOHNDOE!支持!域管理員 > server1.loc.mydomain.com!管理員!JOHNDOE!支持!域管理員 > server1.loc.mydomain.com!管理員!JOHNDOE!支持!域管理員 – valdroni

+0

刪除整個' foreach(){}'循環,只需執行一次 –

回答

1

要改變輸出在一個線上的所有賬戶,改變foreach()環在底部剛:

$a = @($strComputer;$members) -join '!' 
LogToFile "C:\local-admins.txt" $a 

爲了生成與他們的名字連續數服務器的列表,使用範圍運算符..

$serverNames = foreach($number in 1..38){ 
    'server{0}' -f $number 
} 

所以,你最終的東西,如:

function LogToFile ([string]$strFileName, [string]$strComputer) 
{ 
    Add-Content $strFileName $strComputer 
} 

foreach($ServerNumber in 1..38){ 
    $ServerName = 'server{0}.loc.mydomain.com' -f $ServerNumber 
    $Computer = [ADSI]("WinNT://$ServerName,computer") 
    $Group = $Computer.psbase.children.Find('Administrators') 
    $Members= $Group.psbase.invoke('Members') |ForEach-Object { $_.GetType().InvokeMember('Name', 'GetProperty', $null, $_, $null) } 

    $Output = @($ServerName;$members) -join '!' 
    LogToFile 'C:\local-admins.txt' $Output 
} 
+0

*錯誤地點擊了上方的編輯按鈕。沒有更改@Mathias的代碼。謝謝 – valdroni

相關問題