【发布时间】:2015-08-13 09:15:22
【问题描述】:
我有两个处于受信任关系的域,我正试图通过 C# Web 应用程序对其进行管理。为此,我必须模拟两个不同的技术用户,但效果很好,所以我不会强调这部分代码。
要为文件系统构建适当且易于管理的 ACL,我必须
- 在 domainA 中创建一个组(好的!)
- 在域 B 中查找用户(好的!)
- 将用户添加到组(提交更改时失败,错误消息:
There is no such object on the server. (Exception from HRESULT: 0x80072030))
如果我要添加来自同一域的用户,则代码可以完美运行,所以我相信我在这里只遗漏了一小部分信息。我使用this document 作为参考,也看到了this question(还有一些人引用了这个错误消息),但它们都没有帮助。
代码(删除了 try-catch 块以使其更简单)
// de is a DirectoryEntry object of the AD group, received by the method as a parameter
// first impersonation to search in domainB
// works all right
if (impersonator.impersonateUser("techUser1", "domainB", "pass")) {
DirectoryEntry dom = new DirectoryEntry("LDAP://domainB.company.com/OU=MyOU,DC=domainB,DC=company,DC=com", "techUser1", "pass");
de.Invoke("Add", new object[] { "LDAP://domainB.company.com/CN=theUserIWantToAdd,OU=MyOU,DC=domainB,DC=company,DC=com" });
// de.Invoke("Add", new object[] { "LDAP://domainA.company.com/CN=anotherUserFromDomainA,OU=AnotherOU,DC=domainB,DC=company,DC=com" });
impersonator.undoImpersonation();
}
// second impersonation because the group (de) is in domainA
// and techUser2 has account operator privileges there
if (impersonator.impersonateUser("techUser2", "domainA", "pass"))
{
de.CommitChanges();
impersonator.undoImpersonation();
return true;
}
else
{
// second impersonation was unsuccessful, so return an empty object
return false;
}
第 6 行有效,如果我对其进行调试或强制将属性写入 HttpResponse,它显然就在那里。所以 LDAP 查询似乎没问题。
另外,如果我注释掉第 6 行并取消注释第 7 行,所以基本上我添加了来自同一域的用户,整个事情都可以奇迹般地运行。使用domainB,我被困住了。有什么好的建议吗?
【问题讨论】:
-
好的,我还没有代码,但我找到了一个线索:来自不同域的组成员可以添加为 ForeignSecurityPincipals,所以不是正常的方式。
-
您是否仅在尝试将用户从一个域添加到另一个域组或执行其他一些操作时遇到问题?出于测试目的,您可以尝试在模拟时更新用户名吗?
-
我在domainB中没有账号操作权限,所以不用尝试。在 domainA 中,一切正常,我可以创建组、用户、重置密码、解锁帐户等。
标签: c# active-directory active-directory-group