Ну, я использую DirectoryEntry и LdapConnection для сброса пароля в сценарии, где у нас установлен минимальный возраст и политика пароля. Когда кто-то забывает свой пароль, вы хотите, чтобы они могли сбросить свой пароль на то, что не нарушает историю паролей. В качестве альтернативного решения можно было бы использовать «SetPassword» и сбросить пароль на сгенерированное значение, а затем заставить пользователя изменить его при следующем входе в систему. Это невозможно в нашем сценарии. Следовательно, я следовал this blog post в технике и тестировал расширенные элементы управления LDap, чтобы сбросить пароль, выполнив проверку истории паролей. Короче говоря, это просто меняется на тот же пароль снова и снова без жалоб. Мой код выглядит следующим образом:ActiveDirectory: Сброс пароля в соответствии с историей паролей
private static void PasswordChanger(DirectoryConnection ldapCon,
string distinguishedName,
string passwordToSet = null)
{
// the 'unicodePWD' attribute is used to handle pwd handling requests
// modification control for the replace operation
var damReplace = new DirectoryAttributeModification
{
Name = "unicodePwd"
};
// value to be send with the request
damReplace.Add(Encoding.Unicode.GetBytes(String.Format("\"{0}\"", passwordToSet)));
// this is a replace operation
damReplace.Operation = DirectoryAttributeOperation.Replace;
// combine modification controls
var damList = new DirectoryAttributeModification[]
{
damReplace
};
// init modify request
var modifyRequest = new ModifyRequest(distinguishedName, damList);
// the actual extended control OID
const string ldapServerPolicyHintsOid = "1.2.840.113556.1.4.2239";
// build value utilizing berconverter
var value = BerConverter.Encode("{i}", new object[] { 0x1 });
// init exetnded control. The variable name represts the actual extended control name.
var LDAP_SERVER_POLICY_HINTS_OID = new DirectoryControl(ldapServerPolicyHintsOid,
value, false, true);
// add extended control to modify request
modifyRequest.Controls.Add(LDAP_SERVER_POLICY_HINTS_OID);
/* send the request into the LDAPConnection and receive the response */
var result = ldapCon.SendRequest(modifyRequest);
}
Вызов Password Changer заключен следующим образом,
using (var domain = Domain.GetDomain(new DirectoryContext(
DirectoryContextType.DirectoryServer,
ActiveDirectoryInstance,
request.ServiceAccountName,
request.ServiceAccountPassword)))
using (var directoryEntry = domain.GetDirectoryEntry())
using (var directorySearcher = new DirectorySearcher(directoryEntry))
using (var conn = new LdapConnection(new LdapDirectoryIdentifier(ActiveDirectoryInstance),
new NetworkCredential(request.ServiceAccountName,
request.ServiceAccountPassword,
ActiveDirectoryInstance),
AuthType.Ntlm))
{
...
...
PasswordChanger(....)
...
...
}
EDIT:
Это делать со сценарием объяснено здесь
https://support.microsoft.com/en-us/kb/2386717/
RE мой комментарий re "В качестве альтернативного решения i t можно было бы использовать «SetPassword» и сбросить пароль до сгенерированного значения, а затем заставить пользователя изменить его при следующем входе в систему ».
Мы не можем сделать это в нашем сценарии, поскольку у нас есть история паролей и минимальные возрастные ограничения (24 часа). Поэтому я не могу использовать ChangePassword в пользовательском контексте и SetPassword в контексте администратора (так как это не учитывало бы историю паролей).
Я столкнулся с одним и тем же сценарием и хотел бы знать, сможете ли вы восстановить пароль, соблюдая историю паролей, используя вышеуказанный код. Пожалуйста, поделитесь своими результатами. Заранее спасибо! – Pranay