2017-08-16 86 views
2

這裏添加了未掃描的設備名稱(離線等)非常非常PowerShell的新手,我想一個腳本來掃描網絡上的設備和本地管理員報告。找到了一個,並做了一些小的修改以滿足我的需求 - 但我有一個MOD我無法解決如何做。希望有人會知道一個簡單的方法來做到這一點?我如何通過PowerShell腳本

下面的紙條將在設備名稱列表讀取 - 掃描,然後輸出上實時和在線的所有設備過時報告。如果設備不可訪問,我會在屏幕上看到以下錯誤,但報告中沒有任何內容。

在遇到它寫入報告文件中的錯誤,我想 - 「!$ - 計算機是無法訪問」的線沿線的東西

我使用的代碼是

$date = Get-Date -Format o | foreach {$_ -replace ":", "."} 
ECHO "Starting scan" 

$Result = @() 

foreach($server in (gc .\servers.txt)){ 

$computer = [ADSI](」WinNT://」 + $server + 「,computer」) 
$Group = $computer.psbase.children.find(」Administrators」) 
$Filename = "c:\" + "LocalAdminAudit" + $date + ".txt" 

function getAdmins 
{ 
ECHO "SEARCHING FOR DEVICE" 
$members = ($Group.psbase.invoke(」Members」) | % 
{$_.GetType().InvokeMember(」Adspath」, ‘GetProperty’, $null, $_, $null)}) - 
replace ('WinNT://DOMAIN/' + $server + '/'), '' -replace ('WinNT://DOMAIN/', 
'DOMAIN\') -replace ('WinNT://', '') 
$members} 
ECHO "READY TO WRITE OUTPUT" 
$Result += Write-Output "SERVER: $server" 
$Result += Write-Output ' ' 
$Result += (getAdmins) 
$Result += Write-Output '____________________________' 
$Result += Write-Output ' ' 

ECHO "Record written" 
} 
# Added date run to report 
$result += Write-Output "Date Reported: $date" 
$Result > $Filename 
Invoke-Item $Filename 

# replace "DOMAIN" with the domain name. 



ECHO "Scan Complete" 

而上,當機器處於離線或其他不響應屏幕上的錯誤是

異常調用「查找」和「1」的說法( s):「沒有找到網絡路徑」 「 at \ server \ users \ User.Name \ Powershell Scripts \ Get-Local-AdminsV3.ps1:1 0 char:40 + $ Group = $ computer.psbase .children.find < < < < (」管理員」) + CategoryInfo:NotSpecified:(:) [],MethodInvocationException + FullyQualifiedErrorId:DotNetMethodException

當它遇到一個錯誤,將其寫入報告文件,我想 - 這是一起「$的線計算機無法訪問!「 - 我敢肯定,必須有這樣做的一個簡單的方法 - 但我不能工作了,因此任何提示,將不勝感激

+1

您需要使用try catch塊來對該錯誤作出反應。然後,在'catch'中,您可以添加相應的錯誤操作。 – Matt

回答

0

馬特,在評論中提及。您可以在函數中使用Try/Catch塊來捕獲錯誤。

我也做了一些其他的變化。最主要的是我改變了函數來包含獲取本地管理員組所需的所有代碼。然後,循環只需使用計算機名稱在每臺計算機上調用該函數一次。這個函數可以重用。

其次,我不是輸出到文本文件,而是更改爲輸出爲CSV格式,這是一種更爲結構化的格式,可以稍後使用。

此外,而不是依靠書面形式向控制檯主機,我用Write-Progress報告循環的進展。

$Servers = Get-Content .\servers.txt 
$ExportFileName = "c:\LocalAdminAudit$date.csv" 

function Get-LocalAdministrator { 
    [cmdletbinding()] 
    Param(
     $ComputerName 
    ) 
    $Group = [ADSI]("WinNT://$computername/Administrators,group") 

    try { 
     $Group.Invoke("Members") | ForEach-Object { 
      $User = ($_.GetType().InvokeMember("Adspath", 'GetProperty', $null, $_, $null) -split '/')[-2,-1] -join '\' 
      [PSCustomObject]@{ 
       "User" = $User 
       "Server" = $ComputerName 
       "Date" = Get-Date -Format o | ForEach-Object {$_ -replace ":", "."} 
      } 
     } 
    } 
    catch { 
     [PSCustomObject]@{ 
      "User" = "Failed to Report" 
      "Server" = $ComputerName 
      "Date" = Get-Date -Format o | ForEach-Object {$_ -replace ":", "."} 
     } 
    } 
} 

$LocalAdmins = foreach ($Server in $Servers) { 
    Write-Progress -Activity "Retrieving Local Administrators" -Status "Checking $Server" -PercentComplete (([array]::indexof($Servers,$Server)/($Server.count))*100) 
    Get-LocalAdministrator $Server 
} 

$LocalAdmins | Export-CSV $ExportFileName -NoTypeInformation 
Invoke-Item $ExportFileName 

最後,小心巧妙的引號,尤其是在剪切和粘貼Outlook和word之間時。