Текущий вход в систему

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

04 мар 2004, 00:35

То есть надо инжектнуть свой код внутрь процесса, гарантированно подключенного к активному терминалу, получить его хендл терминала, и сравнить этот хендл со своим хендлом терминала?
Какой процесс годится на эту роль?

PS: Короче, если OpenWindowStation("winsta0",...) возвращает NULL, то порисовать видимо не удастся. Я остановился на этом.
Eugie
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

04 мар 2004, 14:41

Absurd, все-таки для какого процесса тебе нужно узнать терминал?

Если для своего (возможно, запущенного под чужим логином), то это просто:

Код: Выделить всё

  HWINSTA hWinSta;
  TCHAR name[100];
  DWORD dwNeededSize;

  hWinSta = GetProcessWindowStation();
  if (GetUserObjectInformation(
        hWinSta,      // handle to object
        UOI_NAME,     // type of information to retrieve
        (PVOID)name,  // information buffer
        sizeof(name), // size of the buffer
        &dwNeededSize // receives required buffer size
      ))
  {
    cout << "Current process window station name:\t" << name << endl;

    // Note: "winsta0" - standard name for an interactive window station

    if (lstrcmpi(name, "winsta0") == 0)
      cout << "Current process window station is interactive" << endl;
    else
      cout << "Current process window station is not interactive" << endl;
  }
А вот для произвольного процесса в системе все сложнее...

Насчет того, какой процесс гарантированно выполняется на интерактивном терминале - любой, запущенный залогиненным в данный момент пользователем, либо сервис, запущенный под локальным системным аккаунтом с флагом SERVICE_INTERACTIVE_PROCESS.
Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

04 мар 2004, 15:42

Спасибо, именно это (100%) мне и надо.
Ответить