CreateMutex 防止程序启动两次有关问题,分别为服务启动和以控制台方式启动,不能防止两次运行

CreateMutex 防止程序启动两次问题,分别为服务启动和以控制台方式启动,不能防止两次运行。
CreateMutex 防止程序启动两次问题,一个制作为服务启动,一个以控制台方式启动。
当以服务器方式启动后,再以控制台方式还是能启动,不能防止两次运行。

如果都以控制台启用则可以防止两次运行。

hMutex = ::CreateMutex(NULL, FALSE, "YY[YY]Sample");
if (::GetLastError() == ERROR_ALREADY_EXISTS) 
{
printf("----------程序已经运行,只能运行程序.----------");
return 1;
}
else if(NULL == hMutex)
{
printf("监测器程序,初始化互斥量失败,错误信息:");
return 1;
}
互斥

------解决方案--------------------
CreateMutex(NULL, FALSE, "Global\\YY[YY]Sample");

------解决方案--------------------
Global 需要注意权限的问题。
服务在高权限下创建的。缺省权限禁止低权限访问。
所以在创建的不要使用 NULL 来设置 SA 。
------解决方案--------------------
先提权
BOOL WINAPI EnablePrivileges()  
{  
    HANDLE hToken;   
    TOKEN_PRIVILEGES tkp;   
  
    if (!OpenProcessToken(GetCurrentProcess(),   
        TOKEN_ADJUST_PRIVILEGES 
------解决方案--------------------
 TOKEN_QUERY, &hToken))   
        return( FALSE );   
  
    LookupPrivilegeValue(NULL, SE_CREATE_GLOBAL_NAME,   
        &tkp.Privileges.Luid);   
  
    tkp.PrivilegeCount = 1;   
    tkp.Privileges.Attributes = SE_PRIVILEGE_ENABLED;   
  
    AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,   
        (PTOKEN_PRIVILEGES)NULL, 0);   
  
    if (GetLastError() != ERROR_SUCCESS)   
        return FALSE;   
  
    return TRUE;  
}