关闭进程时的权限问题,一个例子。

来源:互联网 发布:澳洲阳光海岸大学 知乎 编辑:程序博客网 时间:2024/06/06 21:02

OpenProcessToken()

LookupPrivilegeValue()

AdjustTokenPrivileges()

主要是这三个函数,第一个函数取得要提升权限的进程的令牌标识。 第二个函数找到提升某个权限的LUID

。  此值作为AdjustTokenPrivileges函数第三个参数的一个属性。

TOKEN_PRIVILEGES  该结构体是将你要指定提升的权限数组,结构体两个成员,一个是个数。另外一个是结构体数组LUID_AND_ATTRIBUTES ,这个结构体有两个成员,一个是上面得到的luid,另外一个就是权限值。 例如:

SE_PRIVILEGE_ENABLED , SE_PRIVILEGE_ENABLED_BY_DEFAULT,SE_PRIVILEGE_REMOVED等。

下面的代码就是提升权限,并关闭某个指定名称的进程。

win7下可能不需要提升权限,xp需要。

//////提示进程权限
 HANDLE hToken;
 if(::OpenProcessToken(::GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken) )
 {
  TOKEN_PRIVILEGES tp;
  LUID luid;
  tp.PrivilegeCount = 1;
  tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&luid);
  tp.Privileges[0].Luid = luid;
  ::AdjustTokenPrivileges(hToken,false,&tp,sizeof(tp),(PTOKEN_PRIVILEGES)NULL,(PDWORD)NULL);
 }

 HANDLE handle = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 if(handle==(HANDLE)-1) {
  AfxMessageBox(L"CreateToolhelp32Snapshot error");
  return 0;
 }
 PROCESSENTRY32 procinfo;
 procinfo.dwSize = sizeof(PROCESSENTRY32);
 if(::Process32First(handle, &procinfo))
 {
  do
  {
   CString str = procinfo.szExeFile;
   if(str == strName)
   {
    break;
   }
  }
  while(::Process32Next(handle, &procinfo));
  ::CloseHandle(handle);
 }
 
 HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS,false,procinfo.th32ProcessID);
 if(hProcess)
 {
  if(::TerminateProcess(hProcess,0))
  {
   hProcess = 0;
  }
  else
  {
   ::CloseHandle(hProcess);
  }
 }

0 0
原创粉丝点击