将本地组添加到CN = Readers,CN = C中的AD LDS分区中的角色#

时间:2012-09-15 16:24:32

标签: c# active-directory adlds

我在Windows 7上使用AD LDS,并使用adaminstall实用程序创建了一个带有新应用程序分区的本地实例。

如何将现有本地Windows组添加到此分区的“读者”角色?

我希望以编程方式(在C#中)通过以下手动步骤获得相同的结果:

  1. 启动ADSI Edit并连接到AD LDS实例和分区。
  2. 导航到分区根节点下面的CN = Readers。
  3. 双击CN = Readers条目。
  4. 双击“member”属性。
  5. 选择并添加现有的本地Windows组。
  6. 我已经拥有以下C#代码:

    public void AddReader(string partitionName, string accountName)
    {
      var ntAccount = new NTAccount(accountName);
      var securityIdentifer = ntAccount.Translate(typeof(SecurityIdentifier));
      var accountNameDN = string.Format("CN={0},CN=ForeignSecurityPrincipals,{1}", securityIdentifer.Value, partitionName);
    
      var rootPath = string.Format("LDAP://localhost:389/CN=Readers,CN=Roles,{0}", partitionName)
      var directoryEntry = new DirectoryEntry(RootPath);
      directoryEntry.Properties["member"].Add(accountNameDN);
      directoryEntry.CommitChanges();
    }
    

    仅当使用上述手动步骤将本地组至少添加到读者角色时,此代码才有效。如果我手动添加组然后手动删除它,则可以使用上面显示的代码重新添加组。

    但是,当我尝试添加新的本地Windows组时,上面代码中的CommitChanges()调用会引发DirectoryServicesCOMException错误代码0x8007002F和消息A constraint violation occurred。< / p>

    显然,手动步骤会对现有的本地Windows组执行一些修改,使其适合添加到AD LDS Readers角色。但是我错过了什么?

    我认为必须有比使用ActiveDirectorySecurityActiveDirectoryAccessRule类的方法更好的方法,但我无法弄清楚如何使用它们。

2 个答案:

答案 0 :(得分:1)

我的推测是,在您的配置中,在您将SID添加到至少某个角色之前,该主体没有FSP,因此,SID对它的引用将失败。

您是否尝试过将SID中的主体添加到群组中以及如何将其添加到读者群中?如果您想弄清楚内部工具是如何完成的,请在您使用的任何工具和LDS实例之间对LDAP调用进行网络嗅探,以便在读取组中添加...

答案 1 :(得分:0)

感谢Eric关于FSP(外国安全负责人)的暗示,我们(谷歌和我)在这里找到了一个解决方案:http://www.pcreview.co.uk/forums/add-group-members-trusted-domain-programmatically-t1460084.html(向下滚动到Joe Kaplans的回答)。

诀窍是对accountNameDN变量使用<SID=xxx>语法。如果accountNameDN变量修改如下,那么原始问题中的代码示例将起作用:

var accountNameDN = string.Format("<SID={0}>", securityIdentifer.Value);

这将隐式添加所需的FSP。