9

次の2つのコードブロックを調べます。

System.Security.AccessControl.DirectorySecurity dsec = System.IO.Directory.GetAccessControl(str);
System.Security.Principal.NTAccount group= new System.Security.Principal.NTAccount("DOMAIN","USERGROUP");
System.Security.AccessControl.FileSystemAccessRule myrule = new System.Security.AccessControl.FileSystemAccessRule(group,System.Security.AccessControl.FileSystemRights.FullControl, System.Security.AccessControl.AccessControlType.Allow);
dsec.SetAccessRule(myrule);
System.IO.Directory.SetAccessControl(str,dsec);

System.Security.AccessControl.FileSecurity fsec = System.IO.File.GetAccessControl(file);
System.Security.Principal.NTAccount group= new System.Security.Principal.NTAccount("DOMAIN","USERGROUP");
System.Security.AccessControl.FileSystemAccessRule myrule = new System.Security.AccessControl.FileSystemAccessRule(group,System.Security.AccessControl.FileSystemRights.FullControl, System.Security.AccessControl.AccessControlType.Allow);
fsec.SetAccessRule(myrule);
System.IO.File.SetAccessControl(file,fsec);

どちらもまったく同じことを実行することを期待します。1つはディレクトリに対して、もう1つはファイルに対してのみです。そして、いくつかの点で、彼らはそうします。どちらの場合も、問題のファイルシステムオブジェクトは、DOMAIN\USERGROUPがフルコントロールの有効なアクセス許可を持つように変更されます。

ただし、奇妙な部分は、ファイルを右クリックしてセキュリティを表示すると、次のように表示されることです。 [ファイルセキュリティ]タブ

フォルダを右クリックしてセキュリティを表示すると、次のように表示されます。 [フォルダのセキュリティ]タブ

次に、[詳細設定]->[有効なアクセス許可]->[選択(DOMAIN \ USERGROUP)]に移動すると、そのグループのフォルダーの有効なアクセス許可がフルコントロールであることが示されます(フルコントロールボックスだけでなく、すべてのボックスがオンになっています) 。それはさらに奇妙だろう)。

私の質問は、ほとんど同じ実装の効果に違いがあるのはなぜですか?ファイルにアクセス許可を適用する効果を複製する方法を知っている人はいますか?

4

2 に答える 2

12

違いは、ディレクトリセキュリティの伝播フラグの関連性です。

var accessRule = new FileSystemAccessRule(
    identity: group,
    fileSystemRights: FileSystemRights.FullControl,
    type: AccessControlType.Allow,
    inheritanceFlags: InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
    propagationFlags: PropagationFlags.None);

設定に注意してくださいinheritanceFlags。指定しない場合、デフォルトはnoneで、「特別」として分類されます。

于 2013-01-16T06:36:35.320 に答える
0

これは、ファイルへのアクセス許可の追加に関してLoganを試すことができるものです。

ヘルプがあればこのコードを試してください

    public static bool CheckReadWriteAccces(string filePath, System.Security.AccessControl.FileSystemRights fileSystemRights)
    {
        FileInfo fileInfo = new FileInfo(filePath);

        string str = System.Security.Principal.WindowsIdentity.GetCurrent().Name.ToUpper();
        foreach (System.Security.AccessControl.FileSystemAccessRule rule in fileInfo.GetAccessControl().GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount)))
        {
            if (str == rule.IdentityReference.Value.ToUpper())
                return ((rule.AccessControlType == System.Security.AccessControl.AccessControlType.Allow) && (fileSystemRights == (rule.FileSystemRights & fileSystemRights)));
        }

        return false;
    }


    /// <summary>
    /// Make a file writteble
    /// </summary>
    /// <param name="path">File name to change</param>
    public static void MakeWritable(string path)
    {
        if (!File.Exists(path))
            return;
        File.SetAttributes(path, File.GetAttributes(path) & ~FileAttributes.ReadOnly);
    }
于 2012-08-07T18:45:29.447 に答える