.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 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中与用户和组一起玩变得非常容易!