2013-07-10 3 views
0

사용자 또는 관리자가 LDAP 암호를 변경하려고 C# 코드를 수행하고 있습니다. 사용자를 성공적으로 인증 할 수 있습니다.LDAP : 암호를 변경할 수 없습니다.

의 InnerException : : 디렉터리 속성이 캐시에서 찾을 수 없습니다 나는 ChangePassword 또는 SetPassword 동작을 호출 할 때, 나는 다음과 같은 오류 메시지가 나타납니다.

LDAPPath = "LDAP://10.29.0.1:50405/DC=DCServerName,DC=local" 
LDAPAdminDN = "CN=useradmin,OU=SystemAccounts,DC=DCServerName,DC=local" 
LDAPAdminPwd = "S8kf5t3!" 
username = "user1" 
password = "oldPassword1" 
npassword = "newPassword1" 

DirectoryEntry root = new DirectoryEntry(
LDAPPath, 
LDAPAdminDN, 
LDAPAdminPwd, 
AuthenticationTypes.None 
); 

using (root) 
{ 
    DirectorySearcher searcher = new DirectorySearcher(root, 
     string.Format("(CN={0})", username) 
     ); 
    var result = searcher.FindOne(); 
    if (result != null) 
    { 
     var user = result.GetDirectoryEntry(); 
     try 
     { 
      user.Invoke("ChangePassword", new object[] { password, npassword }); 
      user.Properties["LockOutTime"].Value = 0; 
      //user.Invoke("SetPassword", new object[] { npassword }); 
      user.CommitChanges(); 
     } 
     catch (Exception e) 
     { 
      string innerMsg = e.InnerException.Message; 
      return false; 
     } 
    } 

내가 성공적으로 암호를 변경하려면이 문제를 해결하는 방법에 대해 궁금 다음과 같이

내 코드입니다. 나는 다음과 같이 몇 가지 옵션을 시도 하지만 그들 모두가 작동하지 않습니다 : 하나 :

int intPort = 50405; 
user.Invoke("SetOption", new object[] { ADS_OPTION_PASSWORD_PORTNUMBER, intPort }); 
user.Invoke("SetOption", new object[] { ADS_OPTION_PASSWORD_METHOD, ADS_PASSWORD_ENCODE_CLEAR }); 

2 :

user.UsePropertyCache = true; 

그들은 모두 오류가 너희들

업데이트 감사 0x80072020

IT 담당자가 "nonSSL에서 비밀번호 변경"을 사용 설정했는데 설정이 잘못되었습니다. m AD LDS 부분에 입력하십시오.

질문 : 가장 자리가 잘못된 코드 대신이 방법으로 사용자의 비밀번호를 변경하려면 admin 계정을 사용하는 것이 맞습니까?

답변

2

.NET 3.5 이상인 경우 System.DirectoryServices.AccountManagement (S.DS.AM) 네임 스페이스를 확인해야합니다. 여기에 대한 모든 읽기 :

// set up domain context 
using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain)) 
{ 
    // find a user 
    UserPrincipal user = UserPrincipal.FindByIdentity(ctx, "SomeUserName"); 

    if(user != null) 
    { 
     user.ChangePassword(oldPassword, newPassword); 
     user.UnlockAccount(); 
    } 
} 

을 : MSDN docs on System.DirectoryServices.AccountManagement

기본적으로

+0

그러나 각 사용자마다 UPN이 설정되어 있지 않습니다. UserPrincipal을 사용하는 것이 문제가됩니까? 또한 AD 도메인 모델을 사용하지 않습니다. 따라서 ContextType은 ApplicationDirectory에 관한 것입니다. –

+0

@HanYiZhang : *** NO! *** 그냥 사용하십시오 - 잘 작동합니다!SAM 계정 이름, 표시 이름 및 몇 가지 추가 속성으로 사용자를 검색 할 수 있습니다. UPN의 존재 여부는 ***이 아닙니다 *** 요구 사항 –

+0

감사합니다. DN을 사용하여 LDAP 서버 통신에 대한 응답을 편집 할 수 있습니까? DN 형식으로 ID를 찾으려고했지만이 사용자를 찾을 수 없습니다. –

0

Active Directory를 사용하고 있습니까?

LDAP://10.29.0.1:50405/DC=DCServerName,DC=local 

URL이 올바르지 않습니다.

user.UsePropertyCache = true; 다음 : user.Invoke ("ChangePassword", 새 개체 [] {암호, npassword});

-jim

+0

감사합니다 짐. 이 URL은 이전 암호의 성공적인 인증을 얻습니다. 암호 변경에 대해 동일한 항목을 사용해야합니까? –

+0

문제는 해결되었지만 usepropertycache는 문제가 아닙니다. 핵심 사항은 다음과 같습니다. admin ldap 사용자를 사용하여 사용자 암호를 변경하려면 changepassword 대신 setpassword를 사용해야합니다. –

+0

암호를 재설정하려면 LDAP unicodePwd를 새 암호로 변경하도록 설정해야하지만 올바른 권한이 있어야합니다. 이전 암호를 제공하지 마십시오. 이 호출 메소드로는 다른 것을 사용하고 있는지 모르며 코드에서 작동하지 않는 이유는 없습니다. – ppumkin

관련 문제