




Разве номер сеанса не сказал бы вам об этом?
ProcessIdToSessionId (GetCurrentProcessId () и dwSessionNum)
Вам также нужно будет проверить версию ОС, используя GetVersionEx: для всего, что до XP / Server 2003, сеанс 0 является локальным (сервисная или интерактивная консоль), все, что выше, является виртуальным. Для Vista / 2008 сеанс 0 и 1 являются локальными (0 - сервис, 1 - консоль), все остальное - виртуальное.
Я предполагаю, что ваши модули Delphi объявят номер сеанса как var, поэтому вам не понадобится амперсанд.
Я ДУМАЮ, что все интерактивные сеансы, локальные или удаленные, будут иметь значение> 0 в недалеком будущем.
Одно замечание: сеанс 0 все еще можно использовать удаленно через "mstsc / console". WTSGetActiveConsoleSessionID и WTSQuerySessionInformation должны помочь, если вам также нужно это идентифицировать.
mstsc / console теперь называется mstsc / admin.
Я также нашел этот метод позже на about.com: delphi.about.com/od/delphitips2008/qt/isremotesession.htm
WTSGetActiveConsoleSessionId () должен вернуть идентификатор сеанса, подключенного к консоли. Затем вы можете сравнить этот идентификатор сеанса с идентификатором текущего сеанса вашего приложения, чтобы определить, работаете ли вы на консоли или нет. Vista (не уверен в Windows Server 2008) не обязательно дает сеансу консоли идентификатор 1 (быстрое переключение пользователей, кто-нибудь?).
Андерс - ваша техника не будет работать в Windows 2008 или Vista. Windows 2008 и Vista используют изоляцию сеанса 0, что означает, что в сеансе 0 работают только системные процессы и службы. Интерактивный сеанс, независимо от того, будет ли он через RDP или нет, по определению НЕ будет 0: msdn.microsoft.com/en-us/library/bb756986.aspx
Брайан прав, с тех пор я встречал 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
Имейте в виду, что "консольный" сеанс может быть подключен удаленно ("mstsc / console <host>"), поэтому, даже если ваше приложение запущено на настоящей консоли, его можно будет просмотреть удаленно позже.