Проверьте статус службы на нескольких серверах - PullRequest
1 голос
/ 21 марта 2020

Мне нужен скрипт, который может проверять c статус обслуживания нескольких серверов с учетными данными. Основная проблема, с которой я сталкиваюсь, заключается в том, что список услуг для каждого сервера отличается. Например, на одном сервере это веб-служба, а на другом - служба базы данных и т. Д. c. Я хотел бы сохранить 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 ]

1 голос
/ 21 марта 2020
$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

Это решение, которое я нашел, предложите, если есть место для улучшения

0 голосов
/ 21 марта 2020

Несколько способов сделать это.

Вы можете начать с machines.csv файла, содержащего имена и службы вашего сервера:

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

Затем вы можете импортировать этот CSV-файл с помощью Import-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"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...