PsExecの気色悪いつかいかた

こまごまとした作業タスクを消化していました。

バッチプログラムでわりと致命的な不備に直面しましたが、
力技で強引に回避しました。

一般権限のユーザから、他のバッチプログラムを管理者権限で実行する。
実行には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)
お仕事のご依頼・お問い合わせは こちら

コメント

  1. 川口 より:

    『set /pは本来、入力された文字列を変数に代入します。
    PsExecを経由すると、1文字目しか代入されません』 の部分ですが
    現在(2020/12)でも解決していないのですか?

  2. 当時の業務から離れてしまっているため検証ができず申し訳ないのですが、
    この記事よりも後にPsExecが更新されているようなので、そちらの更新内容次第では解消されているかもしれません。

    ただ、2020年現在で対応をするとしたら、PowerShellなどへの置き換えを検討した方がよいかな…?と思います。
    (取り組まれる課題や対象システムにもよりますが!)

タイトルとURLをコピーしました