.NET中Active Directory用户的LDAP查找组

本文关键字:LDAP 查找 用户 Active Directory NET | 更新日期: 2023-09-27 18:25:07

我正在尝试使用LDAP验证用户,并返回用户所属的所有组:

我能够验证,但无法获取所有组。

以下代码在本地计算机上工作,但在服务器上部署时返回错误。

public bool Authenticate1(string userName, string password, ref List<string> List)
        {
            const int ERROR_LOGIN_FAILURE = -2147023570;
            DirectoryEntry root = new DirectoryEntry("LDAP://rootDSE", userName, password, AuthenticationTypes.Secure);
            using (root)
            {
                try
                {
                        Object temp = root.NativeObject;
                        string defaultNamingContext = "";
                        defaultNamingContext = root.Properties["defaultNamingContext"].Value.ToString();
                        DirectoryEntry default1 = new DirectoryEntry("LDAP://" + defaultNamingContext, userName, password, AuthenticationTypes.Secure);
                        DirectorySearcher dSearch = new DirectorySearcher(default1.Path);
                        dSearch.Filter = "(SAMAccountName=" + userName + ")";
                        dynamic a = dSearch.FindOne();
                        **DirectoryEntry obUser = new DirectoryEntry(a.Path);**
                        object obGroups = obUser.Invoke("Groups");
                        foreach (object ob in (IEnumerable)obGroups)
                        {
                            // Create object for each group.
                            DirectoryEntry obGpEntry = new DirectoryEntry(ob);
                            dynamic vGroup = obGpEntry.Name;
                            vGroup = vGroup.Substring(vGroup.IndexOf("=") + 1, vGroup.Length - vGroup.IndexOf("=") - 1);
                            List.Add(vGroup);
                        }
                    return true;
                }
                catch (System.Runtime.InteropServices.COMException ex)
                {
                    List.Add(ex.Message);
                    List.Add(ex.ToString());
                    if (ex.ErrorCode != ERROR_LOGIN_FAILURE)
                    {
                        throw;
                    }
                    return false;
                }
            }
        }

在这个代码后面的换行错误

DirectoryEntry obUser = new DirectoryEntry(a.Path);

对象引用未设置为对象的实例服务器上的池正在ApplicationPoolIdentity下运行。根据公司的政策,它应该在这个条件下运行。

不确定我在服务器上缺少了什么?

干杯骚扰

.NET中Active Directory用户的LDAP查找组

如果您使用的是.NET 3.5及更高版本,则应该检查System.DirectoryServices.AccountManagement(S.DS-AM)命名空间。点击此处阅读:

  • System.DirectoryServices.AccountManagement上的MSDN文档

基本上,您可以定义域上下文,并在AD:中轻松找到用户和/或组

// set up domain context
using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain))
{
    // find a user
    UserPrincipal user = UserPrincipal.FindByIdentity(ctx, userName );
    if(user != null)
    {
       // get the user's groups
       PrincipalSearchResult<Principal> groups = user.GetAuthorizationGroups();
       foreach(GroupPrincipal gp in groups.OfType<GroupPrincipal>)
       {
          // do something with the group
       }
    }
}

新的S.DS.AM让在AD中与用户和组一起玩变得非常容易!