LDAP aracılığıyla Windows Active Directory ve LDS kullanıcı parolasını değiştirme

Bu makalede LDAP aracılığıyla Windows Active Directory ve LDS kullanıcı parolasının nasıl değiştireceği açıklanır.

Şunlar için geçerlidir: Windows Active Directory
Özgün KB numarası: 269190

Özet

Bazı kısıtlamalara bağlı olarak, Basit Dizin Erişim Protokolü (LDAP) aracılığıyla bir Windows Active Directory ve Basit Dizin Hizmetleri (LDS) parolası ayarlayabilirsiniz. Bu makalede parola özniteliğini ayarlama veya değiştirme işlemleri açıklanmaktadır.

Bu adımlar Active Directory Uygulama Modu (ADAM) ve LDS kullanıcıları ve userProxy nesneleri için AD kullanıcıları ile aynı şekilde geçerlidir. Ayrıntılar için makalenin sonundaki ek ipuçlarına bakın.

Daha fazla bilgi

Parola, unicodePwd özniteliğindeki bir kullanıcı nesnesindeki AD ve LDS veritabanında depolanır. Bu öznitelik kısıtlı koşullar altında yazılabilir ancak okunamaz. Öznitelik yalnızca değiştirilebilir; nesne oluşturma işlemine eklenemez veya bir arama tarafından sorgulanamaz.

Bu özniteliği değiştirmek için istemcinin sunucuya 128 bit Aktarım Katmanı Güvenliği (TLS)/Güvenli Yuva Katmanı (SSL) bağlantısı olmalıdır. En düşük anahtar uzunluğu karşılandığı sürece Windows Yeni Teknoloji LAN Yöneticisi (NTLM) veya Kerberos kullanılarak SSP tarafından oluşturulan oturum anahtarları kullanılarak şifrelenmiş bir oturum da kabul edilebilir.

Bu bağlantının TLS/SSL kullanarak mümkün olması için:

  • Sunucu, 128 bit RSA bağlantısı için bir sunucu sertifikasına sahip olmalıdır.
  • İstemcinin sunucu sertifikasını oluşturan sertifika yetkilisine (CA) güvenmesi gerekir.
  • Hem istemci hem de sunucu 128 bit şifreleme özelliğine sahip olmalıdır.

unicodePwd özniteliğinin söz dizimi octet-string'dir; ancak, dizin hizmeti octet-string'in bir UNICODE dizesi (özniteliğin adında gösterildiği gibi) içermesini bekler. Bu, LDAP ile geçirilen bu özniteliğin tüm değerlerinin BER kodlamalı (Temel Kodlama Kuralları) olan UNICODE dizeleri olması gerektiği anlamına gelir. Buna ek olarak, UNICODE dizesinin başlaması ve istenen parolanın parçası olmayan tırnak işaretleri ile bitmesi gerekir.

unicodePwd özniteliğini değiştirmenin iki olası yolu vardır. İlki, normal bir kullanıcı değiştirme parolası işlemine benzer. Bu durumda, değiştirme isteği hem silme hem de ekleme işlemi içermelidir. Silme işlemi, çevresinde tırnak işaretleri bulunan geçerli parolayı içermelidir. Ekleme işlemi, çevresinde tırnak işaretleri bulunan istenen yeni parolayı içermelidir.

Bu özniteliği değiştirmenin ikinci yolu, yöneticinin bir kullanıcı için parola sıfırlaması ile benzerdir. Bunu yapmak için istemcinin başka bir kullanıcının parolasını değiştirmek için yeterli izinlere sahip bir kullanıcı olarak bağlanması gerekir. Bu değiştirme isteği, tırnak işaretleri ile çevrelenmiş yeni istenen parolayla tek bir değiştirme işlemi içermelidir. İstemcinin yeterli izinleri varsa, eski parola ne olursa olsun bu parola yeni parola olur.

Aşağıdaki iki işlev bu işlemlerin örneklerini sağlar:

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 successfully 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;
}

İpucu

  • Parola sıfırlamaları için UserProxy nesnelerini kullanarak LDS örneklerini yapılandırmak için, kullanıcı oturum açma işleminin Kerberos kullanması durumunda LDS hizmet hesabının (varsayılan: LDS bilgisayar hesabı) etki alanı denetleyicilerine kısıtlanmış temsiline izin vermeliydiniz.
  • LDAP basit bağlama kullanıyorsanız, Windows Server 2022 veya daha yeni bir sürüm kullanmanız ve yönetici LDAP oturum kimlik bilgilerini Active Directory Etki Alanı Denetleyicisine iletmek için bir kayıt defteri girdisi ayarlamanız gerekir:
    Kayıt Defteri Anahtarı: HKLM\system\currentcontrolset\services<LDS Instance>\Parameters
    Kayıt Defteri Girdisi: ClearText Oturum Açma Türüne İzin Ver
    Tür: REG_DWORD
    Veri: 0: Kimlik bilgilerinin iletilmesine izin verme (Varsayılan)
              1: Parola sıfırlama için kimlik bilgilerinin iletilmesine izin ver
  • Her iki durumda da yapılan değişikliğin, LDS sunucusunun Etki Alanı Denetleyicisi'nde güvenlik açısından hassas görevleri başlatabileceği için Katman 0 cihazı olarak kabul edilmesi gerektiği anlamına geldiğini unutmayın.

Uygulandığı öğe

  • Windows Server 2012 Datacenter
  • Windows Server 2012 Standard
  • Windows Server 2012 R2 Datacenter
  • Windows Server 2012 R2 Standard
  • Windows Server 2016
  • Windows Server 2019
  • Windows Server 2022
  • Windows 8.1 Enterprise
  • Windows 8.1 Pro
  • Windows 10
  • Windows 11