2012-09-10 27 views
5

特定のユーザーのUNCパスに対してNTFSアクセス許可を付与しようとしましたが、UNCパスによって異なる動作が発生します。以下は、私は各シナリオにおける権限と、結果を出すために使用しています(MSDNから)コード、継承されたアクセス許可がNTFSアクセス許可を与えている間に失われました

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); 
} 

」私は私のローカルマシン上の「RootShare」という名前の共有、および別のフォルダを持っていると仮定ですInsideRootShare "と入力します。

Scenario1: 私が呼ぶ、

GiveNTFSPermissions(@"\\sri-devpc\RootShare\InsideRootShare", 
        @"domain\username", 
        FileSystemRights.Write); 
: 私が呼ぶ、

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

継承権限は、共有パスに

Scenario2を失いました

継承されたアクセス許可はそのままでした。

FileSystemAccessRuleの異なるコンストラクタで試しましたが、運はありません。

この現象の背景には、どのような回避策がありますか?

+0

引数として 'InheritanceFlags'をとる[constructor](http://msdn.microsoft.com/en-us/library/system.security.accesscontrol.filesystemaccessrule.aspx)を試しましたか?また、 'AddNTFSPermission'は' GiveNTFSPermissions'よりも妥当な名前です。既存のアクセスルールに新しいアクセスルールを追加しようとするためです。 – Nawaz

+0

このトピックを参照してください:http://stackoverflow.com/questions/243995/setting-folder-permissions-on-vista – Nawaz

+0

@Nawaz:私はすべてのコンストラクタを試しましたが、私は同じ結果を持っています。提案ありがとう:) – sri

答えて

4

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"); 
    } 

Found the link that I originally used to figure this out

関連する問題