回答:
スレッドタスクスケジューラ:USBフラッシュドライブを自動的に同期する方法 PowerShellをタスクスケジューラと一緒に使用するmonotoneと呼ばれるユーザーによるこの回答があります。
私はあなたと同じ質問をして、こことここで Scripting Guyのブログのテクニックを使って、PowerShell(Windowsのビルトインスクリプト)で何かを作りました。スクリプトはバックグラウンドプロセスとして継続的に実行され、タスクスケジューラを使用してシステムログオンで開始できます。スクリプトは、新しいドライブが接続されるたびに通知され、その後何かを行います(ここではタスクではなくスクリプトを構成します)。基本的に次のドライブの接続を待機している間一時停止されるため、多くのリソースを消費することはありません。ここに行きます:
1)Powershell ISEを起動します。これは、[スタート]メニューの[アクセサリ/ Windows Powershell]にあります。2)以下をコピーしてPowershellに貼り付けます。
#Requires -version 2.0 Register-WmiEvent -Class win32_VolumeChangeEvent -SourceIdentifier volumeChange write-host (get-date -format s) " Beginning script..." do{ $newEvent = Wait-Event -SourceIdentifier volumeChange $eventType = $newEvent.SourceEventArgs.NewEvent.EventType $eventTypeName = switch($eventType) { 1 {"Configuration changed"} 2 {"Device arrival"} 3 {"Device removal"} 4 {"docking"} } write-host (get-date -format s) " Event detected = " $eventTypeName if ($eventType -eq 2) { $driveLetter = $newEvent.SourceEventArgs.NewEvent.DriveName $driveLabel = ([wmi]"Win32_LogicalDisk='$driveLetter'").VolumeName write-host (get-date -format s) " Drive name = " $driveLetter write-host (get-date -format s) " Drive label = " $driveLabel # Execute process if drive matches specified condition(s) if ($driveLetter -eq 'Z:' -and $driveLabel -eq 'Mirror') { write-host (get-date -format s) " Starting task in 3 seconds..." start-sleep -seconds 3 start-process "Z:\sync.bat" } } Remove-Event -SourceIdentifier volumeChange } while (1-eq1) #Loop until next event Unregister-Event -SourceIdentifier volumeChange
3)上記のスクリプトを変更して、スクリプトに検索するドライブと実行するものを指示する必要があります。変更する2行は次のとおりです。
if ($driveLetter -eq 'Z:' -and $driveLabel -eq 'Mirror')
「Mirror」という名前のUSBハードドライブがZ:ドライブとして設定されています。あなたが
if ($driveLabel -eq 'MyDiskLabel')
手紙を気にしないなら、あなたはただ使うことができました。start-process "Z:\sync.bat"
実行したいタスクのパス。この例では、USBドライブに3〜4個のバックアップタスクコマンドラインを開始するバッチファイルを作成しました。
4)完了したら、スクリプトをどこかに(拡張子
.ps1
)保存し、タスクスケジューラでタスクを作成して、スクリプトをバックグラウンドで実行します。私のものは次のようになります。
- トリガー:ログオン時
- アクション:プログラムを開始します
- プログラム/スクリプト:powershell
- 引数を追加します。
-ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"
5)ほら!
6)余分なもの:
スクリプトウィンドウを非表示にする場合は、次の引数を使用します。
- 引数を追加します。
-WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1"
スクリプトメッセージをログファイルに出力する場合(スクリプトが起動するたびに、つまりログオン時に上書きされる)、次のタスクアクションを使用します。
- プログラム/スクリプト:cmd
- 引数を追加:
/c powershell -WindowStyle Hidden -ExecutionPolicy Unrestricted -File "D:\Stuff\Backup script.ps1" > "D:\Stuff\script
log.txt "実行中の非表示スクリプトを終了する場合はいつでも、タスクマネージャーで「Powershell」プロセスを終了できます。
唯一の欠点は、ドライブが既に接続されている状態でコンピューターを起動しても何も実行されないことです(最初のチェックを最初に実行するようにスクリプトを変更できますが、今日は十分です!)
$newEvent.SourceEventArgs.NewEvent
あなたに興味を持っているイベントのために。
この議論ですでに説明したように(ただし、USBドライブが取り外されたときにプログラムを実行することについてでした)、USB Safely Removeは、無料ではありませんが、USBデバイスに関するイベントがトリガーされたときにプログラムを実行できます:
同様のソフトウェアと区別するもう1つのUSB Safely Remove機能は、デバイスを接続した後だけでなく、削除する前にアプリケーションを起動します。自動実行機能を使用すると、リムーバブルハードドライブを切断する前にデータバックアップを設定したり、ペンドライブの内容でTotal Commanderを実行したり、USBメディアを切断する前に暗号化されたTrueCryptドライブを自動的にアンマウントしたりできます。
もちろん、スケジュールされたタスクを使用することではないため、これは質問に完全に答えるわけではありませんが、USBスティックが差し込まれたときに特定のプログラムを実行するという目標は同じだと思います。
EventVwrを使用すると非常に簡単になります。
必要なイベントを見つける-USB大容量ストレージデバイスを接続すると、次のイベントが発生しました(アプリケーションカテゴリ):20001、20003、7036、およびその他の関連性の低いもの。誤検知を避けるために、これらのイベントを他のUSBデバイスイベントに対してテストしてください。
イベントを右クリックし、[このイベントにタスクを添付](Windows Vista以降のみに関連-XPにはCLI EventTriggerがあります)をクリックし、[プログラムの開始]を選択して、実行するスクリプトを指定します。
イベントパラメータをスクリプトに渡すには、この記事をご覧ください。イベント20001および20003の下で、新しいストレージへのUNCパスを見つけることができます。Sysinternals Junctionユーティリティを使用して、UNCパスへのリンクを作成できます。
これを機能させることができました:アプリケーションとサービスのログにイベント1003、USBに接続された電話のMicrosoft-Windows-DriverFrameworks-UserModeが見つかりました
イベントの完全なxml:
- <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
- <System>
<Provider Name="Microsoft-Windows-DriverFrameworks-UserMode" Guid="{2E35AAEB-857F-4BEB-A418-2E6C0E54D988}" />
<EventID>1003</EventID>
<Version>1</Version>
<Level>4</Level>
<Task>17</Task>
<Opcode>1</Opcode>
<Keywords>0x8000000000000000</Keywords>
<TimeCreated SystemTime="2016-08-19T01:42:06.292278900Z" />
<EventRecordID>17516</EventRecordID>
<Correlation />
<Execution ProcessID="456" ThreadID="2932" />
<Channel>Microsoft-Windows-DriverFrameworks-UserMode/Operational</Channel>
<Computer>5CG6070VFK-W7.nikonprecision.com</Computer>
<Security UserID="S-1-5-18" />
</System>
- <UserData>
- <UMDFDriverManagerHostCreateStart lifetime="{AFEC92AD-6015-4AB4-86AE-F34CEE06A977}" xmlns:auto-ns2="http://schemas.microsoft.com/win/2004/08/events" xmlns="http://www.microsoft.com/DriverFrameworks/UserMode/Event">
<HostGuid>{193a1820-d9ac-4997-8c55-be817523f6aa}</HostGuid>
<DeviceInstanceId>USB.VID_04E8&PID_6860&MS_COMP_MTP&SAMSUNG_ANDROID.6&3400EB54&1&0000</DeviceInstanceId>
</UMDFDriverManagerHostCreateStart>
</UserData>
</Event>
そして、私のタスクのカスタムイベントフィルター:
<QueryList>
<Query Id="0" Path="Microsoft-Windows-DriverFrameworks-UserMode/Operational">
<Select Path="Microsoft-Windows-DriverFrameworks-UserMode/Operational">*[System[Provider[@Name='Microsoft-Windows-DriverFrameworks-UserMode'] and EventID=1003]] and *[UserData[UMDFDriverManagerHostCreateStart[DeviceInstanceId="USB.VID_04E8&PID_6860&MS_COMP_MTP&SAMSUNG_ANDROID.6&3400EB54&1&0000"]]]</Select>
</Query>
</QueryList>
同様に、USBドライブの場合、イベント2100、2101、2105、2106でし
た。特定のUSBドライブの場合:
- <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
- <System>
<Provider Name="Microsoft-Windows-DriverFrameworks-UserMode" Guid="{2E35AAEB-857F-4BEB-A418-2E6C0E54D988}" />
<EventID>2101</EventID>
<Version>1</Version>
<Level>4</Level>
<Task>37</Task>
<Opcode>2</Opcode>
<Keywords>0x8000000000000000</Keywords>
<TimeCreated SystemTime="2016-08-19T01:52:37.922289600Z" />
<EventRecordID>17662</EventRecordID>
<Correlation />
<Execution ProcessID="10956" ThreadID="11892" />
<Channel>Microsoft-Windows-DriverFrameworks-UserMode/Operational</Channel>
<Computer>5CG6070VFK-W7.nikonprecision.com</Computer>
<Security UserID="S-1-5-19" />
</System>
- <UserData>
- <UMDFHostDeviceRequest instance="WPDBUSENUMROOT\UMB\2&37C186B&0&STORAGE#VOLUME#_??_USBSTOR#DISK&VEN_SANDISK&PROD_SANDISK_CRUZER&REV_8.02#0774230A28933B7E&0#" lifetime="{4493DBFB-81E8-4277-933D-955C4DDDD482}" xmlns:auto-ns2="http://schemas.microsoft.com/win/2004/08/events" xmlns="http://www.microsoft.com/DriverFrameworks/UserMode/Event">
- <Request major="27" minor="20">
<Argument>0x0</Argument>
<Argument>0x141b</Argument>
<Argument>0x0</Argument>
<Argument>0x0</Argument>
</Request>
<Status>0</Status>
</UMDFHostDeviceRequest>
</UserData>
</Event>
"<request>"
USBドライブを接続すると、イベント2101がわずかに異なるタグで3回発生するようです。
<Request major="27" minor="20">
<Request major="27" minor="9">
<Request major="27" minor="0">
私はこれが何を意味するのかわかりませんが、ここでは複数のトリガーを回避するためにそのうちの1つだけのフィルターがあります:(これはこの特定のUSBドライブに対してのみトリガーされます)
<QueryList>
<Query Id="0" Path="Microsoft-Windows-DriverFrameworks-UserMode/Operational">
<Select Path="Microsoft-Windows-DriverFrameworks-UserMode/Operational">*[System[Provider[@Name='Microsoft-Windows-DriverFrameworks-UserMode'] and EventID=2101]] and *[UserData[UMDFHostDeviceRequest[@instance="WPDBUSENUMROOT\UMB\2&37C186B&0&STORAGE#VOLUME#_??_USBSTOR#DISK&VEN_SANDISK&PROD_SANDISK_CRUZER&REV_8.02#0774230A28933B7E&0#" and Request[@major="27" and @minor="20"]]]]</Select>
</Query>
</QueryList>
アンパサンドは次のようにエスケープする必要があることに注意してください &
他の人が述べたように、挿入されているUSBドライブと確実に相関するイベントは、サービスコントロールマネージャーからのシステムログイベント7036だけであるようです。USBドライブを挿入し、次のpowershellコマンドを実行して、過去1時間のすべてのソースからのすべてのイベントログエントリを一覧表示することで、これを確認しました。
get-winevent | where {$_.timecreated -ge (get-date) - (new-timespan -hour 1)}
残念ながら、サービスコントロールマネージャーがサービスを正常に開始または停止するたびにイベント7036が生成されるため、追加のフィルターが必要です。
イベントビューア/タスクスケジューラのGUIで利用可能なフィルタリングは非常に基本的であり、イベントデータのフィルタリングを許可しません-メタデータのみをフィルタリングできますが、この場合、どのサービスが変更された状態と変更された状態。これは、EventDataの「param1」と「param2」に保持されます。したがって、次のXPathフィルターを使用して、起動する関連サービスのみをキャプチャできます。
<QueryList>
<Query Id="0" Path="System">
<Select Path="System">*[System[Provider[@Name='Service Control Manager'] and (Level=4 or Level=0) and (band(Keywords,36028797018963968)) and (EventID=7036)]]
and
*[EventData[
Data[@Name="param1"]="Portable Device Enumerator Service" and
Data[@Name="param2"]="running"
]
]
</Select>
</Query>
</QueryList>
そこから、理想的には挿入されたUSBドライブが目的のものであることを確認するためにいくつかの追加のロジックを使用して、スクリプトを実行できます。
Applications and Service Logs-Microsoft-Windows-Ntfs_Operationalの下にあるイベントログから、より良い(IMO)イベントを見つけました。Eventid4。次のようになります。
イベントID 4 NTFSボリュームが正常にマウントされました。
Volume GUID: {55bf0ee3-d507-4031-a60a-22e5892ebf37}
Volume Name: E:
Volume Label: AirGapDrive A
Device Name: \Device\HarddiskVolume51
それから、スケジュールされたタスクトリガーを作成し、ボリューム名またはラベルでフィルタリングできます。このイベントはWindows Server 2019ボックスで見つかりましたが、何らかの理由でWindows 10(1809)デスクトップでは表示されません。サーバーのみのイベントの可能性があります。