Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Получить имя пользователя Windows при выполнении программы от имени администратора
Форум на CrossPlatform.RU > Разработка > С\С++
maint
Имеется MinGW и Windows. Выполняю программу от имени администратора, нужно получить имя пользователя текущего и по нему SID. В Linux есть getlogin который при выполнении sudo выдает имя пользователя/login, а не root. В Windows функция GetUserName выдает имя администратора от имени которого запущена, а не пользователя. getenv("USERNAME") такой же результат. Соответственно не могу получить корректный SID. Кто сталкивался, знает, как получить имя пользователя под которым прошел login?

maint
Воспользовавшись советом на 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;
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2023 IPS, Inc.