Чтение локальной политики паролей программно - PullRequest
7 голосов
/ 24 ноября 2008

Существуют ли функции Windows API, позволяющие считывать текущую политику паролей? Например, минимальная длина, сложность и т. Д.

Если не читать, есть ли способ программно проверить пароль по отношению к политике?

Ответы [ 3 ]

5 голосов
/ 24 ноября 2008

См. Security Watch Политики паролей домена Windows . Вы можете нажать AD, используя 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.

3 голосов
/ 11 мая 2012

Ответ Евгения полезен, но не совсем то, что мне было нужно. Фильтр сложности пароля на самом деле может быть настроен, и что будет хорошо, если спросить Windows, соответствует ли этот пароль требованиям?

Мне потребовалось некоторое время, чтобы найти его, но функция NetValidatePasswordPolicy. Документы MSDN для этой функции ужасны; проверьте эту запись в блоге MSDN вместо.

1 голос
/ 23 июня 2015

Запрос ActiveDirectory работает только для компьютеров, подключенных к домену; и где пользователь имеет возможность запрашивать контроллер домена (что может быть не предоставлено).

@ Хороший ответ Николаса Уилсона на использование NetValidatePasswordPolicy; как это может сделать много тяжелой работы для вас. Он может даже выполнять проверку качества пароля, который вам придется заново реализовать самостоятельно. Но NetValidatePasswordPolicy не удается проверить историю пользовательских паролей, когда вы используете соленые хэши для хранения паролей (например, 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...