2017-08-16 67 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之间时。