我如何通过PowerShell脚本
这里添加了未扫描的设备名称(离线等)非常非常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
当它遇到一个错误,将其写入报告文件,我想 - 这是一起“$的线计算机无法访问!“ - 我敢肯定,必须有这样做的一个简单的方法 - 但我不能工作了,因此任何提示,将不胜感激
马特,在评论中提及。您可以在函数中使用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之间时。
您需要使用try catch块来对该错误作出反应。然后,在'catch'中,您可以添加相应的错误操作。 – Matt