使用PrincipalContext从其他AD域获取用户

时间:2015-06-17 21:41:31

标签: c# asp.net active-directory asp.net-mvc-5 active-directory-group

如何从包含来自不同域的用户的AD组中获取用户。

例如,我的活动目录中有2个域, Domain1.corp.com Domain2.corp.com

我有一个名为 TestGroup 的广告组,其中包含来自两个域的用户。

  

Domain1用户:TestUser1,TestUser2

     

Domain2用户:TestUser3,TestUser4,TestUser5

     

TestGroup用户:TestUser1,TestUser2,TestUser3,TestUser5

以下可能只返回Domain1用户。

string domainname = "Domain1.corp.com:3268";
string usernames = String.Empty;
using (var p_context = new PrincipalContext(ContextType.Domain, domainname))
{
     using (var group = GroupPrincipal.FindByIdentity(context, "TestGroup"))
     {
         var users = group.GetMembers(false);
         foreach (var user in users)
         {
             username = username + ", " + user.SamAccountName;
         }
     }
}

当返回用户名变量时,我会看到仅来自Domain1.Am的用户我在这里遗漏了什么? 我的IIS服务器位于Domain1.corp.com

我通过运行powershell脚本验证服务器是否可以访问其他域,该脚本返回位于这两个域中的用户。

get-adgroupmember "TestGroup" -recursive

参考:https://stackoverflow.com/a/7073023/326315

1 个答案:

答案 0 :(得分:1)

您需要为组使用基础System.DirectoryServices.DirectoryEntry

var groupEntry = (DirectoryEntry)group.GetUnderlyingObject();

(注意:根据MSDN GetUnderlyingObject()将返回DirectoryEntry,即使返回类型为object。)

从那里你可以获得会员专有名称:

var memberDistinguishedNames = groupEntry.Properties["member"].Cast<string>();

来自其他域的用户是外部安全主体,因此专有名称的格式为CN={SecurityIdentifier},CN=ForeignSecurityPrincipals。您可以提取安全标识符并在其他域上搜索用户,以获取其余的详细信息。不幸的是,这确实意味着您需要连接到两个域,这可能很慢。