service启动的进程无法获取进程创建的mutex

当一个进程被某个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下建立的默认描述符普通用户无法访问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值