[samba-jp:20430] Re: 共有の権限をWindows側のプログラムで取得したいのですが
YAMASAKI Hiroyuki
yamasaki.hiroyuki @ sp.qnes.nec.co.jp
2008年 10月 7日 (火) 14:49:15 JST
山崎と申します。
>Samba のすべて にも書きましたが、share_info.tdb ファイルに格納されるは
>ずです。共有の ACL は、コンピュータの管理 - システムツール - 共有フォ
>ルダ - 共有 - 各共有 のプロパティから操作できます。
古いsamba3.0.10(usershare未対応)で確認したところ、
たしかに上記のプロパティから設定でき、動作も期待通りになりました。
共有のACLはshare_info.tdbに保存されているようです。
* * *
やったこと。
■事前のtdbの確認
・tdbdumpでshare_info.tdbをdumpしてみると、"INFO/version\00"のキーしか存在しません。
■共有にACL設定
・あらかじめACLを設定するユーザをsmb.confのadmin users = に書いておく必要がある。
・コンピュータの管理から、sambaの共有のACLを「Everyone:読み取りのみ」、「ユーザA :フルコントロール」に設定。
・設定後、もう一度表示すると、直前に設定した情報が得られる。(sambaがちゃんとどこかに記憶している)
■ACL設定後のtdbの確認
・tdbdumpでshare_info.tdbをdumpしてみると、"SECDESC/共有名\00"のキーが追加されていました。
"SECDESC"は security descriptor(≒ACL)の意味でしょうね。
■動作テスト
・WindowsからユーザAで共有に接続すると、新規ファイルを作成可能(=ユーザAはフルコントロールなので書き込み可能)
・WindowsからユーザBで共有に接続すると、新規ファイルの作成不可(=ユーザA以外はEveryone読み取りのみなので書き込み不可)
→実際のアクセス権はACLのとおりに効いているようです。
* * *
usershare対応前のsambaでも共有のACLは設定可能で動作も問題ないのはわかりました。
気になるのは、samba3.0.23以降のusershareのusershare_aclと、share_info.tdbに記憶する
共有のACLの関係です。
おそらく同じ意味の情報が二箇所に格納されていることになるので、
・どちらかしか使わないのか?
・なにかしらの優先順位があるのか?
が若干疑問です。
ちょっとソース(3.0.32)を見た感じでは、smb.confをparseするときに、usershareファイルの
usershare_aclに書かれているACLで、share_info.tdbのACLを上書きしそうに見えます。(以下)
動作の確認はしていません。
-----------------------------------------------------------------------------------------------------
/***************************************************************************
Deal with a usershare file.
Returns:
>= 0 - snum
-1 - Bad name, invalid contents.
- service name already existed and not a usershare, problem
with permissions to share directory etc.
***************************************************************************/
static int process_usershare_file(const char *dir_name, const char *file_name, int snum_template)
{
(略)
if (parse_usershare_file(ctx, &sbuf, service_name,
iService, lines, numlines, sharepath,
comment, &psd★, &guest_ok) != USERSHARE_OK) {
talloc_destroy(ctx);
file_lines_free(lines);
return -1;
}
(略)
/* Write the ACL of the new/modified share. */
if (!set_share_security(service_name, psd★)) {
DEBUG(0, ("process_usershare_file: Failed to set share "
"security for user share %s\n",
service_name ));
lp_remove_service(iService);
talloc_destroy(ctx);
return -1;
}
(略)
}
-----------------------------------------------------------------------------------------------------
samba-jp メーリングリストの案内