2008-11-24 8 views
7

Gibt es Windows-API-Funktionen, die das Lesen der aktuellen Kennwortrichtlinie ermöglichen? Zum Beispiel, minimale Länge, Komplexität usw.Die lokale Kennwortrichtlinie programmgesteuert lesen

Wenn nicht lesen, gibt es eine Möglichkeit, ein Passwort gegen die Richtlinie programmgesteuert zu überprüfen?

Antwort

5

Siehe Security Watch Windows Domain Password Policies. Sie können AD mit ADSI oder seinen Wrappern treffen. Ich habe eine VBScript sample gefunden. Sie können es in jede beliebige Sprache übersetzen Sie wollen:

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) 

Als Bonus Besuche LDAP Admin. Es ist ein Open-Source-LDAP-Verzeichnis-Editor, mit dem Sie Dinge testen und auch den in Delphi geschriebenen Code auschecken können.

3

Eugenes Antwort ist hilfreich, aber nicht ganz das, was ich brauchte. Der Passwortkomplexitätsfilter kann tatsächlich angepasst werden, und was wäre gut, wäre eine Möglichkeit, Windows zu fragen, ob dieses Passwort die Anforderungen erfüllt?

Es dauerte eine Weile, bis ich es gefunden habe, aber die Funktion ist NetValidatePasswordPolicy. Die MSDN-Dokumentation für diese Funktion ist schrecklich; Schauen Sie sich stattdessen MSDN blog entry an.

1

Abfragen von ActiveDirectory funktioniert nur für Computer, die einer Domäne angehören; und wo der Benutzer die Möglichkeit hat, den Domänencontroller abzufragen (was nicht gewährbar ist).

@ NicholasWilson die Antwort der Verwendung von NetValidatePasswordPolicy ist eine gute; wie es eine Menge schweres Heben für Sie tun kann. Es kann sogar eine Überprüfung der Kennwortqualität durchführen, die Sie selbst erneut durchführen müssen. Aber NetValidatePasswordPolicy schlägt bei der Überprüfung Ihres benutzerdefinierten Kennwortverlaufs fehl, wenn Sie gesalzene Hashes zum Speichern von Kennwörtern verwenden (z. B. BCrypt oder Scrypt).

Aber die eigentliche Frage ist, wie für die aktuelle Passwortrichtlinie der aktuellen Maschine (auch eine nicht Domäne verbundene Maschine) abzufragen ist. Sie können abfragen, dass die Verwendung von:

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; 
Verwandte Themen