【发布时间】:2010-01-14 20:19:40
【问题描述】:
我正在创建一个更新程序,它将复制更新的 .exe 文件。它需要检查是否有任何 .exe 在终端会话中运行。如果 .exe 正在运行,它将杀死它们。这将是在具有管理员权限的服务器上运行的服务。代码需要在 Delphi 中,有人对此有什么想法吗?
【问题讨论】:
-
我不确定 Delphi 的功能,但它应该像获取正在运行的进程列表、枚举它并针对进程名称进行文字检查一样简单。
我正在创建一个更新程序,它将复制更新的 .exe 文件。它需要检查是否有任何 .exe 在终端会话中运行。如果 .exe 正在运行,它将杀死它们。这将是在具有管理员权限的服务器上运行的服务。代码需要在 Delphi 中,有人对此有什么想法吗?
【问题讨论】:
如果您检查这些 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。
【讨论】:
有一组API可以枚举和检索会话中的会话和进程。您可能需要的两个是WTSEnumerateSessions 和WTSEnumerateProcesses。
【讨论】:
无论进程是否在终端会话下运行,它们都必须被杀死。 您能否澄清一下 - 为什么需要此信息?
杀死进程的最佳方法是使用“pskill”直到来自 sysexternals。 只需使用 Delphi 代码中的 exec。
【讨论】: