【问题标题】:How to check if program is running in local console?如何检查程序是否在本地控制台中运行?
【发布时间】:2008-10-28 18:50:40
【问题描述】:

在 Windows Server 2003 中,如何检查我的程序是否在本地控制台(“在服务器计算机的屏幕上”)而不是远程会话中运行?

我使用的是 Delphi Win32,所以任何基于 Windows API 的方法都应该可以工作..

【问题讨论】:

  • 请记住,“console”会话可以远程连接(“mstsc /console ”),因此即使您的应用程序是在真正的控制台上启动的,也可能会被远程查看稍后。

标签: windows winapi console local


【解决方案1】:

会话编号不会告诉你吗?

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
【解决方案2】:

WTSGetActiveConsoleSessionId() 应该返回附加到控制台的会话 ID。然后,您可以将该会话 ID 与应用程序的当前会话 ID 进行比较,以确定您是否在控制台上运行。 Vista(不确定 Windows Server 2008)不一定给控制台会话 ID 1(快速用户切换,有人吗?)。

【讨论】:

  • Anders - 你的技术不适用于 Windows 2008 或 Vista。 Windows 2008 和 Vista 使用会话 0 隔离,这意味着只有系统进程和服务在会话 0 中运行。交互式会话,无论是否通过 RDP,根据定义都不会为 0:msdn.microsoft.com/en-us/library/bb756986.aspx
【解决方案3】:

对我来说,ProcessIdToSessionId 在直接在物理控制台上运行和登录到管理会话 (mstsc /admin) 时都返回 0。

但是,当您通过 RDP 登录时,Windows(在本例中为 XP Pro)会创建一个新会话,该会话会显示在物理控制台上,该控制台仅显示“此计算机已锁定”。 WTSGetActiveConsoleSessionId 返回第二个会话的会话 ID,在我的例子中是 2。

因此,即使您的应用在控制台上运行,现在也有两个控制台会话,而您的应用并未在活动会话上运行。在我的代码中,我将会话 ID 与 0 进行比较。

【讨论】:

  • Anders - 您的技术不适用于 Windows 2008 或 Vista。 Windows 2008 和 Vista 使用会话 0 隔离,这意味着只有系统进程和服务在会话 0 中运行。交互式会话,无论是否通过 RDP,根据定义都不会为 0:msdn.microsoft.com/en-us/library/bb756986.aspx
【解决方案4】:

Brian 是正确的,尽管没有使用快速用户切换,但我后来遇到 Vista 报告交互式控制台的会话 id 为 2。当然,这可能只是一个错误:-)

【讨论】:

    猜你喜欢
    • 2012-02-19
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多