【问题标题】:Check Service status on multiple servers检查多台服务器上的服务状态
【发布时间】:2020-03-21 05:05:05
【问题描述】:

我需要一个脚本,它可以检查具有凭据的多个服务器的特定服务状态。我面临的主要问题是每台服务器的服务列表不同。例如,在一个服务器中它是 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

【问题讨论】:

    标签: powershell


    【解决方案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
    

    这是我找到的解决方案,如果有改进的余地,请提出建议

    【讨论】:

      【解决方案2】:

      有多种方法可以做到这一点。

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

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

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

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

      然后在带有Invoke-Command的远程机器上运行Get-Service检查服务状态:

      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"
      }
      

      【讨论】:

      • 感谢您的评论,不幸的是,调用命令在我们的环境中不起作用,它被阻止了。我只是对旧脚本进行了编辑并进行了一些改进。但仍在进行中。
      • @rpr 当你通过 WMI 来做的时候呢:$service = Get-WMIObject Win32_Service -computer $computer.Server -credential $cred?
      • 刚刚做了一些研究并得出如下解决方案,有什么建议吗? $CSVData = import-csv ".\Service.csv" $Servernames = $CSVData.Servername | sort -unique $output = @() $Cred = Get-Credential $CSVData = import-csv ".\Service.csv" $Servernames = $CSVData.Servername | sort -unique $output = @() $Cred = Get-Credential foreach ($server in $Servernames) { $Services = $CSVData |其中 {$_.Servername -eq $Server} |选择服务 foreach ($Service in $Services) { write-host $Server $Serv = $Service.service
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      • 1970-01-01
      • 2016-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多