2012-07-20 17 views
13

Sto tentando di creare un programma che recuperi il nome utente dell'utente corrente su Windows utilizzando C++.Ottieni nome utente corrente in C++ su Windows

ho provato questo:

char *userName = getenv("LOGNAME"); 
stringstream ss; 
string userNameString; 
ss << userName; 
ss >> userNameString; 
cout << "Username: " << userNameString << endl; 

Nulla viene emesso ad eccezione di "Nome utente:".

Qual è il modo più semplice e migliore per ottenere il nome utente corrente?

+2

Non è necessario utilizzare le variabili di ambiente per recuperare il nome utente. Non è garantito che esista. In generale, al di fuori di un file BAT non si dovrebbero usare variabili d'ambiente. – user7116

+0

Se è necessario utilizzare una variabile di ambiente per recuperare il nome utente, quello corretto è 'USERNAME' non' LOGNAME'. Potresti anche voler usare 'USERDOMAIN'. – Ferruccio

+1

Inoltre, questo potrebbe aiutarti: http://www.cplusplus.com/forum/beginner/12076/ – Chefire

risposta

33

Utilizzare la funzione Win32API GetUserName. Esempio:

#include <windows.h> 
#include <Lmcons.h> 

char username[UNLEN+1]; 
DWORD username_len = UNLEN+1; 
GetUserName(username, &username_len); 
+0

+1, puoi utilizzare [GetUserNameEx se desideri controllare il formato del nome utente] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms724268(v=vs.85).aspx) anziché quanto inserito dall'utente. Dovresti usare 'UNLEN + 1' da' Lmcons.h' – user7116

+0

@sixlettervariables: grazie, ho modificato. Sapete per caso se ' 'include' '? – orlp

+0

Sono sul mio Mac, ma se la memoria serve la risposta è No. [Le intestazioni LANMAN devono essere inserite separatamente, e penso che questo esempio sia d'accordo] (http://msdn.microsoft.com/en-us/ biblioteca/windows/desktop/ms676907% 28v = vs.85% 29.aspx). – user7116

5

Su Windows utilizzano USERNAME variabile d'ambiente o GetUserName funzione

+3

Quest'ultimo è preferibile. – chris

1

È consigliabile utilizzare l'USERNAME variabile ENV.

+1

La variabile% username% env non è sicura. Se usi che l'utente può aprire una riga cmd e fare 'set username = SomeOneElse launchYourApp' e lui eseguirà effettivamente la tua app come SomeOneElse. Questa può essere una vulnerabilità di sicurezza. – CodeKid

5

codice corretto che ha funzionato per me:

TCHAR username[UNLEN + 1]; 
DWORD size = UNLEN + 1; 
GetUserName((TCHAR*)username, &size); 

Sto utilizzando Visual Studio Express 2012 (su Windows 7), forse funziona allo stesso modo con Dev-Cpp

2

Funziona:

#include <iostream> 
using namespace std; 

#include <windows.h> 
#include <Lmcons.h> 

int main() 
{ 
TCHAR name [ UNLEN + 1 ]; 
DWORD size = UNLEN + 1; 

if (GetUserName((TCHAR*)name, &size)) 
wcout << L"Hello, " << name << L"!\n"; 
else 
cout << "Hello, unnamed person!\n"; 
} 
Problemi correlati