如何结束 system 用户组的进程?如winlogon.exe, svchost.exe等
我用的主要代码如下:
void CGgdDlg::OnOK() 
{
UpdateData(TRUE); //获取用户输入的要结束的进程名字 HANDLE handle; //定义CreateToolhelp32Snapshot系统快照句柄 
HANDLE handle1; //定义要结束进程句柄 
         EnablePriv(); //提升本进程权限

handle=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//获得系统快照句柄 
PROCESSENTRY32 *info; //定义PROCESSENTRY32结构字指 

         info=new PROCESSENTRY32;             
info->dwSize=sizeof(PROCESSENTRY32); 

Process32First(handle,info); //从快照中获取进程列表 
while(Process32Next(handle,info) != FALSE)//重复调用 Process32Next 
{
   info->szExeFile;     //指向进程名字 
    if( m_edit == info->szExeFile ) 
    { 
       handle1=OpenProcess(PROCESS_TERMINATE,FALSE,info->th32ProcessID); 
       TerminateProcess(handle1,0); //结束进程 
    } 

CloseHandle(handle);  CDialog::OnOK();
}BOOL CGgdDlg::EnablePriv()
{
  HANDLE hToken;
  if ( OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken) )
  {
     TOKEN_PRIVILEGES tkp;
     LookupPrivilegeValue( NULL,SE_DEBUG_NAME,&tkp.Privileges[0].Luid );  //修改进程权限
     tkp.PrivilegeCount=1;
     tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
     AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL ); //通知系统修改进程权限
       return( (GetLastError()==ERROR_SUCCESS) );
  }
  else 
      return FALSE;
}这样的代码只能结束 普通用户组 的进程,象记事本,cmd.exe等
我该如何让它可以结束 system 组的进程呢?
谢谢回答^_^

解决方案 »

  1.   

    我的做法是
    用AdjustTokenPrivileges來獲取盡可能大的特權 也就是對SE_XXX都嘗試一遍Enable 甚至操作結果也可以忽略 反正最終結果要麽就是能打開進程句柄要麽不能
    或者把你的代碼放在服務中(註冊為用LocalSystem賬戶啓動)
      

  2.   

    感觉用这样的做法就可以,不过有几个进程是系统关键进程,不允许结束,system帐号的其它进程应该没问题。
      

  3.   

    具體結果不記得了 反正PID為0的這樣還不是不行的 也許PID==4的那個也不行 其他貌似都可以kill
      

  4.   

    结束掉system进程还是system用户的进程?
    pid=0那个进程其实系统页面清零线程,属内核线程,不算是进程.
    pid=4那个是其它系统线程的集合,属于内核线程,没有进程对应.只是windows把他们看成是进程.如果真的结束掉,那系统就不存在了.
      

  5.   

    测试了,system用户组的大部分进程没问题