2012-07-20 1171 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"; 
}