複数のサーバで自動サービスを開始する(Get-WMIObject)

はじめに

指定したサーバで自動サービスを開始するスクリプトです。複数のサーバや除外したいサービスを指定することができます。

Get-WMIObjectを使用しているため、Credentialを指定することができます。そのため、専用アカウントでのみ認証させている場合やワークグループのサーバに対しても処理することができます。

環境

OS:Windows10
.Net Framework:4.7
PowerShellのバージョン:5.1.17763.1007

ソースコード

AutoServiceStart.ps1

#######################################################################################
# 概要:複数のサーバで自動サービスを開始します。
# 作成者:ITStudy
# 作成日:2020/06/12
# 必要なファイル:AutoServiceCheck.ps1(このファイルです)
#                 ServersList.csv(対象サーバを記載したファイルです)
#                 SecurePassword.csv(暗号化したパスワードファイルです)
#                 SkipServiceList.csv(スキップするサービスを記載したファイルです)
#######################################################################################

$CurrentDir       = $PSScriptRoot
$ServersList      = "ServersList.csv"
$SecurePassword   = "SecurePassword.csv"
$SkipServiceList  = "SkipServiceList.csv"
$Report           = "Report-$(Get-Date -f yyyyMMdd).csv"
$aryServicesList  = @()
$StartedService   = @()
$ErrorActionPreference = "SilentlyContinue"

try{
	function Decryption($un, $sp){
	    #暗号化された標準文字列をSecureStringオブジェクトに変換する
	    $secure = ConvertTo-SecureString $sp

	    #Credentialオブジェクトを作成する
	    $credential = New-Object System.Management.Automation.PSCredential($un,$secure)

	    return $credential
	}

	#指定したサービスを配列に格納
	Import-Csv (Join-Path $CurrentDir $SkipServiceList) -Encoding Default | %{
	    $aryServicesList += $_.ServiceName
	}

	Import-Csv (Join-Path $CurrentDir $ServersList) -Encoding Default | %{

	    #エラー配列を初期化
	    $error.Clear()
	    #ホスト名の取得(HostName)
	    $hn = $_.HostName
	    #サービス名の初期化(DisplayName)
	    $dn=""
	    #資格情報(Credential)の生成
	    $cd = Import-Csv (Join-Path $CurrentDir $SecurePassword) -Encoding Default | ? {$_.HostName -eq $hn}
	    $credential = Decryption $cd.UserName $cd.Password

	    #自動サービスの起動チェック
	    #$sl = Invoke-Command -ComputerName $hn -Credential $credential -ScriptBlock {Get-Service | ? {$_.StartType -eq "Automatic" -and $_.Status -ne "Running" -and $_.DisplayName -notin $args}} -ArgumentList $aryServicesList
	    $sl = Get-WMIObject Win32_Service -ComputerName $hn -Credential $credential | ? {$_.StartMode -eq "Auto" -and $_.State -ne "Running" -and $_.DisplayName -notin @($aryServicesList)}
	    
	    #未起動の自動サービスを起動
	    $sl |  % {
	        Invoke-Command -ComputerName $hn -Credential $credential -ScriptBlock {Start-Service -Name $args[0]} -ArgumentList $_.Name
	    }
	        
	    #未起動の自動サービスを取得&カンマで連結
	    $sl |  % {    
	        if($dn -eq ""){
	            $dn += ($_.DisplayName)
	        }
	        else{
	            $dn += (", " + $_.DisplayName  )
	        }
	    }
	    $StartedService += [pscustomobject]@{"HostName"=$hn; "Started Service"=$dn; "Check DateTime"=(Get-Date).ToString("yyyy/MM/dd HH:mm:ss"); "ErrorMessage"=$error[0]}
	    #進行状態を表示   
	    Write-Host($hn + "を処理中です。")
	}

	#結果表示
	$StartedService | Format-Table -AutoSize -Wrap
	#レポート出力
	$StartedService | Export-Csv -NoTypeInformation (Join-Path $CurrentDir $Report) -Encoding Default
}Catch{
    $Error
}

ServersList.csv

対象サーバのホスト名、もしくはIPアドレスを入力します。ヘッダーの「HostName」は削除しないで下さい。

HostName
windows2003
windows2008
windows2012
windows2016
windows2019

SkipServiceList.csv

除外したいサービス名(DisplayName)を入力します。ヘッダーの「ServiceName」は削除しないで下さい。

ServiceName
Performance Logs and Alerts
Diagnostic Policy Service
Shell Hardware Detection
Software Protection
Microsoft .NET Framework NGEN v4.0.30319_X64
Microsoft .NET Framework NGEN v4.0.30319_X86
Windows Biometric Service
Remote Registry
Downloaded Maps Manager
Google Update サービス (gupdate)

結果

Report-YYYYMMDD.csv

未起動の自動サービスで開始したサービスを表示します。

HostName    Started Service Check DateTime      ErrorMessage
--------    --------------- --------------      ------------
windows2003                 2020/06/12 14:30:30
windows2008                 2020/06/12 14:30:38
windows2012                 2020/06/12 14:30:38
windows2016                 2020/06/12 14:30:39
windows2019 Zabbix Agent    2020/06/12 14:30:39

最後に

PowerShellスクリプトを実行した時、以下のメッセージが表示されることがあります。

Set-ExecutionPolicy : Windows PowerShell により実行ポリシーは正常に更新されましたが、設定は範囲がより明確に定義されたポリシーで上書きされました。この上書きにより、シェルで現在有効な実行ポリシー RemoteSigned が保持されます。実行ポリシーの設定を表示するには、「Get-ExecutionPolicy -List」と入力してください。詳細については、"Get-Help Set-ExecutionPolicy" を参照してください。

エラーではないので無視して問題ありませんが、メッセージを非表示にしたい場合はバッチファイルを作成して実行して下さい。

@echo off
echo 対象サーバで停止している自動サービスを起動します。しばらくお待ち下さい。
powershell -NoProfile -ExecutionPolicy Unrestricted .\AutoServiceStart.ps1
echo 自動サービスの起動が完了しました。Enterキーを押下して画面を閉じて下さい。
pause > nul
exit
タイトルとURLをコピーしました