2012-01-20 9 views
8

これはかなり簡単な問題ですが、何らかの理由でこれが動作しないようです。私がしたいのは、すべてのユーザーに完全にアクセスできるように、特定のディレクトリに対するアクセス許可を設定することだけです。どちらか、C# - Windows 7のすべてのユーザーのディレクトリアクセス権を設定する

System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(destinationDirectory); 
FileSystemAccessRule fsar = new FileSystemAccessRule("Users", FileSystemRights.FullControl, AccessControlType.Allow); 
DirectorySecurity ds = null; 

    if (!di.Exists) 
    { 
     System.IO.Directory.CreateDirectory(destinationDirectory); 
    } 

ds = di.GetAccessControl(); 
ds.AddAccessRule(fsar); 

んが、例外がスローされない得るが、何も起こりません:ここに私はこれまで持っているコードです。コードが実行された後にディレクトリのアクセス許可をチェックすると、変更は見られません。

アイデア?事前に

おかげで、
ソニー

+0

あなたが無効になってUACで上記のコードを実行しようとしましたか? – rkosegi

+1

@David - 私は管理者としてコンパイルされたexeを実行しようとしましたが、結果には何の違いもありません。 –

+0

@rkosegi - どうすればいいですか? Visual Studioの設定ですか? –

答えて

25

はまた、変更を適用するSetAccessControlを呼び出す必要があります。

ds = di.GetAccessControl(); 
ds.AddAccessRule(fsar); 
di.SetAccessControl(ds); // nothing happens until you do this 

hereが述べたように、MSDNの例が痛んで、詳細に不足しているようです。私はよく振る舞い、以下を得るために、この記事からコードをハッキング:

static bool SetAcl() 
{ 
    FileSystemRights Rights = (FileSystemRights)0; 
    Rights = FileSystemRights.FullControl; 

    // *** Add Access Rule to the actual directory itself 
    FileSystemAccessRule AccessRule = new FileSystemAccessRule("Users", Rights, 
           InheritanceFlags.None, 
           PropagationFlags.NoPropagateInherit, 
           AccessControlType.Allow); 

    DirectoryInfo Info = new DirectoryInfo(destinationDirectory); 
    DirectorySecurity Security = Info.GetAccessControl(AccessControlSections.Access); 

    bool Result = false; 
    Security.ModifyAccessRule(AccessControlModification.Set, AccessRule, out Result); 

    if (!Result) 
     return false; 

    // *** Always allow objects to inherit on a directory 
    InheritanceFlags iFlags = InheritanceFlags.ObjectInherit; 
    iFlags = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit; 

    // *** Add Access rule for the inheritance 
    AccessRule = new FileSystemAccessRule("Users", Rights, 
           iFlags, 
           PropagationFlags.InheritOnly, 
           AccessControlType.Allow); 
    Result = false; 
    Security.ModifyAccessRule(AccessControlModification.Add, AccessRule, out Result); 

    if (!Result) 
     return false; 

    Info.SetAccessControl(Security); 

    return true; 
} 
+0

ありがとう、David。まだ運がない。この目的のためにグループ「ユーザー」の私の使用は正しいですか?私は管理者としてexeファイルを実行しようとしましたが、何も起こっていないようですが、Windowsを通過してフォルダのアクセス権をチェックすると何も起こっていないようです。 –

+2

近づいています。 "users"を "Everyone"に変更すると、 "Everyone"グループがフォルダに追加されましたが、権限は空白になります。何も認められません。 –

+0

このコードは '' Users ''でもうまく動作しています。つまり、フルネームは '@" BUILTIN \ Users "だと思いますが、どちらの方法でも動作します。 –

5

デビッドHeffernanの答えは、「ユーザー」にアクセス許可を設定しようとしているIdentityNotMapped例外で失敗し、英語以外のマシン上で動作しません 。次のコードは、代わりにWellKnownSidType.BuiltinUsersSidを使用することにより、どこでも動作します:

static void SetFullControlPermissionsToEveryone(string path) 
{ 
    const FileSystemRights rights = FileSystemRights.FullControl; 

    var allUsers = new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null); 

    // Add Access Rule to the actual directory itself 
    var accessRule = new FileSystemAccessRule(
     allUsers, 
     rights, 
     InheritanceFlags.None, 
     PropagationFlags.NoPropagateInherit, 
     AccessControlType.Allow); 

    var info = new DirectoryInfo(path); 
    var security = info.GetAccessControl(AccessControlSections.Access); 

    bool result; 
    security.ModifyAccessRule(AccessControlModification.Set, accessRule, out result); 

    if (!result) 
    { 
     throw new InvalidOperationException("Failed to give full-control permission to all users for path " + path); 
    } 

    // add inheritance 
    var inheritedAccessRule = new FileSystemAccessRule(
     allUsers, 
     rights, 
     InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, 
     PropagationFlags.InheritOnly, 
     AccessControlType.Allow); 

    bool inheritedResult; 
    security.ModifyAccessRule(AccessControlModification.Add, inheritedAccessRule, out inheritedResult); 

    if (!inheritedResult) 
    { 
     throw new InvalidOperationException("Failed to give full-control permission inheritance to all users for " + path); 
    } 

    info.SetAccessControl(security); 
} 
+1

ありがとう、あなたは私に多くの苦痛を救った。 –

関連する問題