如何检查服务器上终端会话中是否正在运行exe程序

3

我正在创建一个更新程序,它将复制更新的 .exe 文件。它需要检查终端会话中是否有任何 .exes 正在运行。如果 .exes 正在运行,则会将其关闭。这将是在具有管理员权限的服务器上运行的服务。代码需要使用 Delphi 编写,有没有任何想法?


我对Delphi的能力不太确定,但它应该很简单,只需获取正在运行的进程列表,遍历其中的每个进程,并对进程名称进行直接检查即可。 - undefined
3个回答

9
如果您查看这些SO问题,我相信您的问题将得到解答。它们可能不是专门针对Delphi的,但第二个问题的批准答案提供了指向MSDN网站的链接。 如何以编程方式告诉终端服务器服务是否正在运行 如何告诉我的应用程序是否在RDP会话中运行 或者在网上进行另一个快速搜索,找到了这段代码片段。(这不是我的代码)
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(远程桌面)。
祝你好运。

3

0
无论进程是否在终端会话下运行,都必须将其终止。请问,您为什么需要这些信息?
使用"pskill"命令是终止进程的最佳方式,可以从sysexternals中获取。只需在您的Delphi代码中使用exec命令即可。

如果进程没有运行,我不想调用pskill。 - Jason
pskill不会崩溃。在不存在的进程上调用它也没有问题。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接