如何结束 system级 的进程 ?

happyhhb 2008-05-01 11:57:12
如何结束 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 组的进程呢?
谢谢回答^_^
...全文
1107 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
myKernel 2012-06-27
  • 打赏
  • 举报
回复
测试了,system用户组的大部分进程没问题
an_bachelor 2008-05-01
  • 打赏
  • 举报
回复
我的做法是
用AdjustTokenPrivileges來獲取盡可能大的特權 也就是對SE_XXX都嘗試一遍Enable 甚至操作結果也可以忽略 反正最終結果要麽就是能打開進程句柄要麽不能
或者把你的代碼放在服務中(註冊為用LocalSystem賬戶啓動)
KeSummer 2008-05-01
  • 打赏
  • 举报
回复
结束掉system进程还是system用户的进程?
pid=0那个进程其实系统页面清零线程,属内核线程,不算是进程.
pid=4那个是其它系统线程的集合,属于内核线程,没有进程对应.只是windows把他们看成是进程.如果真的结束掉,那系统就不存在了.
an_bachelor 2008-05-01
  • 打赏
  • 举报
回复
具體結果不記得了 反正PID為0的這樣還不是不行的 也許PID==4的那個也不行 其他貌似都可以kill
cnzdgs 2008-05-01
  • 打赏
  • 举报
回复
感觉用这样的做法就可以,不过有几个进程是系统关键进程,不允许结束,system帐号的其它进程应该没问题。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧