お疲れ様です!サーバー運用しているとPCの情報を定期的にチェックしておきたいとこです。そこでディスクやメモリ情報を Mattermost に送信する PowerShell のスクリプトを作ってみました。
スクリプト
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$chatUrl = "https://chat-server/hooks/aaaabbbbccccddddeeeeffffgggg" | |
$chatChannel = "town-square" | |
$userName = "" | |
$iconUrl = "https://www.shareicon.net/data/128x128/2015/09/16/101922_windows_512x512.png" | |
$authorIcon = "https://www.shareicon.net/data/16x16/2016/03/28/467235_drive_64x64.png" | |
function ConvertTo-Json20([object]$item) { | |
add-type -assembly system.web.extensions | |
$ps_js = new-object system.web.script.serialization.javascriptSerializer | |
return $ps_js.Serialize($item) | |
} | |
$Computer = Get-WmiObject -Class Win32_ComputerSystem | |
$hostname = $Computer.Name | |
$OS = Get-WmiObject Win32_OperatingSystem | |
$Memory = Get-WmiObject -Class Win32_PhysicalMemory | %{ $_.Capacity} | Measure-Object -Sum | %{ ($_.sum) } | |
$MemoryUsesPer = Get-WmiObject Win32_OperatingSystem | %{(($_.TotalVisibleMemorySize - $_.FreePhysicalMemory)/$_.TotalVisibleMemorySize) * 100} | |
if ( [string]::IsNullOrEmpty($userName) ){ | |
$userName = $hostname | |
} | |
$Disks = Get-WmiObject Win32_LogicalDisk | Where-Object { $_.DriveType -eq 3 } | |
$rows = @() | |
foreach ($Disk in $Disks) { | |
$fields = @() | |
# ボリューム名 | |
$VolumeName = $Disk.VolumeName | |
if ( [string]::IsNullOrEmpty($VolumeName) ){ | |
$VolumeName = "Local Disk" | |
} | |
# ドライブ名 | |
$DriveName = $Disk.DeviceID | |
# サイズ | |
$Size = [long]$Disk.Size | |
$fields += @{ | |
short = $true | |
title = "Size" | |
value = ("{0,6:0.00} GB" -F ($Size / 1GB)) | |
} | |
# 使用量 | |
$UsedSize = [long]$Disk.Size - [long]$Disk.FreeSpace | |
$fields += @{ | |
short = $true | |
title = "Used Size" | |
value = ("{0,6:0.00} GB" -F ($UsedSize / 1GB)) | |
} | |
# 空き容量 | |
$fields += @{ | |
short = $true | |
title = "Free Space" | |
value = ("{0,6:0.00} GB" -F ($Disk.FreeSpace / 1GB)) | |
} | |
# 使用率 | |
$DriveUsesPer = (($UsedSize / $Size) * 100) | |
$fields += @{ | |
short = $true | |
title = "Drive Uses Per" | |
value = ("{0,6:0.00} %" -F $DriveUsesPer) | |
} | |
$color = "#26A0DA" | |
if ($DriveUsesPer -gt 90) { | |
$color = "#DA1917" | |
} | |
$attachment = @{ | |
author_name = "{0} ( {1} )" -f $VolumeName, $DriveName | |
author_icon = $authorIcon | |
author_link = "file://" + $hostname | |
color = $color | |
fields = $fields | |
} | |
$rows += $attachment | |
} | |
$payload = @{ | |
channel = $chatChannel | |
username = $userName | |
icon_url = $iconUrl | |
text = "{0} {1} {2} Core {3,6:0.00} GB ({4,3:0} % )`r`n{5} - {6}" -f $OS.Caption, $OS.CSDVersion, $Computer.NumberOfLogicalProcessors, ($Memory / 1GB), $MemoryUsesPer, $Computer.Model, $Computer.Manufacturer | |
attachments = $rows | |
} | |
$payload = ConvertTo-Json20 $payload | |
$bytes = [System.Text.Encoding]::UTF8.GetBytes($payload) | |
# 自己証明書を使うときはこれがないとエラーになる | |
#add-type @" | |
#using System.Net; | |
# using System.Security.Cryptography.X509Certificates; | |
# public class TrustAllCertsPolicy : ICertificatePolicy { | |
# public bool CheckValidationResult( | |
# ServicePoint srvPoint, X509Certificate certificate, | |
# WebRequest request, int certificateProblem) { | |
# return true; | |
# } | |
#} | |
#"@ | |
#[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy | |
$request = [System.Net.WebRequest]::Create($chatUrl) | |
$request.ContentType = "application/json" | |
$request.Method = "POST" | |
$request.ContentLength = $bytes.Length | |
$requestStream = [System.IO.Stream]$request.GetRequestStream() | |
$requestStream.write($bytes, 0, $bytes.Length) | |
$requestStream.Close() | |
[System.Net.WebResponse]$response = $request.GetResponse() | |
$response.Close() |
実行
上記のスクリプトをサーバー上の適当なフォルダへ配置します。
パラメーターを環境に合わせて修正して保存し、ダブルクリックで実行するとディスクの情報が Mattermost に送信されます。
これをタスクスケジューラで定期的に実行するようにすればわざわざサーバーに見に行く必要はなくなります。タスクスケジューラの登録時は、操作のところで下記のように設定します。
項目 | 値 |
---|---|
操作 | プログラムの開始 |
プログラム/スクリプト | %SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe |
引数の追加 | -Command “スクリプトファイルのフルパス” |
開始 | スクリプトを保存したフォルダパス |
このスクリプトをベースに欲しい情報を取得して送信するように拡張すればよいかなと。
正常時は送信不要ならディスクの空き容量が閾値になったら送信するように修正します。
なお、試してませんが Slack や RocketChat などにも少し修正すれば使えるのかな?と思われます。