Чтение локальной политики паролей программным способом

существуют ли функции 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).

но реальный вопрос заключается в том, как запросить политику паролей текущей машины (даже не присоединенной к домену машины). Вы можете запросить это, используя:

NetUserModalsGet

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;