複数のサーバと指定したサービスのセットでサービスの状態をチェックする

はじめに

指定したサーバのサービス状態を確認するスクリプトです。サーバとサービスは複数指定することができます。サーバ名とサービス名のセットでチェックする時に使用します。

環境

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
タイトルとURLをコピーしました