Pseudo Sudo Window
プロセス起動支援ツール 須藤先生

説明

 プロセス起動の支援ツールです。
 管理者権限のあるアカウントでUACの警告を出さずに管理者権限でプロセスを起動するツールです。(※インストール時に一度だけ管理者権限が必要です)
 TaskScheduler2.0を持たないXP以前のマシンでは通常のランチャーとして動作します。
 他にも以下のような場面で、コマンドラインやショートカット等から手軽に利用できます。

 Windows 2000以降専用です。Unicodeによるファイル名指定に対応しています。
 付属のインストーラはWindows 7用です。XP以前の環境の場合はインストール操作は不要です。

もうちょっと説明

 Windowsのウザさの象徴UAC。人類から夢と希望とやる気とキャッシュを吸い続けるWindowsの基本理念に違わず、奴等はこの先数世代に渡って我々の前に立ち塞がることでしょう。
 そんなわけで、Windows 7の時代になってもなんだかんだいって「管理者として実行」が必要な場面に遭遇します。断腸の思いでソレを選択したが最後、その後に待ち構えているのはお楽しみシーン、UACのダイアログ操作です。「はい」と書かれたボタンを画像認識してスイッチを押すだけの簡単なお仕事とはいえ、サードパーティのリモート操作ツールなどで清く正しく趣味のハッキングを楽しんでいる最中に、ついうっかりこのダイアログとご対面などしちゃった日には、バストアップで絶望の意を絶叫するしかないかもしれません。悪のクラッカーの野望を挫くためならともかく、どこにでもいる善良な一市民をこんなところで足止めする機能なぞ言語道断です。

 ところで、管理者として実行を行なうには、プロパティで管理者実行属性をつけておく、Manifestなどを埋め込む、といった事前設定を行なったり、マウス操作で「管理者として実行」を選ぶなどの操作が必要です。このあたりの操作をコマンドライン側から行なうツールとしてElevation PowerToys等があります。ちなみに本プログラムはこうした用途にも利用可能です。

 さて、UACを突破する方法としては、標準コマンドであるrunasを利用した方法がよく知られています。

runas /savecred /user:Administrator cmd

 こんな感じで起動してやれば、最初の一回だけパスワード入力を求められますが、以後はいつでも管理者としてコマンドが実行できます。
 しかしこの方法には以下のような問題があります。

 本プログラムは、上記の問題を改善し、インストール時に一回だけUACによる管理者権限をもらうだけで、その後はログオフや再起動が起きても、UACに邪魔されることなくいつでもお気楽極楽に絶対遵守の力が欲しい、そんなちっぽけな願いを少しだけ叶えるツールです。用量・用法を守って正しくお使いください。

インストール/アンインストール方法

 アーカイブ内の実行ファイルを適当な場所に置くだけでOKです。
 レジストリは使用していないため、ファイル削除だけでアンインストールできます。

 必須事項ではありませんが、実行ファイルはパスの通った場所に置いておくと便利です。
 64ビット環境では64ビット版の実行ファイルの利用を推奨します。アーカイブ内のx64フォルダにあるので差し替えて利用してください。

 UACの回避を行なう場合は、タスクスケジューラへの登録が必要です。登録の際は管理者権限が必要となります。
 do.exeをインストールしておきたい場所に起いた上で同じ場所にdo_install.batを置き、do_install.batを管理者権限で実行してください。
 タスクスケジューラのルートフォルダにadmとusrの2つのタスクが登録されます。

 アンインストール時は任意のパスに置いたdo_uninstall.batを実行してください。こちらは自動的に管理者権限になって実行されます。
 タスクスケジューラからタスクが削除されます。

利用例

 基本的な呼び出し形式について以下に例を示します。オプション等の詳細については後述します。

do adm cmd
管理者権限でコマンドプロンプトを起動する(UAC回避)

do uac cmd
管理者権限でコマンドプロンプトを起動する(制限状態の場合はUACダイアログが出現する)

do usr cmd
制限状態でコマンドプロンプトを起動する(権限の状況に関らず制限状態のプロセスを起動)

do -d5000 notepad
5秒後にメモ帳を起動する

do -s2 notepad
最小化状態でメモ帳を起動する

do -k notepad
メモ帳が起動していたら終了させる
終了処理はアプリケーション側に依存する(メモ帳の場合、編集中なら終了確認ダイアログが出る)

do -t notepad
メモ帳が起動していなければ起動し、フォーカスされていなければ最前面へ、そうでなければ最小化する

do -x a -x b -x c d
a b c d 4つのプロセスを同時に起動する

do
何も指定がない場合はカレントディレクトリをシェルで開く

do C:
Cドライブをシェルで開く

do adm regedit (作業フォルダを C:\Windows に設定)
こんな感じで管理者権限が必要なアプリケーションをショートカットに登録してみたり

do -b mstsc target.rdp
二重起動判定処理のないアプリケーションを二重起動せず最前面にする、といった用途にも

利用方法

 コマンドラインやショートカットから以下のように呼び出して利用します。

do [オプション] [実行対象]

 本プログラムは、起動するとコマンドラインの先頭から順番にオプションを解釈します。
 オプション以外の文字列が最初に出現した位置以降を実行対象とみなし、解釈したオプションに従ってプロセス起動やメッセージ送信などの動作を行ないます。

 起動時に、コマンドライン内の%で囲まれた文字列は対応する環境変数の内容で置き換えます。この展開には起動時に受けとった環境変数の情報を利用して行ないます。(例: %ProgramFiles% → C:\Program Files)

 オプション指定文字としては / または - または -- が利用可能です。
 オプションは先頭の1文字で判定されます。大文字・小文字は区別しません。

 実行対象としては以下のものが指定可能です。

・通常ファイル名・フォルダ名 例:
・URL 例:

 オプションは省略可能です。省略した場合は実行対象の常時起動の動作を行ないます。
 実行対象は省略可能です。省略した場合、カレントディレクトリをシェルで開く動作を行ないます。

オプションについて(1/5) 起動方法の指定

 起動方法として、以下のどれか1つを選択できます。省略した場合はexeとなります。
起動オプションを複数指定した場合、直前に指定したものが有効となる
タスクスケジューラと接続する場合はインストーラによるタスク登録が必要
タスクスケジューラを経由した場合、環境変数は引継がれない
タスクスケジューラとの接続に失敗した場合は親プロセスの権限で起動する

EXE
起動処理を親プロセスの権限で行なう (default)

UAC
起動処理を管理者権限で行なう。通常権限だった場合はUACのダイアログが出るので注意

ADM
起動処理をタスクスケジューラ経由で行ないUACを回避して管理者権限にする

USR
起動処理をタスクスケジューラ経由で行ないユーザ権限にする

 起動方法の指定だけ通常オプションと異なり、コマンド名のような指定方法になっているのは、かつて adm.exe とか usr.exe という別コマンドで機能が分かれていた頃の名残りです。

オプションについて(2/5) タスクスケジューラ経由時に引き継がれるオプション

 動作オプションとして、カレントディレクトリの指定や環境変数の再構築、起動時のウィンドウ状態などを指定することができます。動作オプションには2種類あり、タスクマネージャを経由して効力が引継がれるタイプとそうでないタイプがあります。以下のオプションはタスクマネージャを経由しても設定が引継がれます。

-C <カレントディレクトリ> (Current directory)
カレントディレクトリを指定する
(指定しなかった場合はdo.exeが実行された際のカレントディレクトリが引継がれる)

-A (At same directory)
カレントディレクトリを実行ファイルのパスと同じ場所にする
実行対象にパス区切り文字が存在する場合、プログラム名部分を除いた部分が
カレントディレクトリとなる。パス区切り文字がない場合は何もしない
-cと-aを同時に指定した場合、実行対象にパス名が存在する場合は-aが優先される
カレントディレクトリ設定機能のないランチャやコマンドプロンプトから実行する場合等に、入力文字数を横着したい時に利用する

-E (regenerate user Environment)
システム環境変数を再構築する(未公開APIを使ってるので将来動かなくなる可能性あり)
親の環境変数を引き継がずにシェルが使っているシステム環境変数を反映させたい場合に指定する
タスクスケジューラを経由する場合はこのオプションを付けるとよい
ランチャー系のプログラムで指定すると吉

-S <数値> または -S<数値> (Show)
プロセス起動時のウィンドウ状態を数値で直接指定する
オプション省略時はOSのデフォルト処理に任せる
  1. [ウィンドウ状態] [指定する数値]
  2. SW_HIDE 0
  3. SW_SHOWNORMAL 1
  4. SW_NORMAL 1
  5. SW_SHOWMINIMIZED 2
  6. SW_SHOWMAXIMIZED 3
  7. SW_MAXIMIZE 3
  8. SW_SHOWNOACTIVATE 4
  9. SW_SHOW 5
  10. SW_MINIMIZE 6
  11. SW_SHOWMINNOACTIVE 7
  12. SW_SHOWNA 8
  13. SW_RESTORE 9
  14. SW_SHOWDEFAULT 10
  15. SW_FORCEMINIMIZE 11
値0で起動した場合はウィンドウの存在そのものが消えて操作できなくなるので注意
普通ならコンソール窓が表示されるスクリプトの処理を、モニタの前の人間に気づかれないようにウィンドウを隠してこっそり実行したいなんて時に(ry

-. (punctuate task scheduler)
内部動作用
タスクスケジューラを経由した際に自動的に追加される
直後にShellExecute APIの実行が必要な場合のみ、再度do.exeのプロセスを経由する

オプションについて(3/5) タスクスケジューラ経由とは無関係なオプション

 タスクスケジューラ経由での呼び出しと無関係なオプションは以下の通りです。

-D <数値> または -D<数値> (Delay)
指定した時間(単位ms)が経過するまで待ってから起動する
値が0(デフォルト値)の場合は即時処理となる
一般的なウィンドウアプリケーションと同様、呼び出し元には即座に復帰する
待機時は独自処理を用いているため、タスクスケジューラが無効化されていても動作する

-X <コマンドライン> (execute eXtra process)
追加でプロセスを起動する
何個記述してもよいのでマルチステートメント表記として利用可能
コマンドラインに空白を含む場合は、ダブルクォートまたはシングルクォートで囲む
このオプションより前に指定したexe, uac, adm, usr, -c, -a, -e, -sの内容が反映される
即時処理されるため-dオプションや動作モード、追加動作に関する指定は反映されない

-V (Verify all window handles for special process)
ウィンドウの最前面判定処理を変更する
すべてのウィンドウを探索し、操作対象ウィンドウとプロセスIDが一致し、アイコン化されているウィンドウが1つも存在せず、フォアグラウンドになっているものが1つでもあれば最前面と判定する
上記条件のため、同一名称の複数プロセスが存在する場合は-Rオプションの影響を受ける

-R (Reverse window search)
操作対象ウィンドウの検索順序を逆にする
Zオーダー最奥のウィンドウが対象になる

-F (Force terminate)
プロセス終了が必要な場面において
TerminateProcess APIを用いて強制的にプロセス終了処理を行なう
タスクマネージャでの強制終了と同様の効果があるため、利用には注意すること
安全のため単独指定では機能せず、-kと同時に指定した時のみ有効になる

オプションについて(4/5) 動作モードの指定とプロセス起動判定について

 本プログラムでは単にプロセスを起動させるだけではなく、状況に応じてプロセス削除などの他の動作を行なうことが可能です。
 オプション指定と動作内容の対応は以下の通りです。
  1. [動作モード] [追加動作] [プロセス起動動作]
  2. 0. なし なし 常に起動を行なう
  3. 1. なし -b, -l, -k, -m, -y指定時 起動を行なわない
  4. 2. -o なし プロセスが存在しない時だけ起動を行なう
  5. 3. -o -b, -l, -k, -m, -y指定時 プロセスが存在しない時だけ起動を行なう
  6. 4. -t なし プロセスが存在しない時だけ起動を行なう
  7. 5. -t -b, -l, -k, -m, -y指定時 プロセスが存在しない時だけ起動を行なう
  8. 6. -t -o同時 なし 起動を行なわない
  9. 7. -t -o同時 -b, -l, -k, -m, -y指定時 起動を行なわない

-O (execute Once / anOther / nOne)
プロセス起動の動作基準を変更する(前述)

-T (Toggle window focus)
プロセス起動の動作基準を変更する(前述)
ウィンドウが最前面になかったりアイコン化されている場合は最前面にする
既に最前面にある場合は、デフォルト動作ではウィンドゥの最小化を行なう
さらに本オプション指定時は、次章で説明する追加動作の判定基準が変化する
デフォルト時(オプション指定がない場合)は(1)プロセスが存在する場合であれば追加動作を行なうが
本オプション指定時は(1)プロセスが存在し、かつ(2)対象のウィンドウが最前面にある時の2つの条件を満たした時だけ追加動作を行なう

-N <プロセス名> (process Name)
検索対象となるプロセス名を直接指定する
プロセス名に空白を含む場合は、ダブルクォートまたはシングルクォートで囲む
本オプションの指定がない場合、実行対象のファイル名部分から拡張子を取り除いたものをプロセス名とする

オプションについて(5/5) プロセス存在時の時追加動作

 対象プロセスが存在する場合には、プロセス起動以外の動作を行なわせることができます。(-tオプション指定時は対象ウィンドウが最前面になっていることも条件となります)
 追加動作として、以下のうちどれか1つを指定することができます。
 複数指定した場合は最後に指定した動作のみが行なわれます。

-B (Bring to top)
ウィンドウを最前面に移動する
SetForegroundWindow APIとBringWindowToTop APIを発行する

-L (Lowest order)
ウィンドウを最背面に移動する
SetWindowPos APIを発行する

-K (Kill process)
プロセスを終了させる
通常はメインウィンドウへのWM_CLOSEメッセージの送信を行なう
-fが同時に指定されている場合はTerminateProcess APIを用いて強制終了を行なう

-M <メッセージ番号>[,[,]] (post window Message)
ウィンドウメッセージを送信(Post)する
Windowsのウィンドウメッセージ番号を数値で直接指定する
WPARAM/LPARAM値は省略可能 (省略時は0となる)
メッセージ番号が0x8000+nの場合はShowWindow APIを使用しnの値を設定する(-sオプション参照) (第二, 第三引数は無視される)
旧バージョンとの互換性のため、メッセージ番号が0xF000以上の場合は、メッセージ番号WM_SYSCOMMANDが自動的に内部で追加され、第一引数をWPARAMの値、第二引数をLPARAMの値として扱う (第三引数は無視される)
  1. メッセージ番号の例
  2. [送信したいメッセージ] [指定する数値]
  3. WM_CLOSE 16
  4. WM_QUIT 18
  5. WM_USER 1024
  6. SC_SIZE 0xF000
  7. SC_MOVE 0xF010
  8. SC_MINIMIZE 0xF020
  9. SC_MAXIMIZE 0xF030
  10. SC_NEXTWINDOW 0xF040
  11. SC_PREVWINDOW 0xF050
  12. SC_CLOSE 0xF060
  13. SC_RESTORE 0xF120
  14. SC_TASKLIST 0xF130
  15. SC_SCREENSAVE 0xF140
想定されていない値を送ると相手が突然死したりすることもあるので注意

-Y <コマンドライン> (Yet another process)
対象プロセスとは別のプロセス(削除用プロセスなど)を起動する
コマンドラインに空白を含む場合は、ダブルクォートまたはシングルクォートで囲む

オプションについて(6/5) おまけ解説

 なんだかオプション指定が複雑で何が何だかわけわからん!とお悩みの諸兄諸姉の皆様のために、ここでオプション指定の組み合わせ例を紹介します。

  1. [コマンド] [プロセスfoo存在時] [プロセスがない時]
  2. do foo fooを起動する fooを起動する
  3. do -o foo 何もしない fooを起動する
  4. do -b foo ウィンドウを最前面へ 何もしない
  5. do -l foo ウィンドウを最背面へ 何もしない
  6. do -k foo ウィンドウを閉じる 何もしない
  7. do -k -f foo プロセスを強制終了する 何もしない
  8. do -m16 foo ウィンドウを閉じる(-kと等価) 何もしない
  9. do -m0xF020 foo ウィンドウを最小化する 何もしない
  10. do -m0xF120 foo 最小化を解除する 何もしない
  11. do -m1024 foo WM_USERを送る 何もしない
  12. do -y bar foo barを起動する 何もしない
  13. do -o -b foo ウィンドウを最前面へ fooを起動する
  14. do -o -l foo ウィンドウを最背面へ fooを起動する
  15. do -o -k foo ウィンドウを閉じる fooを起動する
  16. do -o -m1024 foo WM_USERを送る fooを起動する
  17. do -o -y bar foo barを起動する fooを起動する
  18. do -o -y bar -n foo baz barを起動する bazを起動する
  19. [コマンド] [ウィンドウが最前面] [ウィンドウが前面以外] [プロセスがない時]
  20. do -t foo ウィンドウを最小化する ウィンドウを最前面へ fooを起動する
  21. do -t -l foo ウィンドウを最背面へ ウィンドウを最前面へ fooを起動する
  22. do -t -k foo ウィンドウを閉じる ウィンドウを最前面へ fooを起動する
  23. do -t -m1024 foo WM_USERを送る ウィンドウを最前面へ fooを起動する
  24. do -t -y bar foo barを起動する ウィンドウを最前面へ fooを起動する
  25. #707070">※do -t -oは使う場面がなさそうだが以下の通り
  26. do -t -o foo ウィンドウを最小化する ウィンドウを最前面へ 何もしない
  27. do -t -o -l foo ウィンドウを最背面へ ウィンドウを最前面へ 何もしない
  28. do -t -o -k foo ウィンドウを閉じる ウィンドウを最前面へ 何もしない
  29. do -t -o -m1024 foo WM_USERを送る ウィンドウを最前面へ 何もしない
  30. do -t -o -y bar foo barを起動する ウィンドウを最前面へ 何もしない

オp…応用例

 オプション指定を駆使することで、細かく動作を切り替えることができます。

(例1)
do adm -x cmd usr -x cmd exe cmd
コマンドプロンプトを3つ起動。それぞれ管理者権限、ユーザ権限、親プロセスの権限となる

(例2)
do adm do -o -k osk
do adm do -o -k Magnify
スクリーンキーボードや拡大鏡のON/OFF
OSの入力支援機能などの一部のプロセスは、内部では管理者権限で動いているため、一旦管理者権限でdoを動作させてそこでプロセス検索を行なわせる
この手順を踏まずに制限モードでプロセス検索を行なった場合、プロセスと対象ウィンドウを発見することができないので注意
なお、入力支援用のプロセスは、相性の悪いウィンドウが前面にいたりすると起動しなかったりすることがある模様

(例3)
do -t notepad
do -t -n notepad
標準的な環境においてはどちらも同じ動作となる
前者はメモ帳(notepad + ファイル名)を開く/閉じる
後者は指定ファイル(memo.txtに関連づけられたアプリ)を開く/閉じる

(例4)
do adm -x 'do -k -f ZetPointII' -o -d2000 ZetPointII
管理者権限でZetPointIIのプロセスを強制終了させ、2秒後にプロセス終了を確認しつつ管理者権限で起動しなおす。タスクマネージャから再起動を何回も実行しなければならないような不幸な事態にショートカットを作っておけばマウス一つでらくらく操作(ry

(例5)
do -d1000000 killme
do -k do
遅延起動の待ち状態になっている自分以外のdoプロセスを1つ終了させる
(プロセス検索時、自分自身は対象外となる)

(例6)
do --kill explorer
エクスプローラの終了 (OS終了の確認画面になる)
do --kill --force explorer
エクスプローラを強制終了させる (エクスプローラだけが自動的に再起動する。取扱注意)
-fオプション指定時はアプリ側に備わっているデータ保存ダイアログなどの処理を経由せず強制終了するので、取り扱いには注意すること

技術情報

 動作試験はWindows 7 Ultimate x64版のみで行なっています。
 コマンドラインのUnicode指定に対応しています。Windows NT系専用です。
 限定的ですがUACの存在を無効化するツールですので、利用には十分注意してください。

 UACの突破のため、Vista以降のタスクスケジューラ2.0を利用しています。
 タスクスケジューラにあらかじめdo.exeを最大権限で登録しておき、他の場所から呼び出されたdo.exeからタスクスケジューラへカレントディレクトリやコマンドライン等のパラメータを渡し、異なる権限で新たにdo.exeを起動させ、そこから目的のプロセス起動を行なっています。
 さらにその逆に、do.exeを制限権限でも登録しておくことで、管理者権限状態のプロセスから制限状態のプロセスを起動することもできます。

 64ビット環境では64ビット版を利用してください。32ビット版でもある程度の利用は可能ですが、32ビットプロセス側からは64ビットプロセスのハンドル取得等に失敗するため、プロセスの検索が行なえずトグル動作などが正常に動作しません。
 親プロセスの権限や32/64ビット等の違いによく留意して使ってください。手抜き実装のため、管理者権限で動いているプロセスは通常権限で動いている本プログラムからは検出できませんので注意してください。

 タスクスケジューラ経由で起動したプロセスは優先順位が通常より低い値(6)になっているので、CreateProcess APIで標準優先度(8)で動作するよう設定を行なっています。ShellExecuteの実行ではプロセスの実行優先度を変更することができないため、経由直後にShellExecuteが必要な場合は、一旦ダミーのdo.exeを経由してからShellExecuteを実行するようになっています。
 また、タスクスケジューラを経由した場合、タスクスケジューラが持つ環境変数、すなわちログオン時の環境変数が使用されます。システム環境変数の更新が反映されないと何かと不便な用途もあると思われますので、そういった場合は-eオプションを使って環境変数の再構築を行なうとよいでしょう。ただし、システム環境変数の再構築は未公開APIを使って行なっているため、将来のWindowsで同等の動作をする保証はありません。

プロセス名からウィンドウハンドルを検索する方法について(暫定版)

 本プログラムでのウィンドウハンドル検索は以下の手順で行なっています。SysinternalsのProcExpの動きを(見よう見真似で)参考にしています。ProcExpと同一性能にはまだまだ至っていないと思います。
 ProcExpと異なり、本プログラムでは1つのプロセスに対する複数のウィンドウを正順または逆順に選択する必要もあるため、処理は完全に同じではありません。
 良い改良のアイディアがあればぜひお知らせください。

 判定Aだけでは、タスクトレイ未対応のアプリを強制的にタスクトレイに収納するようなユーティリティに対処できないので、さらに追加判定が必要となります。
 AとBを同時に判定するとOffice系アプリなどのGDI+ Window窓が反応してしまうので、最終的にAを満たさなかった時だけBの判定が有効になるように実装するのがポイントです。

 SysinternalsのProcExpを持ってしてもハンドルを発見できないアプリケーションについては本プログラムでも対応しません。例えばWLM2009をVista互換モードでタスクトレイに収納している状態などです。こういうものは専用ツールで対処することにします。

 なお、Office系はOffice XPのみ動作確認を行ないましたが、上記のアルゴリズムだけでは、正直まだまだといった感じです。1プロセスあたりウィンドウが1枚の時は意図した通りに動くのですが、ウィンドウを2枚以上所持しているプロセスがあるとうまくハンドルを選択してくれなかったりします。仕様です。やる気が出たらなんとかするかも。

改変履歴

◆2010.05.01 version 0.00

◆2010.05.16 version 0.10

◆2010.05.19 version 0.11

◆2010.06.05 version 0.20

◆2010.06.22 version 0.21

◆2010.06.24 version 0.21b

◆2010.10.29 version 0.22

 どのみちXP SP1より古いカーネルは華麗にスルーされるだけ。Let's 自己責任。
 モジュール名が同じでプロセスが異なるウィンドウが複数存在する場合、-Rオプション指定で順番に切り替わるようにした。
 強制終了時のプロセスID選択処理も変更。ウィンドウが見つかった場合は該当するウィンドウを持つプロセスIDを、ウィンドウが見つからない場合は最初(-Rオプション時は最後)に見つけたプロセスIDを使用する。
 SysinternalsのProcExpとほぼ同じ動作となるようにしたつもり。
 1枚のウィンドウに対して複数の独立したウィンドウハンドルを持つアプリケーションのごく一部で、正常にウィンドウの最前面状態をうまく判定できないものが存在する。こうしたアプリに対応するため、本オプション指定時は全ウィンドウを探索して最前面の判定を行なう。
 この判定方式は1プロセスで複数のウィンドウを扱うタイプと相性が悪いため、普段は無効化してある。
 VCLアプリケーションで-Tオプションが動作しない場合は、-V -Rを併用すると動くようになるかも。

◆2010.11.03 version 0.22a

 -Tオプション指定時に0.21系と異なる動作があったので修正

◆2011.03.07 version 0.23

 -Mオプション使用時にLPARAMとWPARAMの値も指定できるように改良

 以降は開発用のメモとなります。読む必要はありません。

 コマンドライン後半部分は解析されずに次のプロセスへまるごと引き渡されます。この特性を利用することで、doプロセスの多段呼び出しが可能です。

 -tオプションはコマンドラインから起動してもあまり意味はありません。適当なショートカットキー拡張ツールなどと組み合わせて使います。

 シェル実行の実装は手抜きです。"open" を使っているため、.rdpなどの一部の関連付けはファイル名だけの指定では起動できません。この場合はアプリ名とファイル名の両方を指定して起動してください。

 タスクスケジューラ経由で起動したプロセスは、通常のシェルから起動されたプロセスとほとんど同じ状態になるはず…だったのですが、ProcExpで見るとMemory Priorityの値が微妙に小さかったりします。どうすればいいんだ。

 非常に稀なタイミングで、 タスクスケジューラでの実行が長時間遅延されてしまうことがあるようです。原因不明かつ状況再現が非常に困難なのでまだ追えていません。

未実装

###未実装
 ヘルプ機能を利用する場合は、HTMLファイルかTXTファイルのどちらかを実行ファイルと同じ場所に置いてください。

###未実装
 自分自身のプロセス名と同じ名前の環境変数の内容がコマンドラインの先頭に合成されます。
 例えば、以下の例はdo adm cmdと同じ動作になります
mklink sudowin.exe do.exe
set sudowin=adm (実際はシステム環境変数に登録する)
sudowin cmd

###未実装
-?
オプション解説メッセージを出力し終了する
コンソールが存在しない場合は何も出力せず終了する

### 未実装
-i[nstall]
-u[ninstall]
-w[indow] <ウィンドウ名> -g[eneric]

###未実装

TODO

むせる

 VC6では64ビット版が作れないのでVC10を試したら、CランタイムにWindows 2000さん未対応のAPIを混ぜて露骨なOS乗り換えを促進してて絶望した。
 MinGWを使ってみたらCOM回りのヘッダが未実装で、結局全部自前で書くはめになったでござるの巻。
 プログラムのファイルサイズとか-dで待機中のメモリ消費削減とか頑張ってみたけど地味すぎた。

 ちなみにこのプログラムのコア部分は10年前くらいから使ってるショートカットキー拡張ツールのプロセス起動部分の焼き直しだったりします。そのうち気が向いたら他の処理も切り出して公開します。

co (Twitter)

inserted by FC2 system