tmori3y2のブログ

主にWindowsのプログラムなど

DISM実行中にスリープやWindows Updateによる再起動をしないようにLinqPadでプロセス監視

tmori3y2.hatenablog.com

で書いたように、LinqPadでAPIを呼び出すと、LinqPadを終了するまで、電源要求を継続することは示せた。

しかし、元々はDismコマンドを実行中だけ電源要求したかったので、目的は達成できていない。

f:id:tmori3y2:20170219110647p:plain

LinqPadのサンプルにWindowを表示して非同期で処理をするサンプルがあったので、System.Diagnostics.Processクラスで実行ファイルリストを取得してDismが起動していたら、起動中に電源要求を行うスクリプトを書いてみた。 (Free版で実行できるため、開発環境のインストールは不要です)

LinqPad Script to avoid the sleep mode on running …

変更したのは、

  • Task.Delay()にCancellationTokenSource.Tokenを渡して、待機中にCancellationTokenSource.Cancel()が呼ばれたら例外が発生して中断するようにする
  • プロセスリストの処理中にCancellationTokenSource.Cancel()が呼ばれたら例外が発生させるように、CancellationTokenSource.Token.ThrowIfCancellationRequested()を呼び出す

使い方は簡単で、

  • Dismコマンドを実行する
  • LinqPadを管理者モードで起動して、Startボタンを押すとDismコマンドの監視を開始
    • Dismコマンドが起動していなかったらすぐに監視を終了する
    • Cancelボタンを押したら監視を終了する

f:id:tmori3y2:20170219112113p:plain

例えば、以下のコマンドだと、ダウンロードしたWindows.isoをEドライブにマウントした後に、Windows 10 Home (Index:2, Proなら1を指定)をwimに切り出す。(Proなら1を指定)

D:\1607>Dism /Export-Image /SourceImageFile:E:\sources\install.esd /SourceIndex:2 /DestinationImageFile:install2.wim /Compress:max /CheckIntegrity

展開イメージのサービスと管理ツール
バージョン: 10.0.14393.0

イメージをエクスポートしています
[===========================64.0%=====                     ]

電源要求の確認は、管理者モードのコマンドプロンプトでpowercfg /requestsを実行すると行える。

C:\WINDOWS\system32>powercfg /requests
DISPLAY:
[PROCESS] \Device\HarddiskVolume3\Users\xxxx\AppData\Local\LINQPad\ProcessServer5X86B\LINQPad.UserQuery.exe

SYSTEM:
[DRIVER] \FileSystem\srvnet
アクティブなリモート クライアントが、このコンピューターに最近要求を送信しました。
[PROCESS] \Device\HarddiskVolume3\Users\xxxx\AppData\Local\LINQPad\ProcessServer5X86B\LINQPad.UserQuery.exe

AWAYMODE:
[PROCESS] \Device\HarddiskVolume3\Users\xxxx\AppData\Local\LINQPad\ProcessServer5X86B\LINQPad.UserQuery.exe

実行:
なし。

PERFBOOST:
なし。

ACTIVELOCKSCREEN:
なし。

Dismコマンドの実行が終了したら監視も終了する。

D:\1607>Dism /Export-Image /SourceImageFile:E:\sources\install.esd /SourceIndex:2 /DestinationImageFile:install2.wim /Compress:max /CheckIntegrity

展開イメージのサービスと管理ツール
バージョン: 10.0.14393.0

イメージをエクスポートしています
[==========================100.0%==========================]
操作は正常に完了しました。

f:id:tmori3y2:20170219112618p:plain

C:\WINDOWS\system32>powercfg /requests
DISPLAY:
なし。

SYSTEM:
[DRIVER] \FileSystem\srvnet
アクティブなリモート クライアントが、このコンピューターに最近要求を送信しました。

AWAYMODE:
なし。

実行:
なし。

PERFBOOST:
なし。

ACTIVELOCKSCREEN:
なし。

ほんとは、TextBoxで監視対象のプロセス名を変更したかったのだが、IMEで変換した文字じゃないとなぜか入力できなかったので、dism固定にしてしまった。