首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何添加未由PowerShell脚本扫描(脱机等)的设备名称

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

Stack Overflow用户
提问于 2017-08-16 21:54:48
回答 1查看 34关注 0票数 2

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

下面的脚本将读取设备名称列表-扫描它们并输出所有在线和在线设备的日期报告。如果设备不可访问,我会在屏幕上看到以下错误,但报告中没有任何内容。

我希望当它遇到一个写到报告文件中的错误时--类似于"$computor不可访问!“

我使用的代码是

代码语言:javascript
复制
$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不可访问!“之类的东西--我非常确定肯定有一种简单的方法可以做到这一点--但我不能解决这个问题,所以我非常感谢任何提示。

EN

回答 1

Stack Overflow用户

发布于 2017-08-16 23:31:24

正如马特在评论中提到的那样。您可以在函数中使用Try/Catch块来捕获错误。

我还做了一些其他的修改。最重要的是,我更改了函数,以包含获取本地管理员组所需的所有代码。然后,循环只对每台具有计算机名称的计算机调用函数一次。然后这个函数就可以重用了。

其次,我没有输出到文本文件,而是改为输出到CSV,因为这是一种更结构化的格式,可以在以后更好地使用。

此外,我使用Write-Progress报告循环的进度,而不是依赖于对控制台主机的写入。

代码语言:javascript
复制
$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之间剪切和粘贴时。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45715520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档