13

ファイルが作成されたか、そのディレクトリにコピーされたかのように、親から継承されるファイルのアクセス許可をリセットする方法をc#で探しています。

ファイルの観点からは、これについて何も見つからないようです(ディレクトリの参照を1つか2つ見つけましたが、何らかの理由でそれらをファイルに変換することができません)。C#-WindowsACL-継承されたアクセス許可の適用など。しかし、の値がどうあるべきかはわかりません。LOGON_USER_NAME私が得る限り、System.ArgumentExcpetion「フラグを設定できません」の値を取得しています。

4

2 に答える 2

19

私はついにここで答えを見つけました。File.Moveはターゲットディレクトリから権限を継承しませんか?

var fs = File.GetAccessControl(destination);
fs.SetAccessRuleProtection(false, false);
File.SetAccessControl(destination, fs);

アップデート

上記のコードスニップは継承されたアクセス許可を追加しますが、既存の明示的なアクセス許可は削除しません。私の最終的なコードは次のようになります。

string destination = @"<my file>";
FileInfo fileInfo;
FileSecurity fileSecurity;
FileSystemAccessRule fileRule;
AuthorizationRuleCollection fileRules;

fileInfo = new FileInfo(destination);
fileSecurity = fileInfo.GetAccessControl();
fileSecurity.SetAccessRuleProtection(false, false);
/*
 * Only fetch the explicit rules since I want to keep the inherited ones. Not 
 * sure if the target type matters in this case since I am not examining the
 * IdentityReference.
 */
fileRules = fileSecurity.GetAccessRules(includeExplicit: true, 
                         includeInherited: false, targetType: typeof(NTAccount));
/*
 * fileRules is a AuthorizationRuleCollection object, which can contain objects 
 * other than FileSystemAccessRule (in theory), but GetAccessRules should only 
 * ever return a collection of FileSystemAccessRules, so we will just declare 
 * rule explicitly as a FileSystemAccessRule.
 */
foreach (FileSystemAccessRule rule in fileRules)
{
    /*
     * Remove any explicit permissions so we are just left with inherited ones.
     */
    fileSecurity.RemoveAccessRule(rule);
}
fileInfo.SetAccessControl(fileSecurity);

アップデート2

または、このページの他の場所にあるTGasdfのより簡潔な3行のソリューションを使用するだけです...

于 2012-10-10T14:27:51.797 に答える
18

明示的なアクセス許可が削除されたという受け入れられた答えは、私の好みには少し複雑すぎると感じたので、新しいFileSecurityを作成しようとしました。以下は機能しているようであり、結果として得られるアクセス許可は、継承されたアクセス許可のみを使用することになります。

var fs = new System.Security.AccessControl.FileSecurity();
fs.SetAccessRuleProtection(false, false);
File.SetAccessControl(destination, fs);
于 2016-10-10T12:27:39.067 に答える