PowerShell USBメモリを監視したい
USBメモリの読み書きを監視したいときのスクリプトです
スクリプト例
※USBメモリが1つの場合の例です
#↓溜まっているジョブを終了させる
$ErrorActionPreference = "silentlycontinue"
for($i=1;$i -lt 999;$i+=1){
Remove-Job -Id $i -Force
}
#同じセッション上のイベントを削除する
Get-EventSubscriber -Force | Unregister-Event -Force
$ErrorActionPreference = "continue"
#↑溜まっているジョブを終了させる
# イベントリスナー
$action = {
$path = $Event.SourceEventArgs.FullPath
$changeType = $Event.SourceEventArgs.ChangeType
Write-Host "$(Get-Date), $changeType, $path"
}
$OLDUSBDRIVELETTER=$null
while ($true) {
$USBDRIVELETTER=$null
$tmp=(Get-WmiObject Win32_LogicalDisk | where{$_.DriveType -eq '2'}).DeviceID
if($tmp -ne $null){
foreach($i in $tmp){
$USBDRIVELETTER=$i
break
}
}
if($USBDRIVELETTER -ne $OLDUSBDRIVELETTER){
write-host "USBメモリ変更検出",$USBDRIVELETTER,$OLDUSBDRIVELETTER
if($USBDRIVELETTER -ne $null){
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = $USBDRIVELETTER+'\'
$watcher.Filter = "*.*" # ファイル名 ワイルドカード可
$watcher.IncludeSubdirectories = $true #サブディレクトリを監視するかどうか
$watcher.EnableRaisingEvents = $true
# イベントの登録
Register-ObjectEvent $watcher "Created" -Action $action
Register-ObjectEvent $watcher "Changed" -Action $action
Register-ObjectEvent $watcher "Deleted" -Action $action
Register-ObjectEvent $watcher "Renamed" -Action $action
# ファイルの持ち出しが知りたければCreatedのみでもよい
} else {
#USBメモリがなくなった
write-host "USBメモリがなくなった",$OLDUSBDRIVELETTER
#ジョブの削除
$ErrorActionPreference = "silentlycontinue"
for($i=1;$i -lt 999;$i+=1){
Remove-Job -Id $i -Force
}
Get-EventSubscriber -Force | Unregister-Event -Force
$ErrorActionPreference = "continue"
}
$OLDUSBDRIVELETTER=$USBDRIVELETTER
}
sleep 1
}
実行すると接続したUSBメモリの中でファイルを作ったり変更したりしている操作ログが画面に出力されています。
プログラムの解説
while ($true) のループの中でUSBメモリを見つけたら監視スタート、USBメモリが無くなったら監視を停止。というようにしています。
本当はこのような小細工せずに、A~Zドライブまでで固定ドライブ以外全部監視するようにしたほうが簡単かもしれません。
問題点
ひとつ問題があって、USBメモリの安全な取り外しができなくなります。常時監視している為です。
SKYSEAやLanScopeは、どういう仕組みでやってるんでしょうかね?
ファイルフィルターとかでしょうか
#PowerShell #プログラミング学習 #プログラミング入門 #SKYSEA #LanScope #ファイル監視
普通のフォルダやファイルを監視するスクリプトはこちらの記事
そのほかUSBメモリ関連の記事