はじめに
指定したサーバのサービス状態を確認するスクリプトです。サーバとサービスは複数指定することができます。サーバ名とサービス名のセットでチェックする時に使用します。
環境
OS:Windows10
.Net Framework:4.7
PowerShellのバージョン:5.1.17134.858
ソースコード
DesignatedServiceCheck.ps1
#######################################################################################
# 概要 :任意のサーバで指定したサービスが起動しているかチェックします。
# 起動していない場合は担当者にメールを送信します。
# 作成者 :ITStudy
# 作成日 :2020/10/12
# 必要なファイル:DesignatedServiceCheck.ps1(このファイルです)
# ServerServiceList.csv(対象サーバとサービス名を記載したファイルです)
# SecurePassword.csv(暗号化したパスワードファイルです)
#######################################################################################
$CurrentDir = $PSScriptRoot
$ServerServiceList = "ServerServiceList.csv"
$SecurePassword = "SecurePassword.csv"
$Report = "Log\Report-$(Get-Date -f yyyyMMdd).csv"
$Result = @()
$smtp = "xxx.xxx.xxx.xxx" # SMTPサーバー(IP or FQDN)
$port = 25 # ポート番号(25/465/587/2525)
$from = "xxx@xxx.xxx" # 送信元メールアドレス
$to = @("xxx@xxx.xxx") # 宛先メールアドレス
$subject = "サービスの未起動通知(" + (Get-Date -f "yyyy/MM/dd")+ ")"
$body = [String]@("添付ファイルを確認して下さい。")
$ErrorActionPreference = "SilentlyContinue"
function Decryption($un, $sp){
#暗号化された標準文字列をSecureStringオブジェクトに変換する
$secure = ConvertTo-SecureString $sp
#Credentialオブジェクトを作成する
$credential = New-Object System.Management.Automation.PSCredential($un,$secure)
return $credential
}
#Logフォルダ内のファイル数をカウント、31個を超えたら古いファイルから削除していく
if ((Get-ChildItem (Join-Path $CurrentDir "log") | Where-Object { ! $_.PsIsContainer }).Count -ge 31){
Remove-Item (Get-ChildItem (Join-Path $CurrentDir "log") | Sort-Object LastWriteTime)[0].FullName
}
Import-Csv (Join-Path $CurrentDir $ServerServiceList) -Encoding Default | ForEach-Object {
#エラー配列を初期化
$error.Clear()
#ホスト名の取得(HostName)
$hn = $_.HostName
#サービス名の初期化(Name)
$dn= $_.ServiceName
#資格情報(Credential)の生成
$cd = Import-Csv (Join-Path $CurrentDir $SecurePassword) -Encoding Default | Where-Object {$_.HostName -eq $hn}
$credential = Decryption $cd.UserName $cd.Password
#指定サービスの起動チェック
$sl = Get-WMIObject Win32_Service -ComputerName $hn -Credential $credential | Where-Object {$_.Name -eq $dn}
#結果を成形
$Result += [pscustomobject]@{"HostName"=$hn; "DisplayName"=$dn; "Status"=$sl.state; "Check DateTime"=(Get-Date).ToString("yyyy/MM/dd HH:mm:ss"); "ErrorMessage"=$error[0]}
}
#結果表示
$Result | Format-Table -AutoSize -Wrap
#レポート出力
$Result | Export-Csv -NoTypeInformation (Join-Path $CurrentDir $Report) -Encoding Default -Append
#メール送信
if ($Result.Where({$_.Status -ne "Running" -or $_.ErrorMessage -ne $null}).count -ne 0) {
Send-MailMessage -SmtpServer $smtp -Port $port -From $from -To $to -Subject "$subject" -Body "$body" -Attachments (Join-Path $CurrentDir $Report) -Encoding UTF8
}
ServerServiceList.csv
対象サーバのホスト名(IPアドレス)と任意のサービス名を入力します。ヘッダーの「HostName」と「ServiceName」は削除しないで下さい。
HostName,ServiceName
eWindows2003,Browser
eWindows2008,Dnscache
eWindows2012,LanmanWorkstation
eWindows2016,VMTools
eWindows2019,Dhcp
eWindows2019,Schedule
eWindows2019,RemoteRegistry
SecurePassword.csv
対象サーバのホスト名、IPアドレス、ユーザー名、暗号化したパスワードが保存されています。このファイルは事前に作成しておいて下さい。作成方法は「パスワードを一括して暗号化する」を参照して下さい。
"HostName","IP","UserName","Password"
"ewindows2003","192.168.xxx.xxx",administrator,N&Y7rkV%i4EGmtZx
"ewindows2008","192.168.xxx.xxx",administrator,N&Y7rkV%i4EGmtZx
"ewindows2012","192.168.xxx.xxx",administrator,N&Y7rkV%i4EGmtZx
"ewindows2016","192.168.xxx.xxx",administrator,N&Y7rkV%i4EGmtZx
"ewindows2019","192.168.xxx.xxx",administrator,N&Y7rkV%i4EGmtZx
結果
Report-YYYYMMDD.csv
指定したサーバのサービス状態が確認できます。
HostName DisplayName Status Check DateTime ErrorMessage
-------- ----------- ------ -------------- ------------
eWindows2003 Browser Running 2020/11/08 14:47:15
eWindows2008 Dnscache Running 2020/11/08 14:47:16
eWindows2012 LanmanWorkstation Running 2020/11/08 14:47:16
eWindows2016 VMTools Running 2020/11/08 14:47:18
eWindows2019 Dhcp Running 2020/11/08 14:47:19
eWindows2019 Schedule Running 2020/11/08 14:47:20
eWindows2019 RemoteRegistry Running 2020/11/08 14:47:21