如何添加未被 PowerShell 脚本扫描(脱机等)的设备名称



非常非常像PowerShell新手,我想要一个脚本来扫描网络上的设备并报告本地管理员。找到一个并进行了一些小的修改以满足我的需求 - 但我有一个模组,我无法弄清楚该怎么做。希望有人知道一个简单的方法?

下面的代码将读取设备名称列表 - 扫描它们并输出所有实时和在线设备的过时报告。如果无法访问设备,我会在屏幕上收到以下错误,但报告中没有任何内容。

我希望当它遇到错误时,它会写入报告文件 - 类似于"$computor无法访问!

我使用的代码是

$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"参数调用"查找"的异常:"找不到网络路径。 " At \server\users\User.Name\Powershell Scripts\Get-Local-AdminsV3.ps1:1 0 字符:40 + $Group = $computer.psbase.children.find <<<<("管理员"( + 类别信息:未指定:(:) [],方法调用异常 + 完全限定错误 ID : DotNetMethodException

我希望当它遇到写入报告文件的错误时 - 类似于"$computor无法访问! - 我很确定一定有一个简单的方法来做到这一点 - 但我无法解决,所以任何提示将不胜感激

正如马特在评论中提到的。您可以在函数中使用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之间剪切和粘贴时。

最新更新