Получить текущее имя пользователя на C++ в Windows

Я пытаюсь создать программу, которая извлекает имя пользователя текущего пользователя в Windows с помощью С++.

Я пробовал это:

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

Ничего не выводится, кроме "Имя пользователя:".

Каков самый простой и лучший способ получить текущее имя пользователя?


person Andrew    schedule 20.07.2012    source источник
comment
Кроме того, это может вам помочь: cplusplus.com/forum/beginner/12076   -  person Chefire    schedule 21.07.2012
comment
Вы не должны использовать переменные среды для получения имени пользователя. Его существование не гарантируется. Как правило, вне файла BAT вы не должны использовать переменные среды.   -  person user7116    schedule 21.07.2012
comment
Если вы должны использовать переменную среды для получения имени пользователя, правильным будет USERNAME, а не LOGNAME. Вы также можете захотеть USERDOMAIN.   -  person Ferruccio    schedule 31.12.2013


Ответы (6)


Используйте Win32API GetUserName< /а> функция. Пример:

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

char username[UNLEN+1];
DWORD username_len = UNLEN+1;
GetUserName(username, &username_len);
person orlp    schedule 20.07.2012
comment
+1, вы можете использовать GetUserNameEx если вы хотите управлять форматом имени пользователя вместо того, что было введено пользователем. Вы должны использовать UNLEN+1 из Lmcons.h - person user7116; 21.07.2012
comment
@sixlettervariables: спасибо, я отредактировал. Вы случайно не знаете, включает ли <windows.h> <Lmcons.h>? - person orlp; 21.07.2012
comment
Я на своем Mac, но, если мне не изменяет память, ответ будет «Нет». .aspx" rel="nofollow noreferrer">Заголовки LANMAN необходимо вводить отдельно, и я думаю, что этот пример соответствует. - person user7116; 21.07.2012
comment
Я пытаюсь использовать это для пути к файлу. Есть ли ярлык или функции нужны всегда? - person Andrew; 21.07.2012
comment
@Andrew: извините, я не понимаю, в чем проблема с кодом, который я разместил. Какой именно путь к файлу вы пытаетесь создать? - person orlp; 21.07.2012
comment
Почти всегда неправильно указывать текущее имя пользователя в пути к файлу. Чего вы на самом деле пытаетесь достичь? - person Harry Johnston; 21.07.2012
comment
Я использую ifstream и ofstream для копирования файла. @nightcracker что такое переменная UNLEN? - person Andrew; 21.07.2012
comment
@Andrew: UNLEN — это макрос, определяемый одним из стандартных заголовков Windows (в частности, <Lmcons.h>), который заменяется максимальной длиной имени пользователя. Это более точно и портативно, чем простое придумывание случайного числа. - person orlp; 21.07.2012
comment
@nightcracker, я проверил свой windows.h, и он его не включает. - person chris; 21.07.2012
comment
Где находится файл, который вы пытаетесь скопировать? Как вы думаете, зачем вам имя пользователя? - person Harry Johnston; 21.07.2012
comment
@HarryJohnston Простой файл на рабочем столе. Для пути. - person Andrew; 21.07.2012
comment
Рабочий стол пользователя не всегда находится в папке c:\Users\‹username›\Desktop. Вы должны использовать функцию SHGetFolderPath или SHGetKnownFolderPath, в зависимости от того, для какой версии Windows вы пишете. - person Harry Johnston; 21.07.2012
comment
Это не будет работать, как написано. Второй параметр должен быть указателем на размер буфера username. Когда GetUserName возвращает значение, размер будет заменен количеством символов, фактически записанных в буфер username. - person Ferruccio; 31.12.2013
comment
Я использовал эту функцию GetUserName, но я получил старое имя пользователя. Я изменил свое имя пользователя (панель управления -> учетные записи пользователей) на новое, но вместо этого было получено старое. - person ReignBough; 15.04.2015

Исправленный код, который работал для меня:

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

Я использую Visual Studio Express 2012 (в Windows 7), возможно, он работает так же с Dev-Cpp.

person jyz    schedule 31.07.2013

Оно работает:

#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";
}
person Anna Eurich    schedule 23.05.2014

В Windows используйте переменную среды USERNAME или GetUserName функция

person parapura rajkumar    schedule 20.07.2012

В случае, если GetUserName(username, &username_len); не работает при использовании char[] в качестве хранилища, вы должны знать, что GetUserName может быть макросом, преобразованным в GetUserNameW. Если вы работали с Windows API, вероятно, вы знаете разницу между W и A. Использование GetUserNameA решит проблему, если вы используете char[] в качестве буфера.

person uIM7AI9S    schedule 09.06.2020

Вы должны использовать переменную env USERNAME.

person Van Zuzu    schedule 20.07.2012
comment
Переменная env %username% небезопасна. Если вы используете это, пользователь может открыть строку cmd и выполнить set username=SomeOneElse launchYourApp, и он фактически запустит ваше приложение как SomeOneElse. Это может быть уязвимостью системы безопасности. - person CodeKid; 21.01.2015