winapi visual - Abrufen des Benutzernamens / Kennworts des angemeldeten Benutzers in Windows




studio mfc (9)

Passwort: Nein, dies wird aus Sicherheitsgründen nicht beibehalten - es wird verwendet und dann verworfen. Sie könnten das verschlüsselte Kennwort für diesen Benutzer aus der Registrierung abrufen, ausreichende Berechtigungen erhalten und es dann mithilfe von Rainbow-Tabellen entschlüsseln. Dies ist jedoch mit aktuellen Methoden äußerst ressourcenintensiv und zeitaufwendig. Es ist viel besser, den Benutzer zu veranlassen.

Wenn Sie eine Art "Single-Signon" -System wie Novell implementieren möchten, sollten Sie dies entweder über eine GINA (vor Vista) oder einen Credential Provider (Vista) tun, wodurch Ihr Code den Benutzernamen erhält. und Passwort bei der Anmeldung, der einzige Zeitpunkt, zu dem das Passwort verfügbar ist.

Für Benutzernamen ist es einfach, den aktuellen Benutzernamen (denjenigen, der Ihren Code ausführt) zu erhalten: Die GetUserName-Funktion in AdvApi32.dll erledigt genau dies für Sie.

Wenn Sie als Dienst ausgeführt werden, müssen Sie sich daran erinnern, dass es keinen "angemeldeten Benutzer" gibt: Es gibt mehrere zu jeder Zeit, z. B. LocalSystem, NetworkService, SYSTEM und andere Konten, zusätzlich zu tatsächlichen Personen. Dieser Artikel enthält einige Beispielcode und Dokumentation zu dem Ausführen von dem.

Gibt es eine API, um den aktuell angemeldeten Benutzernamen und das Passwort in Windows zu erhalten?

Vielen Dank im Voraus.


Ich kenne das Windows Login-Passwort nicht ... aber Sie können auf jeden Fall Klartext-Passwörter aus dem Credentials Manager ziehen. Zum Beispiel ist hier ein Programm, um das Passwort für TFS zu ziehen. In den meisten Fällen entspricht dies dem Windows-Login.

namespace ShowPassword
{
    using Microsoft.TeamFoundation.Client;
    using System;
    using System.Net;

    class Program
    {
        static void Main(string[] args)
        {
            var tpc = new TfsTeamProjectCollection(new Uri("http://mycompany.com/tfs"));
            var nc = tpc.Credentials as NetworkCredential;
            Console.WriteLine("the password is " + nc.Password);
        }
    }
}

Ich habe dies als "Konsolen" -App unter vs 2015 mit dem Nuget-Paket TeamFoundation ExtendedClient kompiliert.


GetUserName wird Ihnen den Namen geben, aber das Passwort, das Sie nicht bekommen können. Es ist nicht einmal etwas, das Windows speichert, AFAIK - nur ein Hash Ihres Passworts.

Je nachdem, was Sie erreichen möchten (Sie können uns ein bisschen mehr sagen ...), ist es möglich, einen angemeldeten Benutzer nachzuahmen und Dinge in seinem / ihrem Namen zu tun.


Ich würde es als einen riesigen Sicherheitsfehler betrachten, wenn das möglich wäre!



Sie können das Passwort eines Benutzers seit seiner Verschlüsselung nicht erhalten (um nicht zu erwähnen, dass es eine Standardmethode ist, Passwörter nicht im Klartext zu speichern).

Um den Benutzernamen zu erhalten, können Sie GetUserName oder NPGetUser verwenden


Für die vielen Kommentatoren, die der Meinung sind, dass es nicht möglich ist, das Passwort des aktuell angemeldeten Benutzers anzugeben , siehe Dump-Klartext-Passwörter von angemeldeten Benutzern, die zeigen, wie man mit mimikatz genau das macht:

mimikatz # privilege::debug
Demande d'ACTIVATION du privilège : SeDebugPrivilege : OK

mimikatz # sekurlsa::logonPasswords full
...
Utilisateur principal       : user
Domaine d'authentification  : domain
        kerberos :
         * Utilisateur  : user
         * Domaine      : domain
         * Mot de passe : pass

re "Netzwerk-Passwort-Wiederherstellung" -Werkzeug
Windows (bis zu XP) speichert eine Kopie des passwd mit einer einfacheren, einfach zu knackenden Verschlüsselung - für die Verbindung zu älteren Netzwerk-Shares vom Typ lanmanager. Die Tools versuchen im Allgemeinen alle möglichen Passwörter dagegen, indem sie Rainbow-Tabellen (voralutierte verschlüsselte Versionen von Wörterbuchwörtern) verwenden, um dies zu beschleunigen.

In XPsp2 / 3 Vista wird diese Funktion entfernt. Die neue Verschlüsselung ist viel schwieriger zu knacken und benötigt viele Stunden, um alle möglichen Werte auszuprobieren. Es gibt Online-Dienste, die sie auf einer großen Anzahl von Maschinen laufen lassen, um Ihnen eine schnelle Antwort für einen Preis zu geben.

Um das Original-Poster zu beantworten, speichern Sie das Passwort im Allgemeinen nicht und vergleichen es mit dem, was der Benutzer eingegeben hat. Sie verschlüsseln (tatsächlich hash) das eingegebene Passwort und speichern es. Um ein Passwort zu überprüfen, führen Sie die gleiche Verschlüsselung durch, egal was der Benutzer eingegeben hat und vergleichen Sie dies. Es ist generell nicht möglich, von der verschlüsselten Form zurück zu dem echten Passwort zu gehen.

EDIT Ich vermute, dass Sie hier die falsche Frage stellen - warum wollen Sie das Passwort, was wollen Sie überprüfen und wann?


Ich habe den Asm-Code für beide Fälle (in VC ++ 2013 Express), im Release-Build, den Asm-Code im Release-Build der for-Schleife verglichen

for (int i = 0; i< Period; i++)

ist unten, und es ist sehr unterschiedlich zu dem im Debug-Build

[email protected]:

; 23   :        sum = 0;
; 24   :        for (int i = 0; i< Period; i++){

    xorps   xmm5, xmm5
    lea eax, DWORD PTR [edi+88]
    xorps   xmm4, xmm4
    mov ecx, 3
    npad    2
[email protected]:

; 25   :            //cout << "hi";
; 26   :            sum += A[bars - i];

    movd    xmm2, DWORD PTR [eax-4]
    lea eax, DWORD PTR [eax-32]
    movd    xmm0, DWORD PTR [eax+32]
    movd    xmm1, DWORD PTR [eax+36]
    movd    xmm3, DWORD PTR [eax+40]
    punpckldq xmm3, xmm0
    movd    xmm0, DWORD PTR [eax+48]
    punpckldq xmm1, xmm2
    movd    xmm2, DWORD PTR [eax+44]
    punpckldq xmm3, xmm1
    movd    xmm1, DWORD PTR [eax+52]
    paddd   xmm5, xmm3
    movd    xmm3, DWORD PTR [eax+56]
    punpckldq xmm3, xmm0
    punpckldq xmm1, xmm2
    punpckldq xmm3, xmm1
    paddd   xmm4, xmm3
    dec ecx
    jne SHORT [email protected]

; 23   :        sum = 0;
; 24   :        for (int i = 0; i< Period; i++){

    paddd   xmm4, xmm5
    xor edx, edx
    movdqa  xmm0, xmm4
    mov eax, edi
    psrldq  xmm0, 8
    mov esi, 3
    paddd   xmm4, xmm0
    movdqa  xmm0, xmm4
    psrldq  xmm0, 4
    paddd   xmm4, xmm0
    movd    ebx, xmm4
    npad    7
[email protected]:

; 25   :            //cout << "hi";
; 26   :            sum += A[bars - i];

    add ecx, DWORD PTR [eax]
    lea eax, DWORD PTR [eax-8]
    add edx, DWORD PTR [eax+4]
    dec esi
    jne SHORT [email protected]

; 27   :    

}

Wie Sie aus dem asm-Code entnehmen können, werden hier SSE-Anweisungen verwendet. Also habe ich die Compiler-Optionen für SSE-Anweisungen in VC ++ überprüft, dann habe ich / arch: IA32 angegeben, um die Erzeugung von SSE- und SSE2-Anweisungen für x86-Prozessoren im Release-Build zu deaktivieren, dann kam das gleiche Ergebnis wie beim Debug-Build.

Ich bin nicht vertraut mit SSE, ich hoffe, dass jemand basierend auf meinen Ergebnissen mehr erklären kann.







winapi visual-c++ mfc