Delphi 如何从服务器检查exe是否在终端会话上运行
我正在创建一个更新程序,它将复制更新的.exe文件。它需要检查是否有任何.exe正在终端会话中运行。如果.exes正在运行,它将杀死他们。这将是在具有管理员权限的服务器上运行的服务。代码需要在Delphi中,有人对此有什么想法吗?如果您检查了这些问题,我相信您的问题会得到回答。 它们可能不是专门针对德尔福的,但第二个问题的批准答案提供了指向MSDN网站的链接 或者在网络上的另一次快速搜索中发现了这个代码片段。(这不是我的代码) 似乎GetCurrentSessionid的结果为0,然后您将在TS下运行Delphi 如何从服务器检查exe是否在终端会话上运行,delphi,service,terminal,Delphi,Service,Terminal,我正在创建一个更新程序,它将复制更新的.exe文件。它需要检查是否有任何.exe正在终端会话中运行。如果.exes正在运行,它将杀死他们。这将是在具有管理员权限的服务器上运行的服务。代码需要在Delphi中,有人对此有什么想法吗?如果您检查了这些问题,我相信您的问题会得到回答。 它们可能不是专门针对德尔福的,但第二个问题的批准答案提供了指向MSDN网站的链接 或者在网络上的另一次快速搜索中发现了这个代码片段。(这不是我的代码) 似乎GetCurrentSessionid的结果为0,然后您将在
HTH.有一组API可以枚举和检索会话中的会话和进程。您可能需要的两个是和。无论如何都必须终止进程,不管它们是否在终端会话下运行。 你能澄清一下吗?你为什么需要这些信息 终止进程的最佳方法是使用“pskill”,直到从sysexternals开始。
只需使用Delphi代码中的exec即可。我不确定Delphi的功能,但它应该很简单,只需抓取正在运行的进程列表,枚举它,并对进程名称进行文本检查。如果进程未运行,我不想调用pskill。pskill不会因此崩溃。在不存在的进程上调用它是没有问题的。
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;