LDAP管理器属性

时间:2011-01-26 08:28:15

标签: c# asp.net vb.net webforms ldap

我正在创建一个LDAP类,其中包含一个返回当前用户的管理员用户名的函数。

我知道我可以使用“manager”属性返回CN =“name”,OU =“group”,DC =“company”等。

我特别想要管理员用户名,是否有人知道我是否可以发送给LDAP的属性字符串专门获取管理员用户名?如果没有,是否有另一种方法可以这样做?

4 个答案:

答案 0 :(得分:3)

除非没有设置管理员,否则上述GetManager工作正常。轻微改动以适应这种情况:

// return manager for a given user
public UserPrincipal GetManager(PrincipalContext ctx, UserPrincipal user) {
    if (user != null) {
        // get the DirectoryEntry behind the UserPrincipal object
        var dirEntryForUser = user.GetUnderlyingObject() as DirectoryEntry;

        if (dirEntryForUser != null) {
            // check to see if we have a manager name - if so, grab it
            if (dirEntryForUser.Properties["manager"] != null && dirEntryForUser.Properties["manager"].Count > 0) {
                string managerDN = dirEntryForUser.Properties["manager"][0].ToString();
                // find the manager UserPrincipal via the managerDN 
                return UserPrincipal.FindByIdentity(ctx, managerDN);
            }
        }
    }
    return null;
}

答案 1 :(得分:1)

一种可能的解决方案是使用类似的东西 - 这要求您使用的是.NET 3.5,并且您同时引用了System.DirectoryServicesSystem.DirectoryServices.AccountManagement

// return manager for a given user
public UserPrincipal GetManager(PrincipalContext ctx, UserPrincipal user)
{
    UserPrincipal result = null;

    if (user != null)
    {
        // get the DirectoryEntry behind the UserPrincipal object
        DirectoryEntry dirEntryForUser = user.GetUnderlyingObject() as DirectoryEntry;

        if (dirEntryForUser != null)
        {
             // check to see if we have a manager name - if so, grab it
             if (dirEntryForUser.Properties["manager"] != null)
             {
                 string managerDN = dirEntryForUser.Properties["manager"][0].ToString();

                 // find the manager UserPrincipal via the managerDN 
                 result = UserPrincipal.FindByIdentity(ctx, managerDN);
             }
        }
    }

    return result;
}

然后您可以调用此方法,例如像这样:

// Create default domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

// find yourself - you could also search for other users here
UserPrincipal myself = UserPrincipal.Current;

// get the manager for myself
UserPrincipal myManager = GetManager(ctx, myself);

答案 2 :(得分:1)

我现在已经找到了解决方案。

基本上,LDAP中的manager属性会检索该用户的distinguishedName属性。

因此,如果我在LDAP中搜索包含从管理器返回的distinguishedName的用户,那么我可以通过这种方式获取他们的任何属性。

答案 3 :(得分:0)

两个例子都很好。但我相信还有改进的空间。

方法不应该检查参数是否为null,并且返回null是一个坏习惯。另一方面,例外情况更为充足。

不应该要求上下文,而应该可以从提供的UserPrincipal中检索上下文,因此找到当前用户应该没有任何问题。

public static UserPrincipal GetManager(UserPrincipal user)
{
  var userEntry = user.GetUnderlyingObject() as DirectoryEntry;
  if (userEntry.Properties["manager"] != null
    && userEntry.Properties["manager"].Count > 0)
  {
    string managerDN = userEntry.Properties["manager"][0].ToString();
    return UserPrincipal.FindByIdentity(user.Context,managerDN);
  }
  else
    throw new UserHasNoManagerException();
}

class UserHasNoManagerException : Exception
{ }