CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  进程/线程/DLL

请教高手:如何让服务以administrator来创建某一进程

楼主wjl_2001(wjl_2001)2005-04-04 08:43:54 在 VC/MFC / 进程/线程/DLL 提问

服务一般运行于system级,用服务创建的进程(CreateProcess)一般也是system级的  
  如何让服务以administrator来创建某一进程?高手请指点!!! 问题点数:20、回复次数:7Top

1 楼Ah(蓝过天)回复于 2005-04-04 15:28:57 得分 5

BOOL   CreateProcessAsUser(  
      HANDLE   hToken,                                                           //   handle   to   user   token  
      LPCTSTR   lpApplicationName,                                   //   name   of   executable   module  
      LPTSTR   lpCommandLine,                                             //   command-line   string  
      LPSECURITY_ATTRIBUTES   lpProcessAttributes,   //   SD  
      LPSECURITY_ATTRIBUTES   lpThreadAttributes,     //   SD  
      BOOL   bInheritHandles,                                             //   inheritance   option  
      DWORD   dwCreationFlags,                                           //   creation   flags  
      LPVOID   lpEnvironment,                                             //   new   environment   block  
      LPCTSTR   lpCurrentDirectory,                                 //   current   directory   name  
      LPSTARTUPINFO   lpStartupInfo,                               //   startup   information  
      LPPROCESS_INFORMATION   lpProcessInformation   //   process   information  
  );  
  Top

2 楼wjl_2001(wjl_2001)回复于 2005-04-04 22:42:03 得分 0

不是吧,大哥,就这样啊,上面这个函数的调用可不简单啊,Top

3 楼idAnts(此广告位招租)回复于 2005-04-06 14:43:50 得分 15

如果当前用户为administrator就好办了。  
   
  我的方法是遍历进程,找到windows探险者(explorer.exe),然后取得它的token,然后可以用CreateProcessAsUser来创建了,呵呵。  
  不过要是当前用户不是administrator,就没办法了。  
   
  Top

4 楼idAnts(此广告位招租)回复于 2005-04-07 13:19:07 得分 0

给你例子:  
   
  BOOL   GetExplorerToken(HANDLE   &hToken)  
  {  
  HANDLE                   hProcessSnap   =   NULL;    
          BOOL                       bRet             =   FALSE;    
          PROCESSENTRY32   pe32             =   {0};    
   
          hProcessSnap   =   CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,   0);  
          if   (hProcessSnap   ==   INVALID_HANDLE_VALUE)    
                  return   (FALSE);    
   
          pe32.dwSize   =   sizeof(PROCESSENTRY32);    
   
          if   (Process32First(hProcessSnap,   &pe32))    
          {  
                  do    
                  {  
  if(!strcmp(_strupr(pe32.szExeFile),"EXPLORER.EXE"))  
  {  
  HANDLE   hProcess   =   OpenProcess(PROCESS_QUERY_INFORMATION,  
  FALSE,pe32.th32ProcessID);  
  bRet   =   OpenProcessToken(hProcess,TOKEN_ALL_ACCESS,&hToken);  
  CloseHandle   (hProcessSnap);    
  return   (bRet);  
  }  
                  }    
                  while   (Process32Next(hProcessSnap,   &pe32));    
                  bRet   =   TRUE;    
          }    
          else    
                  bRet   =   FALSE;  
   
          CloseHandle   (hProcessSnap);    
          return   (bRet);  
  }  
   
  BOOL   RunProcess(LPCSTR   lpImage)  
  {  
  HANDLE   hToken;  
  if(!GetExplorerToken(hToken))  
  {  
  return   FALSE;  
  }  
  STARTUPINFO   si;  
  PROCESS_INFORMATION   pi;  
   
  ZeroMemory(&si,   sizeof(STARTUPINFO));  
  si.cb=   sizeof(STARTUPINFO);  
  si.lpDesktop   =   TEXT("winsta0\\default");  
   
  BOOL   bResult   =   CreateProcessAsUser(hToken,lpImage,NULL,NULL,NULL,  
  FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi);  
  CloseHandle(hToken);  
  if(bResult)  
  {  
  OutputDebugString("CreateProcessAsUser   ok!\r\n");  
  }  
  else  
  {  
  OutputDebugString("CreateProcessAsUser   false!\r\n");  
  }  
  return   bResult;  
  }  
   
  在ServiceCtrlHandler例程里调用:  
  ……  
  case   SERVICE_CONTROL_RUNPROCESS:                                         //自定义消息  
  OutputDebugString("Code   SERVICE_CONTROL_RUNPROCESS\r\n");  
  RunProcess("C:\\NOTEPAD.EXE");  
  MyServiceStatus.dwCurrentState   =   SERVICE_RUNNING;  
  break;  
  ……  
  Top

5 楼wjl_2001(wjl_2001)回复于 2005-04-07 21:25:03 得分 0

楼上的朋友,会不会把我骗去当鸭啊?????????????我的体力可不行啊Top

6 楼wjl_2001(wjl_2001)回复于 2005-04-08 01:27:38 得分 0

1.SERVICE_CONTROL_RUNPROCESS这个自定义消息放在哪里呢,值多大?  
  2.MyServiceStatus.dwCurrentState   =   SERVICE_RUNNING;  
  MyServiceStatus中其它变量不用赋值吗?如dwCheckPoint??Top

7 楼idAnts(此广告位招租)回复于 2005-04-08 08:54:27 得分 0

1.SERVICE_CONTROL_RUNPROCESS定义可以放在统一的头文件里,因为控制服务程序的程序也要用到它。它的值可以在128   到   255之间。  
  2.dwCheckPoint的值不用管它。Top

相关问题

  • 创建进程
  • 服务进程
  • ASP创建进程
  • 进程问题,不能创建进程
  • 关于进程创建子进程
  • 关于创建进程
  • 菜鸟求救!为什么我在创建资料档案库时却总是出现监听程序无法启动专用服务器进程?
  • 服务器不能创建
  • 关于创建进程的问题
  • dfrgntfs.exe进程是如何创建的

关键词

  • service
  • hprocesssnap
  • runprocess
  • bret
  • 进程
  • htoken
  • 服务
  • myservicestatus
  • pe
  • administrator

得分解答快速导航

  • 帖主:wjl_2001
  • Ah
  • idAnts

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo