Windows で hosts ファイル(C:\Windows\System32\drivers\etc\hosts
) を編集するには管理者権限が必要です。またコマンドラインから IP アドレスを変更するのにも管理者権限が必要です。管理者権限で hosts ファイルを編集するにはメモ帳を管理者権限で起動する必要があります。管理者権限でメモ帳を起動する為にはメニューから「メモ帳」を出し、右クリックして「管理者として実行」を選ぶ必要があります。そして実行したメモ帳のメニューから「開く」でファイルを選択します。管理者として開かないのであれば hosts ファイルを右クリックして「送る」等に登録したエディタを単に選べば済む話なのに、随分と手間ですね。
UNIX だと
$ sudo vi /etc/hosts
とだけタイプすれば良いのにこの手数の多さはちょっとゲンナリします。特にマウスに手を伸ばしたくないからコマンドプロンプトを使っている僕の様な変な人には辛さしかありません。runas というコマンドを使えば sudo の様な事は出来るのですが、これはパスワード入力を要求されます。メモ帳を管理者として起動する場合だと UAC (User Account Control) のダイアログが表示されるだけなのに、いちいちパスワードなんか打ちたくありません。世の中には C言語で実装した物、タスクスケジューラを使って sudo ぽい事する物、powershell を使って実現している物、いろいろありますがそれぞれ難があるし出来ればキビキビ動くのが欲しかったので作りました。
GitHub - mattn/sudo: sudo for windows
README.md sudo for windows Usage C:\>sudo cmd /c dir Then, you'll see the UAC dialog. Tutorials Disp...
https://github.com/mattn/sudo
標準入出力を扱えるので
sudo cmd /c type secret-file.txt > accessible-file.txt
リダイレクトしたり
echo 123 | sudo my-command.exe | more
パイプで繋げたり出来ます。コマンドプロンプト内のコマンド(例: type
や echo
)は cmd /c echo
の様に起動する必要があります。普段は管理者権限が無いと実行出来ない netsh による IP アドレスの変更も簡単。
sudo netsh interface ip add address "ローカルネットワーク" 33.33.33.33 255.255.255.255
やりたかったメモ帳での hosts ファイル編集も
sudo notepad c:\windows\system32\drivers\etc\hosts
と簡単に出来る様になりました。これを実現する為に、ShellExecuteEx という API の Verb 指定に runas を付けて起動するという方法を取ったのですが、この API で起動したプロセスは、それを起動した同じコンソールを共有する事が出来なかったのでコマンドプロンプトから sudo vim
を実行できる様にする事は諦めました。一応、sudo -spawn vim foo.txt
で新しいコマンドプロンプトを起動するという機能を付けてありますので、どうしても vim じゃないと嫌だという方はそちらをお使い下さい。間違って起動してしまった場合も CTRL-C するとプロセスを終了する仕組みが入っています。NTサービスをコマンドプロンプトから操作する事も出来るのでずいぶんと楽になりました。
Windows でコマンドプロンプトで生活してて sudo したいという、かなり絞られたユーザ層に届けばいいなと思います。