Как проверить, запущена ли программа в локальной консоли?

Как в Windows Server 2003 проверить, запущена ли моя программа в локальной консоли («на экране серверного компьютера») вместо удаленного сеанса?

Я использую Delphi Win32, поэтому любой метод на основе Windows API должен работать.

Имейте в виду, что "консольный" сеанс может быть подключен удаленно ("mstsc / console <host>"), поэтому, даже если ваше приложение запущено на настоящей консоли, его можно будет просмотреть удаленно позже.

nobody 28.10.2008 22:34
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
5 848
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Разве номер сеанса не сказал бы вам об этом?

ProcessIdToSessionId (GetCurrentProcessId () и dwSessionNum)

Вам также нужно будет проверить версию ОС, используя GetVersionEx: для всего, что до XP / Server 2003, сеанс 0 является локальным (сервисная или интерактивная консоль), все, что выше, является виртуальным. Для Vista / 2008 сеанс 0 и 1 являются локальными (0 - сервис, 1 - консоль), все остальное - виртуальное.

Я предполагаю, что ваши модули Delphi объявят номер сеанса как var, поэтому вам не понадобится амперсанд.

Я ДУМАЮ, что все интерактивные сеансы, локальные или удаленные, будут иметь значение> 0 в недалеком будущем.

jason saldo 28.10.2008 22:20

Одно замечание: сеанс 0 все еще можно использовать удаленно через "mstsc / console". WTSGetActiveConsoleSessionID и WTSQuerySessionInformation должны помочь, если вам также нужно это идентифицировать.

DK. 28.10.2008 23:42

mstsc / console теперь называется mstsc / admin.

Adam Mitz 29.10.2008 08:47

Я также нашел этот метод позже на about.com: delphi.about.com/od/delphitips2008/qt/isremotesession.htm

Harriv 29.10.2008 17:34

WTSGetActiveConsoleSessionId () должен вернуть идентификатор сеанса, подключенного к консоли. Затем вы можете сравнить этот идентификатор сеанса с идентификатором текущего сеанса вашего приложения, чтобы определить, работаете ли вы на консоли или нет. Vista (не уверен в Windows Server 2008) не обязательно дает сеансу консоли идентификатор 1 (быстрое переключение пользователей, кто-нибудь?).

Андерс - ваша техника не будет работать в Windows 2008 или Vista. Windows 2008 и Vista используют изоляцию сеанса 0, что означает, что в сеансе 0 работают только системные процессы и службы. Интерактивный сеанс, независимо от того, будет ли он через RDP или нет, по определению НЕ будет 0: msdn.microsoft.com/en-us/library/bb756986.aspx

Brian 18.07.2009 06:54

Брайан прав, с тех пор я встречал Vista, сообщающую об идентификаторе сеанса 2 для интерактивной консоли, несмотря на то, что быстрое переключение пользователей не использовалось. Конечно, это может быть просто баг :-)

Для меня ProcessIdToSessionId возвращал 0 как при запуске непосредственно на физической консоли, так и при входе в административный сеанс (mstsc / admin).

Однако, когда вы входите в систему через RDP, Windows (в данном случае XP Pro) создает новый сеанс, который отображается на физической консоли, на которой отображается только сообщение «Этот компьютер заблокирован». WTSGetActiveConsoleSessionId возвращает идентификатор сеанса для этого второго сеанса, который в моем случае был 2.

Таким образом, даже если ваше приложение запущено на консоли, теперь существует два консольных сеанса, и ваше приложение не работает в активном. В моем коде я вместо этого сравниваю идентификатор сеанса с 0.

Андерс - ваша техника не будет работать в Windows 2008 или Vista. Windows 2008 и Vista используют изоляцию сеанса 0, что означает, что в сеансе 0 работают только системные процессы и службы. Интерактивный сеанс, независимо от того, будет ли он через RDP или нет, по определению НЕ будет 0: msdn.microsoft.com/en-us/library/bb756986.aspx

Brian 30.03.2011 03:39

Другие вопросы по теме