我被要求提出一个PowerShell脚本来执行以下操作:
我已经提出了以下代码,但它似乎没有正常工作,需要另外一双眼睛来帮助我。
$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
}
答案 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 ... }
}
}