6

特定のユーザーのUNCパスにNTFSアクセス許可を付与しようとしましたが、UNCパスによって動作が異なります。以下は、各シナリオでアクセス許可と結果を与えるために使用しているコード(MSDNから)です。

static void GiveNTFSPermissions(string folderPath, 
                                string ntAccountName, 
                                FileSystemRights accessRights)
{
    DirectorySecurity dirSecurity = Directory.GetAccessControl(folderPath);

    FileSystemAccessRule newAccessRule =
         new FileSystemAccessRule(
               ntAccountName,
               accessRights,
               AccessControlType.Allow);

    dirSecurity.AddAccessRule(newAccessRule);

    Directory.SetAccessControl(folderPath, dirSecurity);
}

ローカルマシンに「<em>RootShare」という名前の共有があり、その中に別のフォルダ「<em>InsideRootShare」があるとします。

シナリオ 1:電話すると、

GiveNTFSPermissions(@"\\sri-devpc\RootShare",
                    @"domain\username",
                    FileSystemRights.Write);

継承された権限が共有パスで失われました。

シナリオ2: 電話すると、

GiveNTFSPermissions(@"\\sri-devpc\RootShare\InsideRootShare", 
                    @"domain\username", 
                    FileSystemRights.Write);

継承された権限はそのままでした。

私はさまざまなコンストラクターを試してみましFileSystemAccessRuleたが、運がありません。

この動作の背後にある理由と、これに対する回避策は何ですか?

4

1 に答える 1

5

Dropkick のセキュリティ モジュールの作業中に、ファイル システムのアクセス許可を操作する際に、同様の問題に遭遇しました。私たちが思いついた解決策は次のとおりです。これにより、フォルダーの継承ルールを変更せずに、フォルダーのアクセス許可を正常に設定できます。

    public void SetFileSystemRights(string target, string group, FileSystemRights permission)
    {
        if (!IsDirectory(target) && !IsFile(target))
            return;

        var oldSecurity = Directory.GetAccessControl(target);
        var newSecurity = new DirectorySecurity();

        newSecurity.SetSecurityDescriptorBinaryForm(oldSecurity.GetSecurityDescriptorBinaryForm());

        var accessRule = new FileSystemAccessRule(group,
                                                  permission,
                                                  InheritanceFlags.None,
                                                  PropagationFlags.NoPropagateInherit,
                                                  AccessControlType.Allow);
        bool result;
        newSecurity.ModifyAccessRule(AccessControlModification.Set, accessRule, out result);

        if (!result) Log.AddError("Something wrong happened");

        accessRule = new FileSystemAccessRule(group,
                                              permission,
                                              InheritanceFlags.ContainerInherit |
                                              InheritanceFlags.ObjectInherit,
                                              PropagationFlags.InheritOnly,
                                              AccessControlType.Allow);

        result = false;
        newSecurity.ModifyAccessRule(AccessControlModification.Add, accessRule, out result);
        if (!result) Log.AddError("Something wrong happened");

        Directory.SetAccessControl(target, newSecurity);

        if (result) Log.AddGood("Permissions set for '{0}' on folder '{1}'", group, target);

        if (!result) Log.AddError("Something wrong happened");
    }

これを理解するために最初に使用したリンクを見つけました。

于 2012-09-13T16:57:44.910 に答える