crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Получить имя пользователя Windows при выполнении программы от имени администратора
maint
  опции профиля:
сообщение 17.6.2023, 12:44
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 235
Регистрация: 3.8.2009
Из: Иркутск
Пользователь №: 982

Спасибо сказали: 28 раз(а)




Репутация:   2  


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

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
maint
  опции профиля:
сообщение 25.6.2023, 8:11
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 235
Регистрация: 3.8.2009
Из: Иркутск
Пользователь №: 982

Спасибо сказали: 28 раз(а)




Репутация:   2  


Воспользовавшись советом на 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 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 21.11.2024, 23:37