PowerShell活用法! ~Hyper-Vのリソース管理~
【付録】スクリプト例
スクリプトの留意点
- 実行結果は送信メールにのみ表示されます。PowerShell上に、実行結果は表示されません。
- 仮想マシンの最終利用日時を仮想マシンのVHDファイルの最終更新日時とみなし、複数のVHDファイルを持つ仮想マシンに対しては、1つ目のVHDファイルの最終更新日時を取得しています。
- 本スクリプトの利用から発生した損害に関して、当社は一切の責任を負いませんのでご了承ください。
#
#物理サーバのディスクの空き容量が閾値を越えている場合に起動していない仮想マシンのリストをメール送信します
#
$Threshold = @{C=10GB; D=3GB} #空き容量のしきい値
$SmtpServer = "smtp.jp.example.com" #SMTPサーバのアドレス
$FromAddress = "admin-address@jp.example.com" #メールの送信元アドレス
$ToAddress = "admin-address@jp.example.com" #メールの宛先アドレス
$Server = (Get-Item Env:\Computername).value #物理サーバ名
$Subject = "ディスク空き容量不足 [{0}]" -f $Server #メールの表題
$LogicalDisks = Get-Wmiobject "Win32_LogicalDisk"
$Message = ""
$Warning = $FALSE
foreach ($drive in $LogicalDisks){
if($drive.DriveType -eq 3){ #DriveTypeがローカルハードディスク(3)のとき
#ディスクの空き容量を確認します
if($drive.FreeSpace -le $Threshold[$drive.DeviceID.SubString(0,1)]){
$Warning = $TRUE
$Message += "☆"
}else{
$Message += " "
}
$Message += "{0}ドライブの空き容量:" -f $drive.DeviceID + `
"{0:N2}GB/{1:N2}GB`r`n" -f ($drive.FreeSpace/1GB), ($drive.Size/1GB)
}
}
$Vms = @()
$condition1 = "Select * From Msvm_ComputerSystem Where Caption Like '仮想マシン' and enabledState!=2"
$VmData = Get-WmiObject -NameSpace "root\virtualization" -Query $condition1 #enabledStateが起動(2)
foreach($data in $VmData){
$Vm = @{}
#仮想マシン名を取得します
$Vm.name += $data.ElementName
#仮想マシンの作成者情報を取得します
$Vm.creator += $data.PrimaryOwnerName
$condition2 = "Select * From MsVM_ResourceAllocationSettingData " + `
"Where instanceId Like 'Microsoft:$($data.name)%' and Caption = 'ハード ディスク イメージ'"
$VmDisk = Get-WmiObject -NameSpace "root\virtualization" -Query $condition2
if($VmDisk.length -ne $null){
#VHDファイルが複数ある場合その1つ目を選択します
$VmDisk = $VmDisk[0]
}
$Vm.path += $VmDisk.connection
#仮想マシンのVHDファイルの最終更新日時を取得します
$Vm.lastwritetime += (Get-Itemproperty ($VmDisk.connection)).lastwritetime
$Vms += $Vm
}
#lastwritetime(最終更新日時)でソートします
$Vms = ($Vms | Sort-Object @{Expression={$_.lastwritetime}})
$Information = "次の仮想マシンは起動していません。`r`n削除を検討してください。`r`n`r`n"
foreach($guest in $Vms){
$Information += "マシン名:{0}`r`n作成者:{1}`r`n" -f $guest.name, $guest.creator + `
"最終更新日時:{0}`r`n`r`n" -f $guest.lastwritetime
}
if($Warning -eq $TRUE){
$Date = Get-Date
$Message = "{0}のディスクの空き容量が閾値より少なくなりました。`r`n`r`n" -f $Server + `
"{0}`r`n{1}`r`n日付:{2}" -f $Message, $Information, $Date
#メールを送信します
$SmtpClient = New-Object System.Net.Mail.SmtpClient($SmtpServer)
$SmtpClient.Send($FromAddress, $ToAddress, $Subject, $Message)
}
PCサーバ PRIMERGYに関する資料請求・お見積もり・ご相談
当社はセキュリティ保護の観点からSSL技術を使用しております。
受付時間 9時~12時および13時~17時30分
(土曜・日曜・祝日・当社指定の休業日を除く)