ETOOBUSY 🚀 minimal blogging for the impatient
ActiveDirectory password reset with LDIF
TL;DR
How to reset the password in ActiveDirectory with LDIF.
The main source takes a bit too much for granted, so I’ll try to put what I learned here… hoping to do well, because I’ll test it later. I also found Passwords using LDIF very enlightening, so I’ll get some examples from there.
The password in Active Directory MUST be set via attribute unicodePwd.
Password format
The password can contain whatever characters, so there’s the need to do some encoding before fitting it in the LDIF.
These are the rules:
- we start from
password_string, a string containing the password! In our example, it will benewPassword:
|<-- hex dump -->| |<-- value -->|
|6e65 7750 6173 7377 6f72 64 | |newPassword |
password_stringMUST be enclosed between exactly two double-quote characters". These will be stripped off eventually, so this operation is totally within the bounds of encoding. Let’s call this new stringquoted_password_string. In our example, note the additional22at the beginning and at the end of the hex dump, representing the double quotes:
|<-- hex dump -->| |<-- value -->|
|226e 6577 5061 7373 776f 7264 22 | |"newPassword" |
quoted_password_stringis encoded in UTF-16LE, obtainingpassword_utf16_string.
|<-- hex dump -->| |<-- value -->|
|2200 6e00 6500 7700 5000 6100 7300 7300| |".n.e.w.P.a.s.s.|
|7700 6f00 7200 6400 2200 | |w.o.r.d.". |
We’re always aiming to keep the highest standards when doing stuff. Please let’s always use the right way of doing encoding and resist the temptation to “just add a
\000after each byte”…
- The last value
password_utf16_stringis basically a bunch of binary data, and we know how to fit it in a LDIF file from previous post LDIF binary data. This gets uspassword_for_ldif, which in our example is the printable stringIgBuAGUAdwBQAGEAcwBzAHcAbwByAGQAIgA=:
|<-- hex dump -->| |<-- value -->|
|4967 4275 4147 5541 6477 4251 4147 4541| |IgBuAGUAdwBQAGEA|
|6377 427a 4148 6341 6277 4279 4147 5141| |cwBzAHcAbwByAGQA|
|4967 413d 0a | |IgA=. |
password_for_ldifis set as the value of attributeunicodePwd, making sure to use two colon characters:to indicate that the value we’re providing is encoded in base64.
unicodePwd:: IgBuAGUAdwBQAGEAcwBzAHcAbwByAGQAIgA=
Reset or change?
A password reset can be done only by a properly authorized
administrator, using a modify operation:
dn: CN=TestUser,DC=testdomain,DC=com
changetype: modify
replace: unicodePwd
unicodePwd::IgBuAGUAdwBQAGEAcwBzAHcAbwByAGQAIgA=
As regular users, we’re only allowed to change our own password in two
steps, i.e. a delete followed by a create:
dn: CN=John Smith, OU=Users,DC=Fabrikam,DC=com
changetype: modify
delete: unicodePwd
unicodePwd::HgBuAGUAdwBKLSQAGEAcwBzAHcAbwByHJE=
-
add: unicodePwd
unicodePwd::IgBuAGUAdwBQAGEAcwBzAHcAbwByAGQAIgA=
The delete MUST include the previous password to prove our identity
and get authorized to do the change.
(From Passwords using LDIF).