Получить имя пользователя Windows при выполнении программы от имени администратора

Рейтинг: 0Ответов: 2Опубликовано: 17.06.2023

Имеется MinGW и Windows. Выполняю программу от имени администратора, нужно получить имя пользователя текущего и по нему SID. В Linux есть getlogin который при выполнении sudo выдает имя пользователя/login, а не root. В Windows функция GetUserName выдает имя администратора от имени которого запущена, а не пользователя. getenv("USERNAME") такой же результат. Соответственно не могу получить корректный SID. Кто сталкивался, знает, как получить имя пользователя под которым прошел login?

Ответы

▲ 0Принят

Воспользовавшись ссылкой, которую мне дал @Mister_Jesus, перевел с VBS на C++ с Qt5. Получился такой код, может кому пригодится

#include <wtsapi32.h> `

QString win_getlogin()

{

    QString name;
    PWTS_SESSION_INFO pSessions = NULL;
    DWORD dwCount = 0;`

    if (!WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, &pSessions, &dwCount)){
 log_error("win_getlogin(WTSEnumerateSessions): %s\n",
         get_win_error(GetLastError()));`
   } else if (dwCount == 0){`
         log_error(QObject::tr("win_getlogin: No sessions available\n").toStdString().c_str());
         WTSFreeMemory(pSessions) ;
        return nullptr;
   }
   DWORD dwNumActive = 0;
   for (DWORD i = 0; i < dwCount; ++i) {
     if (pSessions[i].State == WTSActive){ // has a logged in user
     ++dwNumActive;
     LPWSTR pUserName = NULL;
     DWORD dwBufSize = 0;`
     if (!WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, pSessions[i].SessionId, WTSUserName, &pUserName, &dwBufSize)){
         log_error("win_getlogin(WTSQuerySessionInformation): %s\n",
                 get_win_error(GetLastError()));
     } else {
        name = QString::fromUtf16((const ushort *) pUserName);
        if(scan_debug)
            log_debug("session user: %s\n", name.toStdString().c_str());
         WTSFreeMemory(pUserName);
     }
  }
}

 if (!dwNumActive)
   log_warning(QObject::tr("win_getlogin: No users are logged   inn").toStdString().c_str());
   WTSFreeMemory(pSessions) ;
 return name;
 
}
▲ -1

Могу предложить немного топорный, но работающий способ решения (если кто-то знает лучше, пожалуйста напишите об этом, самому интересно:)

Для получения имени залогинившегося пользователя:

system("echo %username% > cache.txt"); // Записываем в файл вывод echo
std::ifstream cacheFile("cache.txt");
std::string userName; // Здесь будет имя пользователя
getline(cacheFile, userName);
system("del cache.txt"); // Не мусорим!
// Теперь в userName храниться имя текущего пользователя

Для получения SID пользователя:

system("wmic useraccount where name='%username%' get sid /VALUE > cache.txt");
std::ifstream cacheSID("cache.txt");
std::string userSID; // Полученный SID
getline(cacheSID, userSID); 
UserSID.std::erase(0, 4); // Удаляем не нужное из прочитанного
system("del cache.txt"); // Не мусорим!
// Теперь в UserSID храниться SID пользователя

Библиотеки:

#include <iostream> // Тут понятно ;)
#include <string> // Строки
#include <vector> // Вектор
#include <fstream> // Файлы