2015-11-04 5 views
0

Это мой кодизменения пароля пользователя с LDAP

var fullName = ApplicationSettings.DefaultUser; 
var userId = fullName.Substring(fullName.LastIndexOf(@"\", StringComparison.Ordinal) + 1).ToUpper(CultureInfo.InvariantCulture); 
    try 
    { 

     DirectoryEntry entry = new DirectoryEntry("LDAP://ldapaddressstring", userId, existingPassword, AuthenticationTypes.Secure); 

     DirectorySearcher search = new DirectorySearcher(entry); 
     search.Filter = "(&(objectClass=user)(sAMAccountName=" + userId + "))"; 
     entry = search.FindOne().GetDirectoryEntry(); 
     entry.Invoke("ChangePassword", new object[] { existingPassword, newPassword }); 
    } 
    catch (Exception ex) 
    { 

     //throw plain exception 
     throw ex;  

    } 

Я получаю неверное имя пользователя или ошибку пароля. Есть идеи?

ответ

0

Вы хотите, чтобы пользователь менял свой собственный пароль или администратор для его сброса?

Получаете ли вы что-нибудь для входа или происходит ошибка при вызове FindOne?

Это код, который я использую, «Impersonator» - это класс, позволяющий олицетворять учетную запись администратора домена для обеспечения соответствующих прав. вы должны найти его here.

public ServiceResponse ChangePassword(string username, string oldPassword, string newPassword) 
     { 
      ServiceResponse response = new ServiceResponse(); 

      try 
      { 
       var entry = new DirectoryEntry(DomainUsersConnectionString, username, oldPassword); 
       var nativeObject = entry.NativeObject; 

       // Check passed. Can reset the password now 
       entry = RootDirectoryEntry; 
       var user = FindUserInDirectoryEntry(username, entry); 
       response = SetPassword(user, newPassword); 
       user.Close(); 
      } 
      catch (DirectoryServicesCOMException ex) 
      { 
       response.Status = Status.Error; 
       response.Message = ex.ExtendedErrorMessage; 
       m_Logger.Error("Failed to change password for user {0}: {1} - {2}", username, ex.ExtendedErrorMessage, (ex.InnerException ?? ex)); 
      } 
      catch (Exception ex) 
      { 
       response.Status = Status.Error; 
       response.Message = ex.Message; 
       m_Logger.Error("Failed to change password for user {0}: {1} -{2}", username, ex.Message, (ex.InnerException ?? ex)); 
      } 
      return response; 
     } 



     /// <summary> 
     /// Finds the user in directory entry. 
     /// </summary> 
     /// <param name="username">The username.</param> 
     /// <param name="dirEntry">The dir entry.</param> 
     /// <returns></returns> 
     protected static DirectoryEntry FindUserInDirectoryEntry(string username, DirectoryEntry dirEntry) 
     { 
      // rip off Domain name if username contains it 
      string domainName = String.Format(@"{0}\", DomainName).ToLowerInvariant(); 
      username = username.Replace(domainName, ""); 
      DirectorySearcher searcher = new DirectorySearcher(dirEntry) 
      { 
       Filter = String.Format("(samAccountName={0})", username) 
      }; 
      var searchResult = searcher.FindOne(); 
      if (searchResult != null) 
      { 
       DirectoryEntry user = searchResult.GetDirectoryEntry(); 
       return user; 
      } 
      return null; 
     } 



     private ServiceResponse SetPassword(DirectoryEntry user, string password) 
     { 
      ServiceResponse response = new ServiceResponse(); 

      try 
      { 
       using (var impersonator = new Impersonator(DomainAdminUsername, DomainName, DomainAdminPassword)) 
       { 
        user.Invoke("SetPassword", new object[] { password }); 
        user.Properties["LockOutTime"].Value = 0; //unlock account 
        user.CommitChanges(); 
       } 
       response.Status = Status.Success; 
      } 
      catch (DirectoryServicesCOMException ex) 
      { 
       response.Status = Status.Error; 
       response.Message = ex.ExtendedErrorMessage; 
       m_Logger.Error("SetPassword failed for user {0}: {1}", user.Name, ex.ExtendedErrorMessage); 
      } 
      catch (Exception ex) 
      { 
       response.Status = Status.Error; 
       response.Message = ex.Message; 
       m_Logger.Error("SetPassword failed for user {0} by {1} at {2}: {3}: {4}", user.Name, 
        DomainAdminUsername, DomainName, 
        ex.Message, (ex.InnerException ?? ex).ToString()); 
      } 

      return response; 
     } 

Очки отметить, что может быть влияет на вас:

  1. Удалить доменное имя, если оно существует
  2. Получение «NativeObject», кажется, влияет на кэширование/подключение
  3. Это использование «SetPassword», который требует "Reset Password extended control access right"
+0

Thanks Roger. Мне нужно, чтобы пользователи могли изменять свои собственные пароли, предпочтительно без каких-либо сторонних классов. Это возможно? У меня сложилось впечатление, что это так. – sarsnake

+0

Да, вы должны иметь возможность отказаться от Impersonator (который в любом случае является свободно используемым исходным кодом) и заменить на ChangePassword вместо SetPassword. Главный вопрос должен быть: Какая строка является исключением? Это может быть место, где вы объявляете/назначаете запись или где вы вызываете ChangePassword –

Смежные вопросы