Feedback

Windows Passwort überprüfen [Übersetzung]

Sprache: C#

Die in C# übersetzte Version von diesem Snippet von Tim Hartwig: http://dotnet-snippets.de/dns/windows-passwort-ueberpruefen-SID655.aspx
[DllImport("advapi32.dll")]
private extern static int LogonUser(string lpszUsernme, string lpszDomain, string lpszPassword, LogonType dwLogonType, int dwLogonProvider, ref IntPtr phToken);

[DllImport("kernel32.dll")]
private extern static bool CloseHandle(IntPtr hObject);
public enum LogonType
{
    LOGON32_LOGON_INTERACTIVE = 2,
    LOGON32_LOGON_NETWORK = 3,
    LOGON32_LOGON_BATCH = 4,
    LOGON32_LOGON_SERVICE = 5,
    LOGON32_LOGON_UNLOCK = 7,
    LOGON32_LOGON_NETWORK_CLEARTEXT = 8,
    LOGON32_LOGON_NEW_CREDENTIALS = 9
}


/// <summary>
/// Determines whether [is NT password valid] [the specified username].
/// </summary>
/// <param name="username">The username.</param>
/// <param name="password">The password.</param>
/// <returns>
/// 	<c>true</c> if [is NT password valid] [the specified username]; otherwise, <c>false</c>.
/// </returns>
public bool IsNTPasswordValid(string username, string password)
{
    return IsNTPasswordValid(username, password, string.Empty);
}


/// <summary>
/// Determines whether [is NT password valid] [the specified username].
/// </summary>
/// <param name="username">The username.</param>
/// <param name="password">The password.</param>
/// <param name="domain">The domain.</param>
/// <returns>
/// 	<c>true</c> if [is NT password valid] [the specified username]; otherwise, <c>false</c>.
/// </returns>
public bool IsNTPasswordValid(string username, string password, string domain)
{
    IntPtr Token = new IntPtr();
    LogonUser(username, domain, password, LogonType.LOGON32_LOGON_INTERACTIVE, 0, ref Token);
    CloseHandle(Token);
    return Token.ToInt32() != 0;
}
[DllImport("advapi32.dll")]
private extern static int LogonUser(string lpszUsernme, string lpszDomain, string lpszPassword, LogonType dwLogonType, int dwLogonProvider, ref IntPtr phToken);

[DllImport("kernel32.dll")]
private extern static bool CloseHandle(IntPtr hObject);
public enum LogonType
{
    LOGON32_LOGON_INTERACTIVE = 2,
    LOGON32_LOGON_NETWORK = 3,
    LOGON32_LOGON_BATCH = 4,
    LOGON32_LOGON_SERVICE = 5,
    LOGON32_LOGON_UNLOCK = 7,
    LOGON32_LOGON_NETWORK_CLEARTEXT = 8,
    LOGON32_LOGON_NEW_CREDENTIALS = 9
}


/// <summary>
/// Determines whether [is NT password valid] [the specified username].
/// </summary>
/// <param name="username">The username.</param>
/// <param name="password">The password.</param>
/// <returns>
/// 	<c>true</c> if [is NT password valid] [the specified username]; otherwise, <c>false</c>.
/// </returns>
public bool IsNTPasswordValid(string username, string password)
{
    return IsNTPasswordValid(username, password, string.Empty);
}


/// <summary>
/// Determines whether [is NT password valid] [the specified username].
/// </summary>
/// <param name="username">The username.</param>
/// <param name="password">The password.</param>
/// <param name="domain">The domain.</param>
/// <returns>
/// 	<c>true</c> if [is NT password valid] [the specified username]; otherwise, <c>false</c>.
/// </returns>
public bool IsNTPasswordValid(string username, string password, string domain)
{
    IntPtr Token = new IntPtr();
    LogonUser(username, domain, password, LogonType.LOGON32_LOGON_INTERACTIVE, 0, ref Token);
    CloseHandle(Token);
    return Token.ToInt32() != 0;
}

3 Kommentare

  1. Hallo!

    Wenn Du beim letzten Argument dem IntPtr ein „ref“ spendierst, dann funktioniert
    der Code sogar 😉

    private static int LogonUser(string lpszUsernme, string lpszDomain, string lpszPassword, LogonType dwLogonType, int dwLogonProvider, ref IntPtr phToken);

  2. Dann muss man dem Aufruf auch ein ref spendieren.
    [code]
    LogonUser(username, domain, password, LogonType.LOGON32_LOGON_INTERACTIVE, 0, ref Token);
    [/code]