关闭

通过权限设置禁止用户在任务管理器中杀掉我们的进程

1769人阅读 评论(0) 收藏 举报

通过权限设置禁止用户在任务管理器中杀掉我们的进程

      以下代码仅供学习,俺不能保证代码完全正确,呵呵。代码中有用到的模板类CLocalMemoryT在后面会介绍!
要说明的是,在XP下无效,2003还没试过!而且,即使在2000下也不是完全杀不死的,ntsd命令就可以杀死
这类进程。

#include "aclapi.h"
#include "atlbase.h"
BOOL DisableTerminateProcess(void)

 CHandle token ;
 if ( ::OpenProcessToken( ::GetCurrentProcess(),
                             TOKEN_READ | TOKEN_WRITE ,
                             &token.m_h) )
 {
  try
  {

   CLocalMemoryT<PTOKEN_USER> tokenUser(Helpers::GetTokenInformation<TOKEN_USER>(token,TokenUser));
   
   DWORD dwAclSize = sizeof(ACL) +  
         2*(sizeof(ACCESS_ALLOWED_ACE)-sizeof(DWORD))+  
         GetLengthSid(tokenUser->User.Sid) ;
           
   DWORD AccessMask = PROCESS_ALL_ACCESS ;
   AccessMask &= ~PROCESS_TERMINATE ;

   CLocalMemoryT<PACL> pNewDacl ( dwAclSize ) ;   
   if( InitializeAcl(pNewDacl.m_ptr,dwAclSize,ACL_REVISION) &&  
    AddAccessAllowedAce(pNewDacl.m_ptr,  
         ACL_REVISION,  
         AccessMask ,  
         tokenUser->User.Sid ) )
                 
   {
    if( SetSecurityInfo( ::GetCurrentProcess() , SE_KERNEL_OBJECT , OWNER_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION ,
          tokenUser->User.Sid , NULL , pNewDacl.m_ptr , NULL ) == S_OK )
    {     
     return TRUE ;
    }

   }
  }
  catch (HRESULT error)
  {
  }
 }
 
 return FALSE;
}


以上的代码在  window2000+vc.net 上运行测试通过!

上面用到两个类 ,一个是CHandle , 在atlbase.h里定义(ATL3.0里没有),
另一个CLocalMemoryT,和 Helper ,都可以在下面地址找到
http://www.microsoft.com/china/MSDN/library/Security/default.mspx?mfr=true

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:209410次
    • 积分:538
    • 等级:
    • 排名:千里之外
    • 原创:58篇
    • 转载:29篇
    • 译文:0篇
    • 评论:28条
    最新评论