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

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

そうだと分かったWindows 7ではUSBドライブの自動実行は許可されません

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

答え1

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

1) スタート メニューの [アクセサリ]/[Windows Powershell] にある Powershell ISE を起動します。

2) 以下をPowershellにコピーして貼り付けます。

#バージョン2.0が必要です
Register-WmiEvent -Class win32_VolumeChangeEvent -SourceIdentifier volumeChange
write-host (get-date -format s) "スクリプトの開始..."
する{
  $newEvent = 待機イベント -SourceIdentifier volumeChange
  $eventType = $newEvent.SourceEventArgs.NewEvent.EventType
  $eventTypeName = スイッチ($eventType)
    {
    1 {"構成が変更されました"}
    2 {"デバイスの到着"}
    3 {"デバイスの削除"}
    4 {"ドッキング"}
    }
  write-host (get-date -format s) " イベントが検出されました = " $eventTypeName
  ($eventType -eq 2)の場合
  {
    $ドライブ文字 = $newEvent.SourceEventArgs.NewEvent.ドライブ名
    $driveLabel = ([wmi]"Win32_LogicalDisk='$driveLetter'").VolumeName
    write-host (get-date -format s) " ドライブ名 = " $driveLetter
    write-host (get-date -format s) " ドライブラベル = " $driveLabel
    # ドライブが指定された条件に一致する場合にプロセスを実行します
    if ($driveLetter -eq 'Z:' -and $driveLabel -eq 'Mirror')
    {
        write-host (get-date -format s) "3 秒後にタスクを開始します..."
     開始-スリープ-秒数 3
        プロセス開始 "Z:\sync.bat"
    }
  }
  削除イベント -SourceIdentifier ボリューム変更
} while (1-eq1) #次のイベントまでループ
登録解除イベント -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) 出来上がり!

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

答え2

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

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

答え3

USBの安全な取り外しUSB デバイスが挿入されたときにプログラムを起動できる機能があります。

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

代替テキスト

答え4

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

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

タスク スケジューラを使用するということは、自動実行を何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も何度も (まあ、お分かりでしょう) 繰り返し実行することを意味します。自動実行を 2 回使用することを防ぐメカニズムが必要になります。また、自動実行が利用可能かどうかを検出するメカニズムも必要です。そうしないと、エラー メッセージが永遠に続くことになります。壁をハンマーで叩きながら、間に釘があることを期待しているようなものです。スケジューラは、いつ開始していつ停止するかを知りません。

関連情報