見出し画像

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メモリ関連の記事


いいなと思ったら応援しよう!