当一个进程被某个service启动后,他的启动用户为system,如果这个进程是希望单实例运行的,判断如下
hMutex = CreateMutex(NULL, FALSE, "Name");
if( GetLastError == ERROR_ALREADY_EXISTS)
{
已经存在运行实例
}
如果启动这个进程的是普通用户,比如administrator,那么在执行到CreateMutex时,GetLastError返回的是ERROR_ACCESS_DENIED,被禁止访问,hMutex返回0,这个时候将对启动多个实例了。
是否做ERROR_ACCESS_DENIED判断???
可以如下方式建立Mutex,可以避免以上问题。
var
hMutex: THandle;
sa: _SECURITY_ATTRIBUTES;
sd: SECURITY_DESCRIPTOR;
begin
InitializeSecurityDescriptor(@sd, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(@sd, True, nil, False);
sa.nLength := SizeOf(_SECURITY_ATTRIBUTES);
sa.bInheritHandle := True;
sa.lpSecurityDescriptor := @sd;
hMutex := CreateMutex(@sa, False, PChar('name'));
end;
SYSTEM下建立的默认描述符普通用户无法访问。
本文介绍了一种使用Mutex来确保进程单实例运行的方法,并解决了不同用户权限下Mutex访问问题。通过设置安全属性,使得由system用户启动的服务进程能够正确判断是否已有实例运行。
1364

被折叠的 条评论
为什么被折叠?



