お疲れ様です!サーバー運用しているとPCの情報を定期的にチェックしておきたいとこです。そこでディスクやメモリ情報を Mattermost に送信する PowerShell のスクリプトを作ってみました。

スクリプト

Chat PC Info – GitHub Gist

Chat PC Info

主にディスク情報をチャットに送信する PowerShell スクリプトです。 チャットは Mattermost に送信出来ることを確認しています。 これをベースに Slack などにも送信できるんじゃないかと思われます。

パラメータ内容
$chatUrl内向きのウェブフックURL
$chatChannel送信先のチャンネル
$userNameユーザー名。省略時はホスト名
$iconUrlユーザーのアイコンURL
$authorIconAttachments の author_icon
view raw Readme.md hosted with ❤ by GitHub
$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()
view raw ChatPCInfo.ps1 hosted with ❤ by GitHub

実行

上記のスクリプトをサーバー上の適当なフォルダへ配置します。
パラメーターを環境に合わせて修正して保存し、ダブルクリックで実行するとディスクの情報が Mattermost に送信されます。

これをタスクスケジューラで定期的に実行するようにすればわざわざサーバーに見に行く必要はなくなります。タスクスケジューラの登録時は、操作のところで下記のように設定します。

項目
操作プログラムの開始
プログラム/スクリプト%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe
引数の追加-Command “スクリプトファイルのフルパス”
開始スクリプトを保存したフォルダパス

このスクリプトをベースに欲しい情報を取得して送信するように拡張すればよいかなと。
正常時は送信不要ならディスクの空き容量が閾値になったら送信するように修正します。
なお、試してませんが Slack や RocketChat などにも少し修正すれば使えるのかな?と思われます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*