web-dev-qa-db-ja.com

Windows 7のタスクスケジューラで安全なUSB自動実行を行うことは可能ですか?

Windows 7ではUSBドライブでの自動実行は許可されていません であることがわかりました。

USBドライブが挿入されたときに起動するタスクスケジューラでタスクを設定することで、これを(安全な方法で)回避することは可能ですか?一見したところ、イベントビューアに関連するイベントは見つかりませんでした。

5
Ville Koskinen

私はあなたと同じ質問をし、Scripting Guy Blog here および here の手法を使用して、PowerShell(Windows組み込みスクリプト)で何かを解決しました。スクリプトはバックグラウンドプロセスとして継続的に実行され、タスクスケジューラを使用してシステムログオン時に開始できます。新しいドライブが接続されて何かを実行するたびに、スクリプトに通知されます(ここでは、タスクではなくスクリプトを構成します)。基本的に、次の接続されたドライブを待つ間一時停止されるため、多くのリソースを消費することはないはずです。ここに行きます:

1)Powershell ISEを起動します。これは、[アクセサリ]/[WindowsPowershell]のスタートメニューにあります。

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 {"構成が変更されました"} 
 2 {"デバイスの到着"} 
 3 {"デバイスの削除"} 
 4 {"ドッキング"} 
} 
 write-Host(get-date -format s) "イベントが検出されました=" $ 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 
#ドライブが仕様に一致する場合にプロセスを実行する修正された条件
 if($ driveLetter -eq'Z: '-and $ driveLabel -eq'Mirror')
 {
 write-Host(get-date -format s)「3秒でタスクを開始しています...」
 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"

    やりたいタスクのパス。私の例では、3〜4個のバックアップタスクを開始するバッチファイルをUSBドライブに作成しましたが、それは何でもかまいません。

4)完了したら、スクリプトをどこかに保存し(拡張子.ps1)、タスクスケジューラでタスクを作成して、スクリプトをバックグラウンドで実行します。鉱山は次のようになります。

  • トリガー:ログオン時
  • 処置:プログラムを開始してください
  • プログラム/スクリプト:powershell
  • 引数を追加します:-ExecutionPolicy Unrestricted -File "D:\ Stuff\Backup script.ps1"

5)Voilà!

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」プロセスを終了できます。

4
mtone

いいえ。タスクスケジューラは使用できません。

USBデバイスを接続したときに発生する唯一のログイベントは、「ポータブルデバイス列挙」サービスを開始することです。ただし、anyサービスが開始されたandが停止したときに同じイベントが発生するため、タスクマネージャーでは使用できません。 (さらに、デバイスを接続したときにサービスがすでに実行されている場合、イベントは発生しません。)

2
subman

SB安全に削除にはそのような機能があります:USBデバイスが挿入されたときにプログラムを開始できます。

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

alt text

1
Snark

タスクスケジューラが適切なツールになるとは思いません。新しいUSBデバイスが追加されるたびに応答するものが必要です。これには、新しいUSBデバイスを検出できる専用のアプリケーションが必要になるため、Windowsの自動実行機能が置き換えられます。

はい、そのようなアプリケーションは可能です。ただし、作成するのは難しいでしょう。

タスクスケジューラを使用すると、自動実行を何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も開始することになります(まあ、画像が表示されます)。自動実行を2回使用しないようにするメカニズムが必要になります。また、自動実行が利用可能かどうかを検出するメカニズムが必要です。そうしないと、永遠のエラーメッセージが表示されてしまいます。それは、間に釘があることを期待して、ハンマーで壁を打つようなものです。スケジューラーは、いつ開始し、いつ停止するかを知りません。

0
Wim ten Brink