ping,磁盘和服务检查

时间:2014-12-12 16:04:09

标签: powershell

我被要求提出一个PowerShell脚本来执行以下操作:

  1. Ping服务器列表并在ping失败时发送电子邮件
  2. 如果ping成功,请检查磁盘空间以确保其空闲时间超过500MB。如果低于此阈值,请通过电子邮件发送提醒
  3. 检查IISADMIN和CCMEXEC服务是否正在运行,如果不是,则再次发送警报。
  4. 我已经提出了以下代码,但它似乎没有正常工作,需要另外一双眼睛来帮助我。

    $rtn = $null
    $Computer = $null
    $EmailRecipient = "xxx@xxx.com","xxx@xxx.com"
    
    # Lookup all computers from AD starting with XXXXX
    $Computers = Get-ADComputer -Filter {name -Like "XXXXX*"} | select -ExpandProperty name
    
    # Ping each computer
    ForEach ($Computer in $Computers) {
        $rtn = Test-Connection -CN $computer.toUpper() -Count 1 -BufferSize 16 -Quiet
    
        IF ($rtn -match 'False') {
            # Send email to say computer unreachable
            #write-host $computer "unreachable"
            Send-MailMessage -From "ICT DESKTOP ALERTS<XXX@XXX.co.uk>" -To $EmailRecipient -Subject "DP Checker - Unreachable - $Computer" -Smtpserver emailrelay
        }
    }
    
    IF ($rtn -match 'True') {
        {
            foreach ( $computer in $computers ) {
                get-wmiobject Win32_LogicalDisk -computername $computer -ErrorAction SilentlyContinue | where-object { $_.FreeSpace -lt 500MB } | foreach-object {
                    Send-MailMessage -From "xxx@xxx.com<xxx@xxx.com>" -To $EmailRecipient -Subject "DP Checker - Low HDD space - $Computer" -Smtpserver emailrelay
                }
            }
        }
        {
            IF ($IIS.State -ne 'Running') {
                Send-MailMessage -From "xxx@xxx.com<xxx@xxx.com>" -To $EmailRecipient -Subject "DP Checker - Service - IIS - Not Running - $Computer" -Smtpserver emailrelay
            }
        }
        {
            IF ($SMS.State -ne 'Running') {
                Send-MailMessage -From "xxx@xxx.com<xxx@xxx.com>" -To $EmailRecipient -Subject "DP Checker - Service - SMS - Not Running - $Computer" -Smtpserver emailrelay
            }
        }
    }
    
    # Check if IIS and SMS services are running
    foreach ($computer in $computers) {
        $IIS = Get-WmiObject Win32_Service -Filter "Name = 'IISADMIN'" -ComputerName $computer -erroraction silentlycontinue
        $SMS = Get-WmiObject Win32_Service -Filter "Name = 'ccmexec'" -ComputerName $computer -erroraction silentlycontinue
    }
    

1 个答案:

答案 0 :(得分:2)

脚本中的逻辑被破坏了。您首先ping所有计算机。之后,仅当与 last 计算机的连接成功并且尝试确定服务的状态时,才在所有计算机上运行磁盘检查当你还没有真正询问他们的状态时。 然后您无条件地运行实际服务检查(再次在所有计算机上)。

将您的逻辑更改为以下内容:

ForEach ($computer in $computers) {
  $rtn = Test-Connection -CN $computer -Count 1 -BufferSize 16 -Quiet

  if (-not $rtn) {
    # ping failed
    Send-MailMessage ...
  } else {
    # ping succeeded
    Get-WmiObject Win32_LogicalDisk -Computer $computer |
      ? { $_.FreeSpace -lt 500MB } |
      % { Send-MailMessage ... }

    Get-WmiObject Win32_Service -Computer $computer -Filter "Name='IISADMIN'" |
      ? { $_.State -ne 'Running' } |
      % { Send-MailMessage ... }
    Get-WmiObject Win32_Service -Computer $computer -Filter "Name='ccmexec'" |
      ? { $_.State -ne 'Running' } |
      % { Send-MailMessage ... }
  }
}