2009-09-17 63 views
1

所以我试图修改BUILTIN \ Users组的权限,至少有修改文件系统访问权限。不幸的是,我尝试使用下面的代码生成未更改的ACL。无法修改CommonAppDataPath目录中的C#中的ACL权限

  SecurityIdentifier usersSecurityIdentifier = ntAccount.Translate(typeof(SecurityIdentifier)) as SecurityIdentifier; 
      DirectorySecurity directorySecurity = Directory.GetAccessControl(source.FullName); 
      FileSystemAccessRule accessRule 
       = new FileSystemAccessRule(@"BUILTIN\Users", FileSystemRights.FullControl, AccessControlType.Allow); 

      directorySecurity.ModifyAccessRule(AccessControlModification.Add, 
       accessRule, 
       out modified); 

      Console.WriteLine(modified); 

修改后的报告在所有情况下均为true,但在您查看文件夹属性时不会更新这些修订。

我也尝试添加访问规则对于没有尚未使用类似的代码目录中的ACL只是AddAccessRule,而不是修改的SecurityIdentifier。即使新的SecurityIdentifier显示在目录的perms列表中,但它们没有我指定的访问权限。

我试图修改在Environment.SpecialFolders.CommonApplicationData专有目录管理员帐户的所有者访问。我也在尝试以管理员身份修改ACL。

没有人有任何的想法有什么错瓦特/上面的代码或有可能导致我使用本地原生.NET类设置ACL的正确方法的任何资源?

+0

我有一位朋友在另一台Vista机器上确认了这种行为。它似乎与我正在修改CommonAppData路径中的数据有关。 – 2009-09-18 03:55:15

+0

所以我发现这个相关的线程,并认为我会发布[这里] [1]。要点是,目录权限应该在创建目录时由管理帐户执行的安装期间设置。我认为这可以通过自定义操作和安装程序类来完成。当我编写代码并确认这其实是真的时,我会在这里发布我的解决方案。 [1]:http://www.vistax64.com/vista-security/165672-how-programmatically-modify-users-full-control。html – 2009-09-18 04:07:07

回答

3

我在一位在微软工作的朋友的帮助下解决了这个问题。实际上我用来设置ACL的过程是准确的。我错误地解释了结果。基本上,只要您尝试进行更改时以管理员身份运行ACL,就可以用这种方式在目录上设置ACL。

该文件夹的准确权限是可用的视图(在Vista)由:

  1. 右键单击有问题的文件夹,选择属性
  2. 选择安全选项卡
  3. 单击高级
  4. 点击编辑
  5. 选择您希望查看其权限的实体,然后单击编辑。

这是我缺少的部分。 CommonApplicationData路径已经为BUILTIN \ Users实体设置了权限。所以在我运行我的代码之后,我实际上最终得到了两个实体。一个说读取&执行,另一个说特殊权限。当我用特殊权限编辑实体时,我实际上看到BUILTIN \ Users确实可以访问该目录。

我真的找BUILTIN \用户有该目录访问和它的所有子文件夹和对象。这是我最终使用的代码片段。我能够通过测试工具确认我的代码,并手动检查文件和目录ACL列表。

DirectorySecurity directorySecurity = Directory.GetAccessControl(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)); 
FileSystemAccessRule accessRule 
    = new FileSystemAccessRule(@"BUILTIN\Users", FileSystemRights.FullControl, 
     InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, 
     PropagationFlags.None, 
     AccessControlType.Allow); 

bool modified=false; 
directorySecurity.ModifyAccessRule(AccessControlModification.Add, 
    accessRule, 
    out modified); 

if (modified) 
{ 
    source.Create(directorySecurity); 
} 
else 
{ 
    source.Create(); 
} 
+0

感谢您发布此信息。代码片段中的_source_实例是什么?这是否需要?另外,我是否正确理解此代码是为了让用户完全控制所有CommonApplicationData路径,包括其他应用程序的常见数据? – 2009-11-19 08:21:32

+0

它是一个DirectoryInfo对象。代码的原因是为了确保用户可以读/写/删除对CommonApplicationData路径的访问。我发现如果管理员创建了路径并且是目录的所有者,那么用户无法删除路径,所以我基本上编写了这些代码,以确保所有用户都可以访问该目录并且可以删除它。 – 2009-11-19 17:21:26