在Windows上使用C++获取当前用户名

25

我正在尝试使用C++编写一个程序,以获取Windows系统中当前用户的用户名。

我尝试了以下代码:

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

除了"Username:"以外,没有任何输出。

获取当前用户名的最简单、最好的方法是什么?


1
这可能对你有所帮助:http://www.cplusplus.com/forum/beginner/12076/ - Chefire
3
不应使用环境变量来检索用户名,因为它不保证存在。通常情况下,在BAT文件之外不应使用环境变量。 - user7116
如果您必须使用环境变量来检索用户名,则正确的变量是USERNAME而不是LOGNAME。您可能还需要使用USERDOMAIN - Ferruccio
8个回答

62

使用Win32API的GetUserName函数。例如:

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

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

2
+1,如果您想控制用户名的格式,可以使用GetUserNameEx,而不是用户输入的内容。您应该使用Lmcons.h中的UNLEN+1 - user7116
@sixlettervariables:谢谢,我已经编辑了。你是否知道<windows.h>是否包含<Lmcons.h> - orlp
3
用户的桌面不一定在 c:\Users<username>\Desktop 目录下。根据你要编写的 Windows 版本使用 SHGetFolderPath 或者 SHGetKnownFolderPath 函数来获取桌面路径。请注意保持原意并使翻译易懂。 - Harry Johnston
1
这段代码无法正常工作。第二个参数需要是指向“用户名”缓冲区大小的指针。当GetUserName返回时,该大小将被替换为实际写入“用户名”缓冲区的字符数。 - Ferruccio
我使用了 GetUserName 函数,但是得到的是旧用户名。我已经更改了我的用户名(控制面板->用户帐户)为新用户名,但仍然检索到旧用户名。 - ReignBough
显示剩余9条评论

9

以下是为我工作的修正代码:

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

我正在使用Visual Studio Express 2012(在Windows 7上),也许Dev-Cpp的操作方式相同。


7

它有效:

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

5

在Windows系统中,可以使用USERNAME环境变量或GetUserName函数来获取用户名。


3

如果使用char[]作为存储时,GetUserName(username, &username_len); 无法正常工作,您应该知道 GetUserName 可能是解决为宏 GetUserNameW。如果您使用 Windows API 工作,可能已经了解 WA 之间的区别。如果您正在使用char[]作为缓冲区,则使用GetUserNameA 将解决此问题。


1
通过使用 getenv() 函数:
char * user = getenv("username");
cout << string(user) << endl;

如果您想将其转换为字符串,则使用:

string userStr = string(user);

0
void funtions::_GetUserNameA()

char username[1024];
DWORD username_len = 1024;
GetUserNameA(username,&username_len);
std::cout <<"username:"<< username <<"\n";

-2

你应该使用环境变量USERNAME。


9
%username% 环境变量不安全。如果你使用它,用户可以打开命令行并执行以下命令: set username=SomeOneElse launchYourApp这将使得他以 SomeOneElse 的身份运行您的应用程序,这可能会造成安全漏洞。 - MathKid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接