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;
}
------解决方案--------------------
------解决方案--------------------
Global 需要注意权限的问题。
服务在高权限下创建的。缺省权限禁止低权限访问。
所以在创建的不要使用 NULL 来设置 SA 。
------解决方案--------------------
先提权
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;
}