Comment obtenir le SID de l’utilisateur connecté dans Windows

Je dois obtenir le format de chaîne SID de l’utilisateur connecté. J’ai déjà le nom d’utilisateur et j’essaie d’utiliser LookupAccountName pour obtenir le SID. Cela fonctionne en partie – je reçois un SID mais il ne s’agit que d’une correspondance partielle avec le SID réel de l’utilisateur.

Je ne veux pas le SID du propriétaire du processus car le processus peut être élevé (usurpation d’identité), mais je veux plutôt le SID de l’utilisateur qui est connecté sur lequel le processus est en cours d’exécution.

Le code doit fonctionner avec des privilèges non élevés.

Ceci est mon code jusqu’ici

LPCTSTR wszAccName = TEXT("hardcoded username for testing"); LPTSTR wszDomainName = (LPTSTR)GlobalAlloc(GPTR, sizeof(TCHAR) * 1024); DWORD cchDomainName = 1024; SID_NAME_USE eSidType; SID sid; DWORD cbSid = 1024; if (!LookupAccountName(NULL, wszAccName, &sid, &cbSid, wszDomainName, &cchDomainName, &eSidType)) { return GetLastError(); } if (!ConvertSidToSsortingngSid(&sid, &pszSidBuffer)) { return GetLastError(); } 

Cela donne un SID comme “S-1-5-21-1-1234567890-9-1000” mais le SID réel de l’utilisateur est comme “S-1-5-21-3214321539-1234567890-2233445522-1000” (selon le propriétaire du processus et la clé de registre sous HKEY_USERS). Notez que les SID sont les mêmes sauf pour les 5ème et 7ème composants, qui ne sont composés que d’un seul chiffre, mais doivent être plus longs.

Comment puis-je obtenir le SID actuel / complet de l’utilisateur?

En outre, je suis un newbie C / C ++ total (et le code ci-dessus n’est pas du tout une qualité de production). Et j’utilise / NODEFAULTLIB afin d’éviter de lier les runtimes VC. Désolé pour ça.

Votre code ne fournit pas de tampon de taille appropriée pour le SID renvoyé par LookupAccountName (). Cela se traduit par une corruption de stack et un comportement indéfini, ce qui pourrait expliquer pourquoi vous ne recevez pas le SID que vous attendiez. (Bien que je soupçonne plutôt que vous transmettez effectivement le mauvais nom d’utilisateur ou un nom d’utilisateur mal formaté.)

Quoi qu’il en soit, pour résoudre le problème le plus évident, le code devrait ressembler davantage à ceci:

 #include  #include  #include  int main(int argc, char ** argv) { LPCTSTR wszAccName = TEXT("domainname\\username"); LPTSTR wszDomainName = (LPTSTR)GlobalAlloc(GPTR, sizeof(TCHAR) * 1024); DWORD cchDomainName = 1024; SID_NAME_USE eSidType; LPTSTR sidssortingng; char sid_buffer[1024]; DWORD cbSid = 1024; SID * sid = (SID *)sid_buffer; if (!LookupAccountName(NULL, wszAccName, sid_buffer, &cbSid, wszDomainName, &cchDomainName, &eSidType)) { return GetLastError(); } if (!ConvertSidToSsortingngSid(sid, &sidssortingng)) { return GetLastError(); } printf("%ws\n", sidssortingng); return 0; } 

Ce n’est toujours pas la bonne façon de le faire, bien sûr; vous êtes censé appeler LookupAccountName () deux fois, une fois pour déterminer la longueur du tampon, puis une seconde fois pour récupérer les informations réelles. Mais cela démontre ce que vous avez mal fait et est assez bon pour les tests.