Чтение локальной политики паролей программным способом
существуют ли функции API Windows, которые позволяют читать текущую политику паролей? Например, минимальную длину, сложность и т. д.
Если не чтение, есть ли способ проверить пароль против политики программно?
3 ответов
посмотреть Security Watch Политики Паролей Домена Windows. Вы можете нажать объявление, используя ADSI или ее фантики. Я нашел пример VBScript. Вы можете перевести его на любой язык вы хотите:
Sub ListPasswordPolicyInfo( strDomain )
Dim objComputer
Set objComputer = GetObject("WinNT://" & strDomain )
WScript.Echo "MinPasswordAge: " & ((objComputer.MinPasswordAge) / 86400)
WScript.Echo "MinPasswordLength: " & objComputer.MinPasswordLength
WScript.Echo "PasswordHistoryLength: " & objComputer.PasswordHistoryLength
WScript.Echo "AutoUnlockInterval: " & objComputer.AutoUnlockInterval
WScript.Echo "LockOutObservationInterval: " & objComputer.LockOutObservationInterval
End Sub
Dim strDomain
Do
strDomain = inputbox( "Please enter a domainname", "Input" )
Loop until strDomain <> ""
ListPasswordPolicyInfo( strDomain )
в качестве бонуса, проверить администратор LDAP. Это редактор каталогов LDAP с открытым исходным кодом, который можно использовать для тестирования, а также проверки кода, написанного на Delphi.
ответ Юджина полезен, но не совсем то, что мне нужно. Фильтр сложности пароля можно настроить, и что было бы хорошо, если бы спросить Windows, соответствует ли этот пароль требованиям?
Мне потребовалось некоторое время, чтобы найти его, но функция NetValidatePasswordPolicy
. Документы MSDN для этой функции ужасны; проверьте это запись в блоге MSDN вместо.
запрос ActiveDirectory работает только для компьютеров, присоединенных к домену; и где пользователь имеет возможность запросить контроллер домена (который может быть не предоставлен).
@NicholasWilson использоватьNetValidatePasswordPolicy
хорошая; как это умеют делать много тяжелой работы для вас. Он даже может выполнять проверки качества пароля, вам придется повторно реализовать себя. Но!--1--> не удается проверить историю пользовательских паролей при использовании соленых хэшей для хранить пароли (например, BCrypt или Scrypt).
но реальный вопрос заключается в том, как запросить политику паролей текущей машины (даже не присоединенной к домену машины). Вы можете запросить это, используя:
struct USER_MODALS_INFO_0
{
DWORD usrmod0_min_passwd_len;
DWORD usrmod0_max_passwd_age;
DWORD usrmod0_min_passwd_age
DWORD usrmod0_force_logoff;
DWORD usrmod0_password_hist_len;
}
PUSER_MODALS_INFO_0 = ^USER_MODALS_INFO_0;
PUSER_MODALS_INFO_0 info0;
NET_API_STATUS res = NetUserModalsGet(nil, 0, out info0);
if (res <> NERR_Success)
RaiseWin32Error(res);
try
//Specifies the minimum allowable password length.
//Valid values for this element are zero through PWLEN.
Log(info0.usrmod0_min_passwd_len);
//Specifies, in seconds, the maximum allowable password age.
//A value of TIMEQ_FOREVER indicates that the password never expires.
//The minimum valid value for this element is ONE_DAY.
//The value specified must be greater than or equal to the value for the usrmod0_min_passwd_age member.
Log(info0.usrmod0_max_passwd_age);
//Specifies the minimum number of seconds that can elapse between the time
//a password changes and when it can be changed again.
//A value of zero indicates that no delay is required between password updates.
//The value specified must be less than or equal to the value for the usrmod0_max_passwd_age member.
Log(info0.usrmod0_min_passwd_age);
//Specifies, in seconds, the amount of time between the end of the valid
// logon time and the time when the user is forced to log off the network.
//A value of TIMEQ_FOREVER indicates that the user is never forced to log off.
//A value of zero indicates that the user will be forced to log off immediately when the valid logon time expires.
Log(info0.usrmod0_force_logoff);
//Specifies the length of password hi'+'story maintained.
//A new password cannot match any of the previous usrmod0_password_hist_len passwords.
//Valid values for this element are zero through DEF_MAX_PWHIST
Log(info0.usrmod0_password_hist_len);
finally
NetApiBufferFree(info0);
end;