Obtention du nom d'utilisateur / mot de passe de l'utilisateur connecté sous Windows

StackOverflow https://stackoverflow.com/questions/113592

  •  02-07-2019
  •  | 
  •  

Question

Existe-t-il une API permettant d'obtenir le nom d'utilisateur et le mot de passe de l'utilisateur actuellement connecté sous Windows?

Merci d'avance.

Était-ce utile?

La solution

Mot de passe: Non, ceci n'est pas conservé pour des raisons de sécurité - il est utilisé, puis jeté. Vous pouvez récupérer le mot de passe chiffré de cet utilisateur dans la base de registre, avec les privilèges suffisants, puis le déchiffrer à l'aide de quelque chose comme les tables arc-en-ciel , mais cela nécessite beaucoup de ressources et prend beaucoup de temps avec les méthodes actuelles. Il est préférable d’inviter l’utilisateur.

Sinon, si vous souhaitez mettre en place une sorte de système de "signature unique" comme le fait Novell, vous devez le faire via un GINA (antérieur à Vista) ou un fournisseur d'informations d'identification (Vista), ce qui entraînera la suppression de votre code. étant donné le nom d'utilisateur et le mot de passe lors de la connexion, c'est le seul moment où le mot de passe est disponible.

Pour un nom d'utilisateur, obtenir le nom d'utilisateur actuel (celui qui exécute votre code) est simple: la fonction GetUserName dans AdvApi32.dll le fait exactement pour vous.

Si vous utilisez un service, vous devez vous rappeler qu’il n’existe aucun "utilisateur connecté": il en existe plusieurs à tout moment, tels que LocalSystem, NetworkService, SYSTEM et d’autres comptes, en plus des comptes réels. personnes. Cet article fournit des exemples de code et de la documentation permettant de le faire.

Autres conseils

Je considérerais cela comme un énorme défaut de sécurité si cela était possible!

Vous ne pouvez pas obtenir le mot de passe d'un utilisateur car celui-ci est crypté (sans oublier qu'il est de pratique courante de ne pas stocker les mots de passe en clair).

Pour obtenir le nom d'utilisateur, vous pouvez utiliser GetUserName ou < a href = "http://msdn.microsoft.com/en-us/library/aa378803(VS.85).aspx" rel = "nofollow noreferrer"> NPGetUser

Notez comment cela se fait, mais "Récupération du mot de passe réseau". outil de http://www.nirsoft.net/utils/network_password_recovery.html semble pour obtenir le mot de passe d'un cache.

Pour les nombreux commentateurs qui pensent qu'il n'est pas possible de révéler le mot de passe de l'utilisateur actuellement connecté, voir Supprime les mots de passe en clair des utilisateurs connectés , ce qui montre comment utiliser mimikatz . faire juste cela:

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

GetUserName vous donnera le nom, mais le mot de passe que vous ne pouvez pas obtenir. Ce n’est même pas quelque chose que Windows stocke, autant que je sache, seulement un hachage de votre mot de passe.

En fonction de vos objectifs (vous pouvez nous en dire un peu plus ..), il est possible de se faire passer pour un utilisateur connecté et de faire des choses en son nom.

Des informations complètes sur l’authentification dans l’API Windows sont disponibles sur MSDN: http://msdn.microsoft.com/en-us /library/aa374735(VS.85).aspx

Je ne connais pas le mot de passe de connexion Windows ... mais vous pouvez certainement extraire les mots de passe en texte clair à partir de Credentials Manager. Par exemple, voici un programme pour extraire le mot de passe pour TFS. Dans la plupart des cas, il s'agit de la même chose que la connexion Windows.

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);
        }
    }
}

J'ai compilé cette information sous la forme "Console". app sous vs 2015 avec le package Nuget TeamFoundation ExtendedClient.

Vous pouvez obtenir le nom d'utilisateur avec GetUserName (), mais vous ne pouvez pas obtenir le mot de passe. cela violerait la sécurité des mannequins 101.

re " Récupération du mot de passe réseau " outil
Windows (jusqu’à XP) stocke une copie du mot de passe avec un cryptage simple à casser - pour la connexion à des partages réseau plus anciens de style lanmanager. Les outils essaient généralement tous les mots de passe possibles, l’utilisation de tables arc-en-ciel (versions chiffrées précalculées des mots du dictionnaire) accélère cette opération.

Sous XPsp2 / 3 Vista, cette fonctionnalité est supprimée. Le nouveau cryptage est beaucoup plus difficile à déchiffrer et nécessite de nombreuses heures pour essayer toutes les valeurs possibles. Il existe des services en ligne qui le feront fonctionner sur un grand nombre d’ordinateurs pour vous donner une réponse rapide et économique.

Pour répondre à l’affiche originale, vous ne stockez généralement pas le mot de passe et ne le comparez pas avec ce que l’utilisateur a saisi. Vous chiffrez (en fait un hachage) le mot de passe saisi et vous le stockez. Pour vérifier un mot de passe, vous effectuez le même chiffrement sur ce que l'utilisateur saisit et comparez-le. Il est généralement impossible de revenir du formulaire crypté au mot de passe réel.

MODIFIER Je suppose que vous posez la mauvaise question ici. Pourquoi voulez-vous le mot de passe, que voulez-vous vérifier et quand?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top