IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

[win32] Get Windows User principal


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Juillet 2002
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 21
    Par défaut [win32] Get Windows User principal
    Bonjour,

    Je cherche le moyen de récupérer le principal (user@domain) de l'utilisateur connecté à Windows.

    Si j'avais pu le faire en .net, j'aurai utilisé grosso modo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    WindowsIdentity wi = WindowsIdentity.GetCurrent();
    WindowsPrincipal wp = new WindowsPrincipal(wi);
    return wp.Identity.Name;
    Malheureusement, je dois faire une dll simple sans le framework .net qui intègre ces classes.

    Je ne peux pas utiliser le getUserName qui récupère simplement l'utilisateur du processus, je dois obtenir les infos depuis kerberos.

    Avez vous déjà fait ce genre de chose ? J'ai passé la journée à chercher des infos, j'ai des pistes (GSSAPI, SSPI...) mais je ne trouve rien de bien concret (un petit exemple, une doc claire...)

    Merci d'avance

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    tu as essayé GetUserNameEx() ici : http://msdn.microsoft.com/en-us/libr...35(VS.85).aspx ?
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre averti
    Inscrit en
    Juillet 2002
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 21
    Par défaut
    Retrieves the name of the user or other security principal associated with the calling thread.
    Ca fait pareil que getUserName a peu près et j'en veux pas...

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    La fonction .Net WindowsIdentity.GetCurrent() ne fait-elle pas la même chose ?
    La doc dit seulement "current Windows user", ce qui n'est pas très explicite...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre averti
    Inscrit en
    Juillet 2002
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 21
    Par défaut
    Citation Envoyé par rellik Voir le message
    Malheureusement, je dois faire une dll simple sans le framework .net qui intègre ces classes.
    Sans .net ...

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Là n'est pas ma question.

    Tu reproches aux fonctions proposées de faire un truc, et moi je pointe le fait que les fonctions .Net que TU as mentionnées et dont TU demandes un équivalent semblent faire la même chose...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre averti
    Inscrit en
    Juillet 2002
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 21
    Par défaut
    Je ne comprends pas ta remarque, tout ce que je sais c'est que je ne PEUX pas utiliser .net et que je veux mieux que le user du thread courant... peut être que ca n'existe pas ?!

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Dans ce cas
    1. commence par dire précisément quel user tu veux
    2. évite de poster le nom de fonctions (.Net ou non) qui ne font pas ce que tu veux en prétendant qu'elles le font...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre averti
    Inscrit en
    Juillet 2002
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 21
    Par défaut
    Je pense avoir été très clair dans mon premier message :

    Il me faut le user connecté a windows via le ticket kerberos.
    Je cherche le moyen de récupérer le principal (user@domain) de l'utilisateur connecté à Windows.
    Je donnais l'exemple .net car c'est exactement ce que je veux mais c'est en .net et je n'en fais pas. (c'est pour étailler mon besoin)
    Si j'avais pu le faire en .net, j'aurai utilisé grosso modo... Malheureusement, je dois faire une dll simple sans le framework .net
    Je disais également que je ne veux pas du user du thread car après avoir parcouru le forum, tout le monde a eu droit au GetUserName qui récupère le user du thread courant.
    Je ne peux pas utiliser le getUserName qui récupère simplement l'utilisateur du processus, je dois obtenir les infos depuis kerberos.
    Désolé si ca été mal compris...

    D'autres idées plus constructives ?

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Que veux-tu dire par "l'utilisateur connecté à Windows" ?
    L'utilisateur interactif ?
    L'utilisateur à qui appartient la session du processus courant (si cette notion existe) ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre averti
    Inscrit en
    Juillet 2002
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 21
    Par défaut
    Je réponds tardivement (vacances oblige ).

    Il s'agit de l'utilisateur loggé. Admettons que je ne fasse pas de SSO (single sign on), j'utiliserai LogonUser mais là je ne veux pas que l'utilisateur ait à retaper son login/pass, je veux l'utilisateur qui s'est connecté à Windows sur le domaine avec son compte.

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Le problème, c'est qu'il n'y a pas qu'un seul "utilisateur loggué". En quelle langue faut-il te le dire?

    Si ce que tu cherches, c'est l'utilisateur propriétaire de la session/desktop/window station où tourne le processus courant (il doit bien y en avoir un dans le lot qui a un propriétaire), c'est peut-être possible, mais je ne sais pas comment (peut-être GetThreadDesktop() + GetKernelObjectSecurity() si les desktops sont des objets du kernel, mais je n'en suis pas sûr).

    Tu n'as qu'à me montrer comment tu fais vraiment ça en .Net, et on verras si on peut faire la même chose sans...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre averti
    Inscrit en
    Juillet 2002
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 21
    Par défaut
    Voilà ce que j'ai fait en c# .net

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    using System.Security;
    using System.Security.Permissions;
    using System.Security.Principal;
    
    [...]
    AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
    WindowsIdentity wi = WindowsIdentity.GetCurrent();
    if (!wi.AuthenticationType.Equals("Kerberos"))
    {
      throw new Exception("Not a Kerberos Authentication");
    }
    
    WindowsPrincipal wp = new WindowsPrincipal(wi);
    if (wp.Identity.IsAuthenticated)
    {
       return wp.Identity.Name;
    }
    else
    {
      throw new Exception("Not authenticated");
    }
    cela me remonte domain\\user, exactement ce que je veux

  14. #14
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Donc, ça reste les infos de l'user du thread courant.
    Dans ce cas, je te conseillerais d'utiliser OpenThreadToken() (ou juste OpenProcessToken()) et récupérer les informations dessus, par exemple avec GetTokenInformation(TokenUser) (tu peux obtenir le nom d'un utilisateur à partir de son SID avec LookupAccountSid())...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Membre averti
    Inscrit en
    Juillet 2002
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 21
    Par défaut
    Merci ! Pour info, voilà comment j'ai fait au final... je verrai si ça fonctionne bien sur différents domaines :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    std::string* AuthenticateUserSSO()
    {
    	HANDLE hToken;
    	DWORD dwSize = 0, dwResult = 0, dwName=1, dwDomain=1;
    	PTOKEN_USER pUserInfo;
    	LPTSTR lpName="";
    	LPTSTR lpDomain="";
    	SID_NAME_USE SidType = SidTypeUnknown;
    
    	if (! OpenProcessToken( GetCurrentProcess(), TOKEN_QUERY, &hToken)) {
    		dwResult = GetLastError();
    		return NULL;
    	}
    
    	if (! GetTokenInformation(hToken, TokenUser, NULL, dwSize, &dwSize)) {
    		dwResult = GetLastError();
    		if( dwResult != ERROR_INSUFFICIENT_BUFFER ) {
    			return NULL;
    		}
    	}
    
    	pUserInfo = (PTOKEN_USER) GlobalAlloc( GPTR, dwSize );
    
    	if (! GetTokenInformation(hToken, TokenUser, pUserInfo, dwSize, &dwSize)) {
    		dwResult = GetLastError();
    		return NULL;
    	}
    
    	if( !LookupAccountSid(NULL, 
    		pUserInfo->User.Sid,
                    lpName,
    		(LPDWORD)&dwName,
    		lpDomain, 
                    (LPDWORD)&dwDomain,
    		&SidType ) ) {
    		dwResult = GetLastError();
    		if( dwResult != ERROR_INSUFFICIENT_BUFFER ) {
    			return NULL;
    		}
    	}
    
    	lpName = (LPTSTR) GlobalAlloc(GMEM_FIXED, dwName);
    	if (lpName == NULL)
    		return NULL;
    	lpDomain = (LPTSTR) GlobalAlloc(GMEM_FIXED, dwDomain);
    	if (lpDomain == NULL)
    		return NULL;
    
    	if( !LookupAccountSid(NULL, 
    		pUserInfo->User.Sid,
                    lpName,
    		(LPDWORD)&dwName,
    		lpDomain, 
                    (LPDWORD)&dwDomain,
    		&SidType ) ) {
    		dwResult = GetLastError();
    		if( dwResult != ERROR_INSUFFICIENT_BUFFER ) {
    			return NULL;
    		}
    	}
    	std::string* principal = new string(lpName);
    	principal->append("@");
    	principal->append(lpDomain);
    	return principal;
    }
    Par contre, j'ai été un peu surpris de devoir mettre le truc en gris (tester l'erreur de taille du buffer) alors que je le fais deja au dessus...

    Si vous avez plus propre je suis preneur (je trouve un peu bizarre de devoir appeler les fonctions 2 fois).

  16. #16
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par rellik Voir le message
    je trouve un peu bizarre de devoir appeler les fonctions 2 fois.
    Cela ne me choque pas et c'est fait comme cela pour d'autre appels aussi.

    Tu appelles une 1ere fois pour connaitre la taille de l'info retournée et une 2eme fois pour récupérer l'info.

    Tu peux peut être optimiser en fournissant lors du 1er appel une taille arbitraire (1024 octets par exemple) et un buffer correctement alloué. Avec un peu de chance, il y aura assez et cela ne necessitera pas de 2eme appel. Mais bon, est ce que cette optimisation en vaut le coup. Libre à chacun de juger.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  17. #17
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Je ne trouve pas ça bizarre, c'est une pratique commune. Le snprintf() du standard C99 (mais ça, Microsoft ne sait pas ce que c'est) permet cela également...
    Pour la seconde erreur, je pense que tu compiles en unicode, et que tu as oublié que la taille retournée est en TCHAR, pas en octets.

    PS: Les casts en (LPDWORD) sont-ils vraiment nécessaires ??
    PPS: Ce code est bourré de fuites de mémoire. Plutôt que GlobalAlloc(), tu devrais plutôt utiliser des std::vector<TCHAR>() avec la bonne taille...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  18. #18
    Membre averti
    Inscrit en
    Juillet 2002
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 21
    Par défaut
    Merci, je vais faire un peu de ménage...

    Je suis un javaiste à la base alors la gestion de la mémoire... mais bon merci des conseils.

Discussions similaires

  1. Windows user account password recovery
    Par Dandi dans le forum Administration
    Réponses: 0
    Dernier message: 30/12/2009, 15h07
  2. passer 3 paramètres par get à window.open
    Par beegees dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/02/2009, 09h20
  3. SQL Server et windows user
    Par nicotine002 dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 27/03/2008, 10h17
  4. Réponses: 4
    Dernier message: 28/06/2007, 17h25
  5. [Eclipse 3.0]Pbl install eclipse 3.0 win32 sous windows XP
    Par LAVENU dans le forum Eclipse Java
    Réponses: 8
    Dernier message: 23/08/2004, 16h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo