【问题标题】:How to check if exe is running on terminal session from the server如何检查 exe 是否在服务器的终端会话上运行
【发布时间】:2010-01-14 20:19:40
【问题描述】:

我正在创建一个更新程序,它将复制更新的 .exe 文件。它需要检查是否有任何 .exe 在终端会话中运行。如果 .exe 正在运行,它将杀死它们。这将是在具有管理员权限的服务器上运行的服务。代码需要在 Delphi 中,有人对此有什么想法吗?

【问题讨论】:

  • 我不确定 Delphi 的功能,但它应该像获取正在运行的进程列表、枚举它并针对进程名称进行文字检查一样简单。

标签: delphi service terminal


【解决方案1】:

如果您检查这些 SO 问题,我相信您的问题会得到解答。 它们可能不是专门针对 delphi,但第二个批准的答案提供了 MSDN 网站的链接。

how-to-programmatically-tell-if-the-terminal-server-service-is-running

how-do-i-tell-if-my-application-is-running-in-an-rdp-session

或者在网络上的另一个快速搜索显示了这个代码 sn-p。 (这不是我的代码)

function ProcessIdToSessionId(dwProcessId: DWORD; pSessionId: DWORD): BOOL; stdcall; external 'kernel32.dll';

function GetSessionIdfromProccessId(const processId: DWORD; var sessionId: DWORD): boolean;
begin
    result:=ProcessIdToSessionId(processId, DWORD(@sessionId));
end;

function GetCurrentSessionId: DWORD;
begin
    if not GetSessionIdfromProccessId(GetCurrentProcessId,result) then
        result:=0;
end;

GetCurrentSessionid 0 的结果似乎是您在 TS 下运行的结果。

HTH。

【讨论】:

    【解决方案2】:

    有一组API可以枚举和检索会话中的会话和进程。您可能需要的两个是WTSEnumerateSessionsWTSEnumerateProcesses

    【讨论】:

      【解决方案3】:

      无论进程是否在终端会话下运行,它们都必须被杀死。 您能否澄清一下 - 为什么需要此信息?

      杀死进程的最佳方法是使用“pskill”直到来自 sysexternals。 只需使用 Delphi 代码中的 exec。

      【讨论】:

      • 如果进程没有运行,我不想调用 pskill
      • pskill 不会因此而崩溃。在不存在的进程上调用它没有问题。
      猜你喜欢
      • 1970-01-01
      • 2012-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-06
      • 2021-08-14
      • 2012-04-09
      相关资源
      最近更新 更多