Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ С\С++ _ Получить имя пользователя Windows при выполнении программы от имени администратора

Автор: maint 17.6.2023, 12:44

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


Автор: maint 25.6.2023, 8:11

Воспользовавшись советом на VBS https://learn.microsoft.com/en-us/answers/questions/848695/get-username-(or-profile-path)-of-current-logged-o, написал для 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;
}

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)