0

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

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

我想通过以下手动步骤以编程方式(在 C# 中)实现相同的结果:

  1. 启动 ADSI Edit 并连接到 AD LDS 实例和分区。
  2. 导航到分区根节点下的 CN=Readers。
  3. 双击 CN=Readers 条目。
  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 读者角色。但我错过了什么?

我认为必须有比我使用ActiveDirectorySecurityandActiveDirectoryAccessRule类的方法更好的方法,但我不知道如何使用它们。

4

2 回答 2

1

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

您是否尝试过通过 SID 将主体添加到组中,例如如何将其添加到读者组?如果您想弄清楚内部工具是如何做到这一点的,请在您使用的任何工具和 LDS 实例之间对 LDAP 调用进行网络嗅探,然后将其添加到读者组......

于 2012-09-17T05:29:59.693 回答
0

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

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

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

这将隐式添加所需的 FSP。

于 2012-09-17T09:31:02.347 回答