2010/11/15

ログの書き込みがあったら知らせるスクリプト

前回の続き。
http://win-enikki.blogspot.com/2010/11/usbpowershell.html

前回はUSBメモリ使用者にログオフ時にメッセージ出力するスクリプトを紹介しました。
今回は、出力ログを監視することで監視者に知らせるスクリプトを紹介します。
とりあえず、スクリプト例を以下に表示します。
$writeDir="\\buso-pcv\test"
$writeTxt="usblog.txt"
$tmpColor= @("Red", "Blue", "Green", "Magenta", "DarkCyan")

[Void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")

$i = 0 #終了フラグ
$cl = 0 #カラーバリエーション
$watcher = New-Object System.IO.FileSystemWatcher              # FileSystemWatcherの作成
$watcher.Path = $writeDir                                      # 監視対象のフォルダ指定
$watcher.Filter = $writeTxt                                        # フィルター
$watcher.NotifyFilter = [System.IO.NotifyFilters]::LastWrite 

$NotifyIcon = New-Object System.Windows.Forms.NotifyIcon
$powerShellExe = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
$icon = [System.Drawing.Icon]::ExtractAssociatedIcon($powerShellExe)
$notifyIcon.Icon = $icon
$notifyIcon.Visible = $true

Write-Host "チェック開始します。"

while ($i -ge 0)
{
    $result = $watcher.WaitForChanged([System.IO.WatcherChangeTypes]::ALL)
    $tmpVar = $(Get-Content "$writeDir\$writeTxt")[-1] -split ","
    
    Write-Host ""
    Write-Host "#########################################"
    Write-host "【コンピュータ】"  $tmpVar[0] -ForegroundColor $tmpColor[$cl]
    Write-host "【ユーザー】"  $tmpVar[1] -ForegroundColor $tmpColor[$cl]
    Write-host "【ログオフ時刻】"  $tmpVar[2] -ForegroundColor $tmpColor[$cl]
    Write-Host "#########################################"
    
    $notifyIcon.ShowBalloonTip("1", "USBチェック", "USBメモリがささっているユーザーがいます", "Info")

    $cl+=1
    if ($cl -eq $tmpColor.length) {
        $cl=0
    }
}

ここでのポイントはFileSystemWatcher クラスです。
FileSystemWatcher クラス
http://msdn.microsoft.com/ja-jp/library/system.io.filesystemwatcher%28VS.80%29.aspx

監視ログを対象に、書き込みが発生したらログの最終行を出力させる。
また、ログは変更した場合分かりやすいようtmpColorにある配列順に文字色を代えるようにしています。
ついでに、NotifyIconクラスを使用してバルーン表示もさせています。
NotifyIconクラス
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.notifyicon%28VS.80%29.aspx

以上の結果でこのように表示されます。
出力ごとに色が変わり、バルーンも出力



















このスクリプトは、今回だけでなく他でもログに書き込みがあった場合の監視ができるので、
色々汎用性が高いかなーとおもってます。
いかがでしょうかー。

2010/11/10

USBメモリ抜き忘れ防止スクリプトをPowerShellでやってみる

久々にPowerShellを使う機会にめぐまれたので、投稿します。

USBメモリ、今では安価となりかなり利用率は増えましたが
それと同時にメモリの抜き忘れも増えているみたいです。
なんとかならんのかー、という要望があったので
折角なのでPowerShellでログオフ時にUSBメモリがささっているとダイアログを出すスクリプトを作ってみました。
ちなみに、色々ネット上にある参考スクリプトをツギハギしたりしています。
使用時は自己責任でお願いします ><


とりあえず、1つ目のポイントとして、USBメモリの有無確認ですが、
win32_usbhub クラスを利用することでみつけることができます。

Win32_USBHub クラス - WMI Fun !!
http://www.wmifun.net/library/win32_usbhub.html

USBメモリの場合、Nameが "USB 大容量記憶装置"であり、
Statusが"OK"であれば、ほぼちゃんと認識された状態のUSBメモリがささっているといえます。
Get-WmiObject -Class win32_usbhub | ? { $_.name -eq "USB 大容量記憶装置" } | ? { $_.status -eq  "OK" }
USBメモリをさしていた場合

あとは、ダイアログとして出すようにスクリプトを組めば完成です。
詳細は以下。
#USBログオフ時メッセージプロンプト処理
#メッセージ文
$messagePath="C:\temp\usbmessage.txt"
#ログ出力パス
$usbLOG="\\buso-pcv\test\usblog.txt"

#--------------------------------------
#メッセージボックス
#--------------------------------------
function MessageBox([string]$p_value = "")
{
    [Void][Windows.Forms.MessageBox]::Show($p_value,"お知らせ","OK", "Warning")
}


$crUSB = Get-WmiObject -Class win32_usbhub | ? { $_.name -eq "USB 大容量記憶装置" } | ? { $_.status -eq  "OK" }


if ($crUSB) {
    write-output "$env:computername,$env:username,$(get-date)" >> $usbLOG

    #Windowsフォームのロード
    [Void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms");

    MessageBox $([String]::Join("`r`n", (Get-Content $messagePath)))
   
}
 メッセージ文は、いろんな人が編集する場所でもあることから、
別テキストからの呼び出しに 。(ここでは "C:\temp\usbmessage.txt")
以下のようにusbmessage.txtに書いてみました。
USBがさしっぱなしだぞー( ゚Д゚)
誰かに盗まれても知らないぞ( ´∀`)
って、席にもういないッッΣΣ(゚Д゚;)
また、ダイヤログが出たときに、使用者のホスト名、ユーザー名、時刻を吐き出すようにしてみました。
このスクリプトをログオフスクリプトとして設置しておけば完了です。
実際に使用するとこんな感じ。
USB差しっぱなしでログオフした場合

usblogに記録されたログ

ちなみにGPOでPowershellのログオフスクリプトを管理する場合には、
スクリプト実行ポリシーを有効にすることと、PowerShell用のタブが別途あるので注意しましょう。
(あと、もちろん適用環境ではPowerShellがインストールされていることが前提です(笑))


GPOによるスクリプト実行ポリシーの許可

ログオフスクリプトのPowerShellタブ

また、「ハードウェアの安全な取り外し」を行わなくても大丈夫か?という点については
書き込み中でなければ、ほぼ問題ないとのこと。
ログオフ後なら なおのこと その後ぬいても問題ないでしょう。
どうしても怖いというのであれば、もう一度ログインして手順を踏んで抜いてもらうということで。

USBメモリやUSB HDDを安心して取り外す - ITmedia
http://bizmakoto.jp/bizid/articles/0710/03/news062.html


さて、これで使用者には注意を促しましたが、上記のメッセージにある通り
そもそも、使用者はログオフボタンを押した時点で皆 律儀に席に座っているとはかぎりません。

なので、USBメモリをさしてログオフした人を管理者へ知らせるスクリプトも作ってみました。

今回は長くなったので、スクリプトについてはまた次回。
ちなみに動作としてはこんな感じに出力させました。
USBメモリさし忘れ監視
ログを監視し続けて、書き込みがあったら出力、ついでにポップアップ表示もさせています。
では、また次回。(といって、またえらく時間あいたら嫌だな・・)