OSの起動時間を取得する

スポンサーリンク

はじめに

OSの起動時間を取得するスクリプトです。複数のサーバを指定することができます。

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

環境

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

ソースコード

OSBootUpTimeCheck.ps1

#######################################################################################
# 概要:指定したサーバでOSが起動した日時を取得します。
# 作成者:ITStudy
# 作成日:2020/06/12
# 必要なファイル:OSBootUpTimeCheck.ps1(このファイルです)
#                 ServersList.csv(対象サーバを記載したファイルです)
#                 SecurePassword.csv(暗号化したパスワードファイルです)
#######################################################################################

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

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 $ServersList) -Encoding Default | %{

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

    #OSが起動した日時を取得(DateTime)
    $dt = Get-WmiObject win32_operatingsystem -ComputerName $hn -Credential $credential | select @{LABEL='LastBootUpTime';EXPRESSION={$_.ConverttoDateTime($_.lastbootuptime)}}
    $BootUpTime += [pscustomobject]@{"HostName"=$hn; "LastBootUpTime"=$dt.LastBootUpTime; "Check DateTime"=(Get-Date).ToString("yyyy/MM/dd HH:mm:ss"); "ErrorMessage"=$error[0]}

    #進行状態を表示   
    Write-Host($hn + "を処理中です。")
}

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

ServersList.csv

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

HostName
windows2003
windows2008
windows2012
windows2016
windows2019

SecurePassword.csv

対象サーバのホスト名、IPアドレス、ユーザー名、暗号化したパスワードが保存されています。このファイルは事前に作成しておいて下さい。作成方法は「パスワードを一括して暗号化する」を参照して下さい。

"HostName","IP","UserName","Password"
"windows2003","192.168.xxx.xxx",administrator,N&Y7rkV%i4EGmtZx
"windows2008","192.168.xxx.xxx",administrator,N&Y7rkV%i4EGmtZx
"windows2012","192.168.xxx.xxx",administrator,N&Y7rkV%i4EGmtZx
"windows2016","192.168.xxx.xxx",administrator,N&Y7rkV%i4EGmtZx
"windows2019","192.168.xxx.xxx",administrator,N&Y7rkV%i4EGmtZx

結果

Report-YYYYMMDD.csv

自動サービスで開始していないサービスが表示されます。

HostName    LastBootUpTime      Check DateTime      ErrorMessage
--------    --------------      --------------      ------------
windows2003 2020/06/11 20:48:06 2020/06/12 10:41:23             
windows2008 2020/06/11 20:48:34 2020/06/12 10:41:30             
windows2012 2020/06/12 10:40:05 2020/06/12 10:41:40             
windows2016 2020/06/11 20:48:48 2020/06/12 10:41:40             
windows2019 2020/06/11 20:48:53 2020/06/12 10:41:40        

もし何かしらのエラーが発生した場合は、「ErrorMessage」に内容が表示されます。必要なCSVファイルがない、サーバにアクセスできない、サーバの認証が通らない、 暗号化パスワードを復号化できないなどを想定してテストしています。

最後に

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

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

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

@echo off
echo 対象サーバでOSが起動した日時を取得します。しばらくお待ち下さい。
powershell -NoProfile -ExecutionPolicy Unrestricted .\OSBootUpTimeCheck.ps1
echo 日時の取得が完了しました。Enterキーを押下して画面を閉じて下さい。
pause > nul
exit