检查多台服务器上的服务状态

时间:2020-03-21 05:05:05

标签: powershell

我需要有一个脚本,该脚本可以检查具有证书的多个服务器的特定服务状态。我面临的主要问题是每个服务器的服务列表都不同。例如,在一台服务器中它是Web服务,另一台是数据库服务等。我想在第一列中保留服务器名称的csv文件,在另一列中保留其相关服务。脚本需要对此进行验证并继续运行。预期的输出为CSV。到现在为止,我做了很多事情,超出了范围。.希望有人可以帮助我。

$CSVData = import-csv ".\Service.csv"
$Servernames = $CSVData.Servername | sort -unique

$Cred = Get-Credential

foreach ($server in $Servernames) {

$Services = $CSVData | Where {$_.Servername -eq $Server} | Select service
foreach ($Service in $Services) {
    write-host $Server
    $Serv = $Service.service
    Get-WMIObject -computer $server -credential $cred -Query "Select * From Win32_Service WHERE Name Like '$Serv'" | select Name, state
}

}

有什么建议吗?还有助于将输出格式化为CSV

2 个答案:

答案 0 :(得分:1)

$CSVData = import-csv ".\Service.csv"
$Servernames = $CSVData.Servername | sort -unique
$output = @()

$Cred = Get-Credential

foreach ($server in $Servernames) {

$Services = $CSVData | Where {$_.Servername -eq $Server} | Select service
foreach ($Service in $Services) {
    write-host $Server
    $Serv = $Service.service
    #$ServStat = Get-WMIObject -computer $server -credential $cred -Query "Select * From Win32_Service WHERE Name Like '$Serv'" | select displayname, state
    $ServStat = Get-WMIObject -Query "Select * From Win32_Service WHERE Name Like '$Serv'" | select displayname, state
    $Info =New-object -Typename PSObject
    $Info | Add-Member -MemberType NoteProperty -Name "Hostname" -value $Server
    $Info | Add-Member -MemberType NoteProperty -Name "ServiceName" -value $ServStat.DisplayName
    $Info | Add-Member -MemberType NoteProperty -Name "ServiceStatus" -value $ServStat.state
    $Output +=$Info
}
}

$Output | export-csv ".\Result.csv" -notype

这是我找到的解决方案,建议是否还有改进的空间

答案 1 :(得分:0)

执行此操作的多种方法。

您可以从包含服务器名称和服务的machines.csv文件开始:

server,service
server1,WinRM
server2,WinRM
...

然后,您可以使用Import-CSV导入此CSV文件:

$computers = Import-Csv -Path .\machines.csv

然后通过使用Get-Service在远程计算机上运行Invoke-Command来检查服务状态:

foreach ($computer in $computers) {
    $cred = Get-Credential -Message "Enter username and password for $($computer.Server)"
    Write-host "$($computer.Service) Service checking on $($computer.Server)" -b "green" -foregroundcolor "red"

    $serviceParams = @{
        "ComputerName" = $computer.Server
        "Command" = {Get-Service -Name $using:computer.Service}
        "Credential" = $cred
    }

    $service = Invoke-Command @serviceParams

    Write-Host "$($computer.Service) Service on $($computer.Server) : $($service.Status)" -b "green" -foregroundcolor "red"
}