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



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

如何将现有的本地Windows组添加到此分区的Readers角色?

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

  1. 启动ADSI Edit并连接到AD LDS实例和分区
  2. 导航到分区根节点下方的CN=读卡器
  3. 双击CN=读卡器条目
  4. 双击"成员"属性
  5. 选择并添加现有的本地Windows组

我已经有了以下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();
}

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

但是,当我尝试添加一个新的本地Windows组时,上面代码中的CommitChanges()调用会抛出一个DirectoryServicesCOMException,其中包含错误代码0x8007002F和消息A constraint violation occurred

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

我认为肯定有比我使用ActiveDirectorySecurityActiveDirectoryAccessRule类的方法更好的方法,但我不知道如何使用它们。

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

您是否尝试过通过SID将主体添加到组中,以及如何将其添加到读取器组中?如果你想弄清楚内部工具是如何做到这一点的,请在添加到读卡器组时,在你使用的任何工具和LDS实例之间对LDAP调用进行网络探查。。。

感谢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。

最新更新