我在Windows 7上使用AD LDS,并使用adaminstall实用程序创建了一个带有新应用程序分区的本地实例。
如何将现有本地Windows组添加到此分区的“读者”角色?
我希望以编程方式(在C#中)通过以下手动步骤获得相同的结果:
我已经拥有以下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角色。但是我错过了什么?
我认为必须有比使用ActiveDirectorySecurity
和ActiveDirectoryAccessRule
类的方法更好的方法,但我无法弄清楚如何使用它们。
答案 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。