2009-12-11 141 views
1

编辑:看来它不起作用。似乎没有复制一些权限。 这是在Exchange 2010的Active Directory中。在屏幕截图中,有“RTCUniversalUserReadOnlyGroup”用户,“权限”列为空。这些权限根本不会被复制。有小费吗?通过C#继承Active Directory权限

我目前不得不以编程方式取消选中“在此目标的父项中包含可继承权限”复选框。

编辑:不得不把图像回URL形式:http://i47.tinypic.com/2a8fed5.jpg

我想通实际取消的方式,但是当你通过接口做到这一点,它会询问您是否要复制当前权限或删除它们。

我发现的唯一方法是手动列出权限,将它们放入临时变量中,然后在复选框被移除后重新添加它们。

 using (DirectoryEntry entry = new DirectoryEntry(myPath)) 
     { 
      List<ActiveDirectoryAccessRule> rules = new List<ActiveDirectoryAccessRule>(); 
      foreach (object ruleObject in entry.ObjectSecurity.GetAccessRules(false, true, typeof(SecurityIdentifier))) 
      { 
       ActiveDirectoryAccessRule rule = ruleObject as ActiveDirectoryAccessRule; 
       if (rule.IsInherited) 
       { 
        rules.Add(rule); 
       } 
      } 

      foreach (object ruleObject in entry.ObjectSecurity.GetAccessRules(false, true, typeof(NTAccount))) 
      { 
       ActiveDirectoryAccessRule rule = ruleObject as ActiveDirectoryAccessRule; 
       if (rule.IsInherited) 
       { 
        rules.Add(rule); 
       } 
      } 

      entry.ObjectSecurity.SetAccessRuleProtection(true, false); 

      foreach (var rule in rules) 
      { 
       entry.ObjectSecurity.AddAccessRule(rule); 
      } 
      entry.CommitChanges(); 
     } 

我想知道是否有更好的方法来做到这一点,如果我失去了一些东西。它似乎现在工作得很好,但是感觉就像一旦项目部署完成,就会在我的屁股上咬我。

+0

编辑你的问题显示图像:) – Shoban

回答

0

我是个白痴,该解决方案是简单地使用

entry.ObjectSecurity.SetAccessRuleProtection(true, true); 

代替

entry.ObjectSecurity.SetAccessRuleProtection(true, false); 

我想我可以不读!