Windows7のfile permission

変なタイトルだが,要は NTFS のファイルアクセス権の話.

Windows XP で運用していたマシンに Windows 7を入れた.特にアップグレードインストールをしたつもりではなかった (なかった...よなあ) のだが,いままで使っていたファイルがそれなりに残っていて,それなりに良かった反面,ファイルの使用権関係でたくさんトラブルも引き起こした.わかったことをメモしておく.

GUIから変更しようとすると大変になることが多い.死ぬほどボタンを押す羽目になったり.コマンドラインから行うのが得策.コマンドプロンプトを起動するとき,「管理者として実行」としないと,できないことがいろいろある.

アクセス権の変更は所有者にしかできない.したがって,まず所有者になる必要がある.takeown コマンドを使う.対象は「/F path」で指定する./Rをつけると再帰実行.例:

> takeown /R /F C:\tmp

変なpermissionがついている場合は,それを消したいかもしれない.その場合,以下のように実行.

> icacls C:\tmp /reset /t
> icacls C:\tmp /inheritance:r

「/inheritance:r」によって,ACLの上位からの継承が無効になる./resetで各位置で指定しているACLが廃棄される./tは,再帰指定.

最後に,適当なACLを指定する.cygwinで使う場合はこんなものではないだろうか:

icacls C:\tmp /grant myname:(CI)(OI)F SYSTEM:(CI)(OI)F Administrators:(CI)(OI)F Everyone:(CI)(OI)RX "CREATOR OWNER:(CI)(OI)F" "CREATOR GROUP:(CI)(OI)RX" None:(CI)(OI)RX 

もちろん,「myname」は,自分のログイン名.「F」がフルコントロールで,「RX」が読み取りと実行.「(CI)」と「(OI)」は,それぞれフォルダ(container)に対する継承指定とファイル(object)に対する継承指定.cygwinは,グループはデフォルトでNoneにするようだし,othersに対するパーミッションは,Everyone を使っているようである.

xml-rpc

ちょっと必要があって,xml-rpc をつかうことになった.perl インタフェースが何種類もあるようなのだが,どうも,RPC::XML というのが一番充実しているふうであるので,使ってみた.だいたいは期待したように動作しているのだが,ご多分にもれず(?)日本語がうまく動かない.いや,サーバから日本語データを引っ張ってくるのは問題なのだが,日本語データを送ろうとするとうまくいかない.

  $param = "ascii data";
  $resp = $xmlrpc->send_request('methodname', $param);

は,ちゃんと動くのだが,1行目を

  $param = "日本語データ";

とすると,Wide character in subroutine entry at /usr/lib/perl5/site_perl/5.10/RPC/XML.pm line 409. といって怒られる.

この「Wide character in ....」というのを見ると,それだけで絶望的な気分になるのだけれど,まあ,見てみるか,と思って Google を引くと,すばらしいまとめがあることがわかった: http://www.rwds.net/kuroita/program/Perl_unicode.html ありがたいことである.

で,あらためて怒られている409行目やその呼び出し元などを見てみると,utf8::downgrade() なる関数に,この "日本語データ" という string がわたっていることがわかる.http://perldoc.perl.org/utf8.html を見てみると,どうも,ここには Latin-1 しか渡せないように見える.うーん.こりゃ,一般のUTF-8をサポートしているわけではないということなのかね.

というか,どうも,これを呼んでいるのは,perlの内部表現たるstringでなくて,バイトシークエンスとしてみたいからのようだ (違うのかな〜?).だったら,utf8::downgrade() じゃなくて,utf8::encode() を使ったらいいのでは,と思って,全部書き直してみる.(実際には,utf8::downgrade() が直接書いてあるのではなく,別の関数を utf8::downgrade() に定義し直していたので,1箇所直せばすむ.)

すると,ここは通過して,サーバにデータが送られるようになった.だが,サーバからエラーが返る.調べると,生成される XML データの先頭に encoding="us-ascii" と書いてある.なんのこっちゃ.(この辺で,やっぱりあんまり東洋のことなど考えていないのね,という気持ちになってくる) 幸い,これは,RPC::XML::ENCODING なる変数の値に "UTF-8" を設定しておけばよい,とのこと.

以上で,とりあえず動作するようになった.RPC::XML を1箇所書き直しているのが問題だけど.実際は,書き直さなくても,"日本語データ" を Encode::encode_utf8("日本語データ") で置き換えると動作するのだが,なんかあんまりだなー,と思う.

ファイアウォール外のMS Winクライアントから,MS Winファイルサーバにsshを使って接続

表題の件 (共有フォルダへの接続) をやりたいと思っていたのだが,方法がわからなかったのだけれど,
http://datafarm.apgrid.org/software/html/ja/user/smboverssh.html
に書いてあった.感謝.ポートフォワードするのは良いが,MS Winのエクスプローラからはアドレスしか指定できないので,マシンを2台使えないとだめだよな―,と思っていたのだけれど,「仮想ネットワークインタフェース」という手があるんですね.

上記のサイトからのコピーだが,手順は以下の通り.

まず,セットアップとして,以下を行う.

  • コントロールパネルから,「ハードウェアの追加」を選び (Windows7 では,コマンドプロンプトを管理者権限で起動して hdwwiz.exe を実行),ネットワークアダプタMicrosoft Loopback Adaptorというのをインストールする.
  • すると,「ネットワーク接続」に,該当項目が現れるので,適当にリネームして,プロパティを選び,以下のように設定する.
    • Microsoft ネットワーク用ファイルとプリンタ共有」のチェックを外す
    • TCP/IP で,アドレス 169.254.0.1/255.255.0.0 を設定.これは,LINKLOCALアドレス(169.254.*.*)であるとやら.
    • TCP/IPの詳細設定で,「NetBIOS over TCP/IP を無効にする」を設定.

アクセスするときは,次のようにすればよい.

  • 作成した仮想ネットワークインタフェースの139番ポートを,MS Winファイルサーバの139番ポートに転送する: ssh -L 169.254.0.1:139:mswin_fileserver_address:139 ssh_server_address
  • エクスプローラで,\\169.254.0.1 にアクセス.