2012-07-20 1172 views
13

我正在嘗試創建一個程序,該程序使用C++在Windows上檢索當前用戶的用戶名。在Windows上使用C++獲取當前用戶名

我嘗試這樣做:除了

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

沒有輸出 「用戶名:」。

獲取當前用戶名最簡單,最好的方法是什麼?

+2

您不應該使用環境變量來檢索用戶名。它不保證存在。一般來說,在BAT文件之外,你不應該使用環境變量。 – user7116 2012-07-20 22:07:14

+0

如果您必須使用環境變量來檢索用戶名,那麼正確的是'USERNAME'而不是'LOGNAME'。您可能還需要'USERDOMAIN'。 – Ferruccio 2013-12-31 13:23:55

+1

此外,這可能會幫助你:http://www.cplusplus.com/forum/beginner/12076/ – Chefire 2012-07-20 21:58:08

回答

33

使用Win32API GetUserName函數。例如:

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

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

+1,你可以使用[GetUserNameEx如果你想控制用戶名的格式](http:///msdn.microsoft.com/en-us/library/windows/desktop/ms724268(v=vs.85).aspx)而不是用戶輸入的內容。您應該使用'Lmcons.h'的'UNLEN + 1' – user7116 2012-07-20 21:58:47

+0

@sletterlettervariables:謝謝,我編輯過。你有沒有機會知道''包括''? – orlp 2012-07-20 22:03:13

+0

我在我的Mac上,但如果內存服務的答案是否定的[LANMAN頭需要單獨帶入,我認爲這個例子同意](http://msdn.microsoft.com/en-us/庫/窗/臺式機/ ms676907%28V = vs.85%29.aspx)。 – user7116 2012-07-20 22:06:06

5

在Windows上使用USERNAME環境變量或函數GetUserName

+3

後者是可取的。 – chris 2012-07-20 22:19:32

1

您應該使用環境變量USERNAME。

+1

%username%env變量不安全。如果您使用該功能,用戶可以打開一個cmd行,並執行'set username = SomeOneElse launchYourApp' ,他將以SomeOneElse身份有效地運行您的應用程序。這可能是一個安全漏洞。 – CodeKid 2015-01-21 17:21:11

5

更正後的代碼爲我工作:

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

我使用Visual Studio Express的2012(在Windows 7),也許它的工作原理與開發-CPP

2

它的工作方式相同:

#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"; 
}