2017/06/14

Recent entries from same category

  1. Golang で HTTP コンテンツの charset 判定をするには
  2. Golang の archive/zip でタイムゾーンの問題とファイル名の問題が解決した。
  3. Golang で優先度を変えてプロセスを起動する。
  4. net/http でレスポンスの内容を確認したいなら io.TeeReader を使おう
  5. Golang で物理ファイルの操作に path/filepath でなく path を使うと爆発します。

Windows で hosts ファイル(C:\Windows\System32\drivers\etc\hosts) を編集するには管理者権限が必要です。またコマンドラインから IP アドレスを変更するのにも管理者権限が必要です。管理者権限で hosts ファイルを編集するにはメモ帳を管理者権限で起動する必要があります。管理者権限でメモ帳を起動する為にはメニューから「メモ帳」を出し、右クリックして「管理者として実行」を選ぶ必要があります。そして実行したメモ帳のメニューから「開く」でファイルを選択します。管理者として開かないのであれば hosts ファイルを右クリックして「送る」等に登録したエディタを単に選べば済む話なのに、随分と手間ですね。

notepad

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

パイプで繋げたり出来ます。コマンドプロンプト内のコマンド(例: typeecho)は 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サービスをコマンドプロンプトから操作する事も出来るのでずいぶんと楽になりました。
ntservice

Windows でコマンドプロンプトで生活してて sudo したいという、かなり絞られたユーザ層に届けばいいなと思います。