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

Windows Discussion :

Comment récupérer le nom du compte Système ?


Sujet :

Windows

  1. #1
    Membre du Club Avatar de masterx_goldman
    Inscrit en
    Mai 2008
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 164
    Points : 51
    Points
    51
    Par défaut Comment récupérer le nom du compte Système ?
    Bonjour tout le monde,

    Je savoir si le compte( ou session ) actif est un compte Système ou User ..

    Alors, Y'a pas une fonction de l'API Win32 qui me donne le nom exacte du compte système ? ( SYSTEM en anglais, SYSTÈME en français ...) ? ou alors je dois me plonger dans les SID .. ?

    Merci pour vos réponses!

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 184
    Points : 12 326
    Points
    12 326

  3. #3
    Membre du Club Avatar de masterx_goldman
    Inscrit en
    Mai 2008
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 164
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par bacelar Voir le message
    et comment je peux récupérer le SID et tester "sa valeur" ? Car on parle de GetTextualSid() sur google mais je la trouve pas sur msdn !
    Ou bien y'a une autre méthode de l'API .. ?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 184
    Points : 12 326
    Points
    12 326

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Alloué avec AllocateAndInitializeSid(), cherché avec LookupAccountSid()...

  6. #6
    Membre du Club Avatar de masterx_goldman
    Inscrit en
    Mai 2008
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 164
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Alloué avec AllocateAndInitializeSid(), cherché avec LookupAccountSid()...
    Merci pour l'indication et je vais mettre la solution pour que ça puisse aider ceux qui voudront chercher la même chose:
    Code C : 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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
     
    #include "stdafx.h"
    #include <windows.h>
    #include <stdio.h>
    #pragma comment(lib, "advapi32.lib")
     
    #define MAX_NAME 256
    BOOL SearchTokenGroupsForSID (VOID) ;
    int main()
    {
     
    SearchTokenGroupsForSID();
    return 0;
     
    }
     
    BOOL SearchTokenGroupsForSID (VOID) 
    {
    	DWORD i, dwSize = 0, dwResult = 0;
    	HANDLE hToken;
    	PTOKEN_USER pUserInfo;
    	SID_NAME_USE SidType;
    	char lpName[MAX_NAME];
    	char lpDomain[MAX_NAME];
    	BYTE sidBuffer[100];
    	PSID pSID = (PSID)&sidBuffer;
    	SID_IDENTIFIER_AUTHORITY SIDAuth = SECURITY_NT_AUTHORITY;
     
    	// Open a handle to the access token for the calling process.
     
    	if (!OpenProcessToken( GetCurrentProcess(), TOKEN_QUERY, &hToken )) 
    	{
    		printf( "OpenProcessToken Error %u\n", GetLastError() );
    		return FALSE;
    	}
     
     
     
    	// Call GetTokenInformation to get the buffer size.
     
    	if(!GetTokenInformation(hToken, TokenUser, NULL, dwSize, &dwSize)) 
    	{
    		dwResult = GetLastError();
    		if( dwResult != ERROR_INSUFFICIENT_BUFFER ) {
    			printf( "GetTokenInformation Error %u\n", dwResult );
    			return FALSE;
    		}
    	}
     
     
    	// Allocate the buffer.
     
     
    	pUserInfo = (PTOKEN_USER) GlobalAlloc( GPTR, dwSize );
     
     
    	// Call GetTokenInformation again to get the User information.
     
    	if(! GetTokenInformation(hToken, TokenUser, pUserInfo, 
    							dwSize, &dwSize ) ) 
    	{
    		printf( "GetTokenInformation Error %u\n", GetLastError() );
    		return FALSE;
    	}
     
     
     
    	// Create a SID for the Local System Account.
     
    	if(! AllocateAndInitializeSid( &SIDAuth, 1,
    					 SECURITY_LOCAL_SYSTEM_RID,
    											0,
    					 0, 0, 0, 0, 0, 0,
    					 &pSID) ) 
    	{
    		printf( "AllocateAndInitializeSid Error %u\n", GetLastError() );
    		return FALSE;
    	}
     
     
    	if( !LookupAccountSid( NULL, pUserInfo->User.Sid,
    								  lpName, &dwSize, lpDomain, 
    								  &dwSize, &SidType ) ) 
    			{
    				dwResult = GetLastError();
    				if( dwResult == ERROR_NONE_MAPPED )
    				   strcpy_s (lpName, dwSize, "NONE_MAPPED" );
    				else 
    				{
    					printf("LookupAccountSid Error %u\n", GetLastError());
    					return FALSE;
    				}
    			}
    	printf( "Current user is  %s\n", lpName );
    	if ( EqualSid(pSID,pUserInfo->User.Sid) )
    		printf("User is SYSTEM\n");
    	else
    		printf("User is not SYSTEM\n");
     
     
     
    	if (pSID)
    		FreeSid(pSID);
    	if ( pUserInfo )
    		GlobalFree( pUserInfo );
    	while(true)
    		Sleep(1000);
    	return TRUE;
    }
    Voilà le résultat de l'exécution sous un compte Administrateur
    Current user is Administrateur
    User is not SYSTEM
    Voilà le résultat de l'exécution sous le compte SYSTEM
    Current user is SYSTEM
    User is SYSTEM
    RQ: Pour lancer un exécutable sous compte SYSTEM utiliser PsTools


  7. #7
    Membre du Club Avatar de masterx_goldman
    Inscrit en
    Mai 2008
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 164
    Points : 51
    Points
    51
    Par défaut Solution finale
    En faite pour être plus rigoureux, on n'a pas besoin de la fonction LookupAccountSid pour comparer les deux SID.
    Le principe est le suivant:
    Récupérer le SID du CurrentUser, puis construire un SID pour le compte SYSEM et puis utiliser la fonction EqualSid pour conclure.
    Le code précédent permer d'obtenir le nom du compte à partir du SID et ça c'est une option supplémentaire dont a pas besoin pour le contexte de ma question.

    Voici le code final:
    Code C : 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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
    #include "stdafx.h"
    #include <windows.h>
    #include <stdio.h>
    #pragma comment(lib, "advapi32.lib")
     
    #define MAX_NAME 256
    BOOL SearchTokenGroupsForSID (VOID) ;
    int main()
    {
     
    SearchTokenGroupsForSID();
    return 0;
     
    }
     
    BOOL SearchTokenGroupsForSID (VOID) 
    {
    	DWORD dwSize = 0, dwResult = 0;
    	HANDLE hToken;
    	PTOKEN_USER pUserInfo;
    	BYTE sidBuffer[100];
    	PSID pSID = (PSID)&sidBuffer;
    	SID_IDENTIFIER_AUTHORITY SIDAuth = SECURITY_NT_AUTHORITY;
     
    	// Open a handle to the access token for the calling process.
     
    	if (!OpenProcessToken( GetCurrentProcess(), TOKEN_QUERY, &hToken )) 
    	{
    		printf( "OpenProcessToken Error %u\n", GetLastError() );
    		return FALSE;
    	}
     
     
     
    	// Call GetTokenInformation to get the buffer size.
     
    	if(!GetTokenInformation(hToken, TokenUser, NULL, dwSize, &dwSize)) 
    	{
    		dwResult = GetLastError();
    		if( dwResult != ERROR_INSUFFICIENT_BUFFER ) {
    			printf( "GetTokenInformation Error %u\n", dwResult );
    			return FALSE;
    		}
    	}
     
     
    	// Allocate the buffer.
     
     
    	pUserInfo = (PTOKEN_USER) GlobalAlloc( GPTR, dwSize );
     
     
    	// Call GetTokenInformation again to get the User information.
     
    	if(! GetTokenInformation(hToken, TokenUser, pUserInfo, 
    							dwSize, &dwSize ) ) 
    	{
    		printf( "GetTokenInformation Error %u\n", GetLastError() );
    		return FALSE;
    	}
     
     
     
    	// Create a SID for the Local System Account.
     
    	if(! AllocateAndInitializeSid( &SIDAuth, 1,
    					 SECURITY_LOCAL_SYSTEM_RID,
    											0,
    					 0, 0, 0, 0, 0, 0,
    					 &pSID) ) 
    	{
    		printf( "AllocateAndInitializeSid Error %u\n", GetLastError() );
    		return FALSE;
    	}
     
     
    	if ( EqualSid(pSID,pUserInfo->User.Sid) )
    		printf("User is SYSTEM\n");
    	else
    		printf("User is not SYSTEM\n");
     
     
     
     
    	if (pSID)
    		FreeSid(pSID);
    	if ( pUserInfo )
    		GlobalFree( pUserInfo );
    	return TRUE;
    }

    Bon courage

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment récupérer le nom du fichier sans l'extension ?
    Par altahir007 dans le forum Langage
    Réponses: 16
    Dernier message: 13/11/2009, 13h20
  2. Récupérer le nom du compte système local
    Par elsuket dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 14/01/2009, 20h59
  3. Réponses: 2
    Dernier message: 23/07/2005, 00h10
  4. [VB.NET] Comment récupérer le nom d'un control avec le focus
    Par jayce007 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 20/01/2005, 00h53
  5. Réponses: 11
    Dernier message: 16/10/2004, 18h14

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