USBデバイスの接続を検出して、スケジュールされたタスクを開始する


24

Win 7の自動実行(または自動再生?)の制限により、接続時にusbドライブからアプリケーションを起動することはできないことが説明されていますが、イベントタイプトリガーを持つスケジュールタスクを作成することは可能です。確かに、ドライブまたはUSBデバイスが接続されたときにイベントが発生するはずです。

誰がどのイベントIDを使用すればよいか、少しでもわかりますか?または、少なくともどのような種類のイベントですか?イベントビューアーのどこでイベントを見つけることができますか?

回答:


17

スレッドタスクスケジューラ: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」プロセスを終了できます。

唯一の欠点は、ドライブが既に接続されている状態でコンピューターを起動しても何も実行されないことです(最初のチェックを最初に実行するようにスクリプトを変更できますが、今日は十分です!)


これはうまくいくと思います。それを私いじくりをしてみましょう、私はあなたに戻って取得します
GiantDuck

1
ドライブで機能しています。どのように私は検出するために、これを変更することができます任意の USBデバイスがドライブのみを挿入して、ではありませんか?
GiantDuck 14年

EventType 2は、デバイスの到着を検出します。詳細を取得するには、イベントをさらに掘り下げる必要があります。最も簡単なのはのメンバーを印刷するかもしれない$newEvent.SourceEventArgs.NewEventあなたに興味を持っているイベントのために。
harrymc

ほぼ4年後に有望な答えを見ることができてうれしいです:) GiantDuckとharrymc、ありがとうございました。
gemisigo

@harrymcそのためのコンテキストを提供できますか?powershellを使用したことがありません。ありがとう!
GiantDuck

6

この議論ですでに説明したように(ただし、USBドライブが取り外されたときにプログラムを実行することについてでした)、USB Safely Removeは、無料ではありませんが、USBデバイスに関するイベントがトリガーされたときにプログラムを実行できます:

同様のソフトウェアと区別するもう1つのUSB Safely Remove機能は、デバイスを接続した後だけでなく、削除する前にアプリケーションを起動します。自動実行機能を使用すると、リムーバブルハードドライブを切断する前にデータバックアップを設定したり、ペンドライブの内容でTotal Commanderを実行したり、USBメディアを切断する前に暗号化されたTrueCryptドライブを自動的にアンマウントしたりできます。

ここに画像の説明を入力してください

もちろん、スケジュールされたタスクを使用することではないため、これは質問に完全に答えるわけではありませんが、USBスティックが差し込まれたときに特定のプログラムを実行するという目標は同じだと思います。


よろしくお願いします、良い回避策です。私はそれを試しましたが、それが適切に機能しているにもかかわらず、元の目標を達成しようとしています(つまり、ネイティブで利用可能な無料のソリューションを使用しています)。これまで、DriverFrameworks-UserModeのイベントID 2006イベントを使用して、アクションをトリガーできることがわかりました。それでもまだ完璧ではありません。必要な情報はイベントの詳細で入手できますが、特定のUSBドライブに対してフィルタリングすることはできません。そのため、USBドライブを接続するとトリガーが起動します。
ジェミシゴ

5

EventVwrを使用すると非常に簡単になります。

  1. 必要なイベントを見つける-USB大容量ストレージデバイスを接続すると、次のイベントが発生しました(アプリケーションカテゴリ):20001、20003、7036、およびその他の関連性の低いもの。誤検知を避けるために、これらのイベントを他のUSBデバイスイベントに対してテストしてください。

  2. イベントを右クリックし、[このイベントにタスクを添付](Windows Vista以降のみに関連-XPにはCLI EventTriggerがあります)をクリックし、[プログラムの開始]を選択して、実行するスクリプトを指定します。

  3. イベントパラメータをスクリプトに渡すには、この記事をご覧ください。イベント20001および20003の下で、新しいストレージへのUNCパスを見つけることができます。Sysinternals Junctionユーティリティを使用して、UNCパスへのリンクを作成できます。


私はこれのアイデアが好きですが、それは十分に詳細ではありません。私はそれを動作させることができません。
ジャイアントダック14年

@GiantDuck私にとっては、非常に簡単に見えますが、詳細を教えてください。
EliadTech 14年

イベントビューアーで上記のイベントを見つけることができません。(現時点ではWin8で)正確なパスは何ですか?ありがとうございました!
GiantDuck 14年

私が書いた、それは上記のイベント番号を含む「アプリケーション」ログの下にあります。しかし、Win7でこれをテストしたため、Win8ではイベント番号が異なる可能性があります。先ほど述べたように、プラグインしているデバイスで動作することを確認するために、とにかくテストを行う必要があります。
EliadTech 14年

1
Win10では、アプリケーションカテゴリに何も表示されませんでした。私は私が今までだけ、1つのデバイスを持っています原因システムにアクセスして、私のために、イベントID 98それの罰金に添付しなければならなかったが、他は動作しない場合があります
dbinott

2

これを機能させることができました:アプリケーションとサービスのログにイベント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&amp;PID_6860&amp;MS_COMP_MTP&amp;SAMSUNG_ANDROID.6&amp;3400EB54&amp;1&amp;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&amp;37C186B&amp;0&amp;STORAGE#VOLUME#_??_USBSTOR#DISK&amp;VEN_SANDISK&amp;PROD_SANDISK_CRUZER&amp;REV_8.02#0774230A28933B7E&amp;0#" and Request[@major="27" and @minor="20"]]]]</Select>
  </Query>
</QueryList>

アンパサンドは次のようにエスケープする必要があることに注意してください &amp;


1

他の人が述べたように、挿入されている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ドライブが目的のものであることを確認するためにいくつかの追加のロジックを使用して、スクリプトを実行できます。


0

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)デスクトップでは表示されません。サーバーのみのイベントの可能性があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.