作为一个非常非常新手的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“参数调用"Find”时出现异常:“找不到网络路径。”在\server\users\User.Name\Powershell脚本\Get-Local-AdminsV3.ps1:10 char:40 + $Group = $computer.psbase.children.find <<<< (“Administrators”)+ CategoryInfo : NotSpecified:(:) [],MethodInvocationException + FullyQualifiedErrorId : DotNetMethodException
我希望当它遇到一个写到报告文件中的错误时--类似于"$computor不可访问!“之类的东西--我非常确定肯定有一种简单的方法可以做到这一点--但我不能解决这个问题,所以我非常感谢任何提示。
发布于 2017-08-16 23:31:24
正如马特在评论中提到的那样。您可以在函数中使用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之间剪切和粘贴时。
https://stackoverflow.com/questions/45715520
复制相似问题