当有新更新可用时,我的 Delphi 应用程序会对从同一目录运行的进程进行计数。如果它只找到当前进程,则会下载更新并自行重新启动。
为了按完整文件名对进程进行计数,我正在使用OpenProcess和 ,GetModuleFileNameEx如这个问题所示。
在大多数情况下,一切正常,但我的一位客户使用瘦客户端和服务器,其中应用程序安装在多个目录中(每个用户在服务器上都有自己的安装文件夹)。
当用户从瘦客户端启动应用程序时,应用程序还会查找属于其他用户的进程,但无法获取可执行文件的完整文件名,因为OpenProcess会导致访问被拒绝错误:
错误_访问_拒绝
5(0x5)
访问被拒绝。
这是我打电话的OpenProcess方式GetModuleFileNameEx:
const
S_PROCESS_QUERY_LIMITED_INFORMATION = $1000;
function GetFullFileNameFromPID(const PID: Cardinal) : string;
var
ProcessHandle : THandle;
Path : array[0..MAX_PATH - 1] of Char;
begin
ProcessHandle := OpenProcess(S_PROCESS_QUERY_LIMITED_INFORMATION, False, PID);
if(ProcessHandle <> 0) then
begin
if(GetModuleFileNameEx(ProcessHandle, 0, Result, MAX_PATH) = 0)
then RaiseLastOSError
else Result := Path;
CloseHandle(ProcessHandle);
end else
RaiseLastOSError;
end;
Run Code Online (Sandbox Code Playgroud)
有没有办法从应用程序没有权限的进程中获取此信息?
更新:
文件名不足以满足我的目的,我注意到我可以使用任务管理器与获得 ERROR_ACCESS_DENIED 的同一用户获取完整文件名,但我不明白它是如何获取该信息的。
| 归档时间: |
|
| 查看次数: |
125 次 |
| 最近记录: |