Самый быстрый способ проверить, существует ли пользователь в группе активных каталогов в C # - PullRequest
0 голосов
/ 05 июня 2018

Я пишу метод, чтобы определить, существует ли пользователь в группе Active Directory.Возможно, я не знаю пароль этого пользователя, но у меня есть другое имя пользователя / пароль в этой группе Active Directory.Есть ли более эффективный способ сделать это?Установка свойства SamAccountName и вызова userFound.GetGroups () представляется узким местом.

Любые предложения приветствуются.

try
{
  using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, ipaddress, remoteDomainAndUserName, password))
  {
    UserPrincipal qbeUser = new UserPrincipal(pc);
    try
    {
      qbeUser.SamAccountName = lookUpUserName; // don't know password of this user
      aDResult = ADResult.Valid; // right now remoteDomainAndUserName/password is valid on the domain, don't know if lookUpUserName is a valid user yet
    }
    catch (Exception e)
    {
      return ADResult.InvalidNonLookupID;
    }

    PrincipalSearcher srch = new PrincipalSearcher(qbeUser);

    foreach (var found in srch.FindAll())
    {
      UserPrincipal userFound = found as UserPrincipal;

      if (userFound != null)
      {
        foreach (Principal p in userFound.GetGroups())
        {
          if (p.SamAccountName.ToLower().Trim() == groupName)
          {
            bool isEnabled = true;
            if (userFound.Enabled.HasValue)
            {
              isEnabled = userFound.Enabled.Value;
            }
            if (isEnabled)
              return ADResult.ValidInGroup;
            else
              return ADResult.DisabledInGroup;
          }
          else
            aDResult = ADResult.InvalidInGroup;
        }
      }
    }
  }
}
catch (PrincipalServerDownException e)
{
            // cannot connect to AD
            aDResult = ADResult.Offline;
}
catch (LdapException e)
{
            // cannot connect to AD
            aDResult = ADResult.Offline;
}
catch (Exception e)
{
            // cannot connect to AD
            aDResult = ADResult.Offline;
}

1 Ответ

0 голосов
/ 05 июня 2018
//This is a method I use in a WCF web service I created
//userName is the domain name of the user
//groupName is the AD group 
public bool IsMemberOfGroup(string groupName, string userName)
        {
            try
            {
                PrincipalContext context = new PrincipalContext(ContextType.Domain);

                UserPrincipal user = UserPrincipal.FindByIdentity(context, userName);

                GroupPrincipal group = GroupPrincipal.FindByIdentity(context, groupName);

                if (group == null)
                    return false;

                if (user != null)
                    return group.Members.Contains(user);
            }
            catch (System.Exception ex)
            {
                //Log exception
            }


            return false;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...