LDAP 통해 Windows Active Directory와 LDS 사용자 암호를 변경 하는 방법

적용 대상: Microsoft Windows Server 2003 Enterprise Edition (32-bit x86)Microsoft Windows Server 2003 Enterprise Edition for Itanium-based SystemsMicrosoft Windows Server 2003 Enterprise x64 Edition

이 문서는 Windows 2000에 적용 됩니다. 2010 년 7 월 13 일 Windows 2000 지원이 종료 됩니다. Windows 2000의 지원 종료 솔루션 센터 는 Windows 2000에서 마이그레이션 전략을 계획 하기 위한 출발점입니다. 자세한 내용은 Microsoft 지원 기간 정책을 참조 하십시오.

요약


통해 있는 경량 디렉터리 액세스 LDAP 특정 제한 사항을 지정 Windows Active Directory와 LDS 사용자 암호를 설정할 수 있습니다. 설정 하거나 암호 특성을 변경 하는 방법을 설명 합니다.

도이 단계가 적용 ADAM과 LDS 사용자 및 userProxy 개체를 같은 방식으로 AD 사용자와.

자세한 내용


암호는 AD에 저장 LDS 데이터베이스 unicodePwd 특성에는 사용자 개체를 합니다. 제한 된 조건 하에서이 특성에 쓸 수 있지만 읽을 수 없습니다. 특성 에서만 수정할 수 있습니다. 개체 생성에 추가 하거나 검색 하 여 쿼리할 수 없습니다.

이 특성을 수정 하려면 클라이언트에서 128 비트 보안 TLS (전송 계층)가 있어야 / 보안 소켓 레이어 (SSL) 서버에 연결 합니다. 최소 키 길이 충족으로 NTLM 또는 Kerberos를 사용 하 여 SSP가 만든 세션 키를 사용 하 여 암호화 된 세션을 사용할 수도 있습니다.

TLS/SSL을 사용 하 여 가능 하도록이 연결:
  • 128 비트 RSA 연결에 대 한 서버 인증서를 서버에 있어야 합니다.
  • 클라이언트는 서버 인증서를 생성 하는 인증 기관 (CA)를 신뢰 해야 합니다.
  • 클라이언트와 서버 모두 128 비트 암호화 수 있어야 합니다.


UnicodePwd 특성 구문은 8 진수 문자열입니다. 그러나 디렉터리 서비스 (특성의 이름을 나타냄)으로 8 진수 문자열 유니코드 문자열에 포함 되어 있음을 기대 합니다. 이 즉 LDAP에 전달 된 값이이 특성에는 유니코드 문자열을 BER 인코딩된 (기본 인코딩 규칙)를 8 진수 문자열로 이어야 합니다. 또한 유니코드 문자열 시작 하 고 원하는 암호는 포함 되지 않은 견적에.

UnicodePwd 특성을 수정 하는 두 가지 방법이 있습니다. 첫 번째는 일반 "사용자 암호 변경" 유사한 작업. 이 경우 수정 요청 삭제 및 추가 작업을 모두 있어야 합니다. 삭제 작업 주위에 따옴표를 사용 하 여 현재 암호에 포함 되어야 합니다. 추가 작업 주위에 따옴표를 사용 하 여 원하는 새 암호를 포함 해야 합니다.

이 특성을 수정 하는 두 번째 방법은 사용자 암호를 다시 설정 하면 관리자가 비슷합니다. 이 작업을 수행 하기 위해 클라이언트는 다른 사용자의 암호를 수정할 수 있는 권한이 있는 사용자로 바인딩해야 합니다. 이 수정 요청이 따옴표로 묶은 원하는 새 암호를 사용 하 여 단일 바꾸기 작업을 포함 해야 합니다. 클라이언트에 충분 한 권한이 있으면이 암호에 새 암호를 이전 암호 항목에 관계 없이 됩니다.

이러한 작업의 예로 다음과 같은 두 가지 기능을 제공합니다.
ULONG ChangeUserPassword(WCHAR* pszUserDN, WCHAR* pszOldPassword,WCHAR* pszNewPassword)
{
ULONG err = 1;
LDAPMod modNewPassword;
LDAPMod modOldPassword;
LDAPMod *modEntry[3];
BERVAL newPwdBerVal;
BERVAL oldPwdBerVal;
BERVAL *newPwd_attr[2];
BERVAL *oldPwd_attr[2];
WCHAR pszNewPasswordWithQuotes[1024];
WCHAR pszOldPasswordWithQuotes[1024];

// Build an array of LDAPMod.

// For setting unicodePwd, this MUST be a double op.
modEntry[0] = &modOldPassword;
modEntry[1] = &modNewPassword;
modEntry[2] = NULL;

// Build mod struct for unicodePwd Add.
modNewPassword.mod_op = LDAP_MOD_ADD | LDAP_MOD_BVALUES;
modNewPassword.mod_type =L"unicodePwd";
modNewPassword.mod_vals.modv_bvals = newPwd_attr;

// Build mod struct for unicodePwd Delete.
modOldPassword.mod_op = LDAP_MOD_DELETE | LDAP_MOD_BVALUES;
modOldPassword.mod_type =L"unicodePwd";
modOldPassword.mod_vals.modv_bvals = oldPwd_attr;


// Password will be single valued, so we only have one element.
newPwd_attr[0] = &newPwdBerVal;
newPwd_attr[1]= NULL;
oldPwd_attr[0] = &oldPwdBerVal;
oldPwd_attr[1]= NULL;


// Surround the passwords in quotes.
wsprintf(pszNewPasswordWithQuotes,L"\"%s\"",pszNewPassword);
wsprintf(pszOldPasswordWithQuotes,L"\"%s\"",pszOldPassword);

// Build the BER structures with the UNICODE passwords w/quotes.
newPwdBerVal.bv_len = wcslen(pszNewPasswordWithQuotes) * sizeof(WCHAR);
newPwdBerVal.bv_val = (char*)pszNewPasswordWithQuotes;
oldPwdBerVal.bv_len = wcslen(pszOldPasswordWithQuotes) * sizeof(WCHAR);
oldPwdBerVal.bv_val = (char*)pszOldPasswordWithQuotes;


// Perform single modify.
err = ldap_modify_s(ldapConnection,
pszUserDN,
modEntry
);

if (err == LDAP_SUCCESS )
wprintf(L"\nPassword succesfully changed!\n");
else
wprintf(L"\nPassword change failed!\n");

return err;
}

ULONG SetUserPassword(WCHAR* pszUserDN, WCHAR* pszPassword)
{
ULONG err = 1;
LDAPMod modPassword;
LDAPMod *modEntry[2];
BERVAL pwdBerVal;
BERVAL *pwd_attr[2];
WCHAR pszPasswordWithQuotes[1024];

// Build an array of LDAPMod.
// For setting unicodePwd, this MUST be a single op.
modEntry[0] = &modPassword;
modEntry[1] = NULL;

// Build mod struct for unicodePwd.
modPassword.mod_op = LDAP_MOD_REPLACE | LDAP_MOD_BVALUES;
modPassword.mod_type =L"unicodePwd";
modPassword.mod_vals.modv_bvals = pwd_attr;

// Password will be single valued, so we only have one element.
pwd_attr[0] = &pwdBerVal;
pwd_attr[1]= NULL;

// Surround the password in quotes.
wsprintf(pszPasswordWithQuotes,L"\"%s\"",pszPassword);

// Build the BER structure with the UNICODE password.
pwdBerVal.bv_len = wcslen(pszPasswordWithQuotes) * sizeof(WCHAR);
pwdBerVal.bv_val = (char*)pszPasswordWithQuotes;


// Perform single modify.
err = ldap_modify_s(ldapConnection,
pszUserDN,
modEntry
);

if (err == LDAP_SUCCESS )
wprintf(L"\nPassword succesfully set!\n");
else
wprintf(L"\nPassword set failed!\n");

return err;
}