こまごまとした作業タスクを消化していました。
バッチプログラムでわりと致命的な不備に直面しましたが、
力技で強引に回避しました。
一般権限のユーザから、他のバッチプログラムを管理者権限で実行する。
実行にはPsExecを利用する……そんな内容なのですが、
PsExecからバッチプログラムを実行した場合、「set /p」が
思わしくない動作をします。
具体的に書くと。set /pは本来、入力された文字列を変数に代入します。
PsExecを経由すると、1文字目しか代入されません。
しかも標準入力に改行コードか何かが挿入されているのかわかりませんが、
直後に再びset /pがあると、そちらは何も入力せずEnterを押した時の挙動になります。
まあPsExecを使ってはいますがネットワークは経由せず
ローカルで完結するものだったので、PsExec実行時に-iで
現在のセッションIDを指定し、同一セッションで管理者実行するようにしました。
……ここまで書いて、気づいてしまいました。
(……管理者権限ユーザでの動作確認しかしてないな?)という事実に。
通常権限ユーザで操作したら絶対上手く動かないぞ、これ。
別々のユーザで同一セッションIDを使おうとしているわけだし。
一応書いておくと、以下の行を実行することで
現在のセッションIDを取得することができます。
Win 2008/Vistaで確認しました。解説は省きます。
for /f "tokens=3 delims= " %%i in ('query session^|findstr "^>"') do set SESSION_ID=%%i
ついでに、ウィンドウが複数残って鬱陶しかったので、
PsExecを実行したコマンドにさっさと消えてもらうよう細工しました。
こちらは同一ユーザ・同一セッションに対してPsExecするのが前提なので、
役に立つ機会はないでしょうけれど。めっちゃネストしてます。
PsExec.exe cmd.exe /c start /i cmd.exe /c "起動対象バッチファイル"
このネスト具合をExcel関数風に記述すると、こうなります。
PsExec(cmd(/c, start(/i, cmd(/c, "起動対象バッチファイル"))))
それにしても詰めが甘い……ですね……
終わりや終わり! 終了!!
書いた人: 久世うりう (kuzeuriu) お問い合わせ