设为首页 收藏本站
查看: 713|回复: 0

[经验分享] windows Service启动带有管理员权限的进程

[复制链接]

尚未签到

发表于 2017-6-29 11:19:17 | 显示全部楼层 |阅读模式
  事情是这样的,公司的产品有个守护进程(windows Service)需要启动产品的主程序exe,让主程序它运行为管理员权限(因为主程序会加载一个插件,插件中有列出端口监听的功能,需要由端口查找到进程PID,由进程PID查找进程名或进程镜像路径,这些对于一些特殊进程例如svchost需要有管理员权限才能查到进程名和路径)。windows下的程序是不能在运行时获得管理员权限的,只能在创建进程的时候提升为管理员权限。如果是普通进程运行一个管理员权限程序,可以调用ShellExcute API。双击鼠标运行exe,可以在manifest文件中加入invoker admin,UAC 会提示用户以管理员权限运行。但是,特殊就在这里了!!守护进程是windows service,service不能调用ShellExcute来创建进程,如果这样,就会会失败。需要调用CreateProcessAsUser API来创建进程,这个API的普通用法,不能创建带有管理员权限的程序,需要一丁点特殊用法,如下:



/**
  *  创建进程
  *  @param process_name 进程名
  *  @param process 进程信息
  *  @param is_run_with_create 创建时是否启动
  *  @return 0 成功
  */
int create_process(char* process_name, LPPROCESS_INFORMATION process,int is_run_with_create)
{
   

     HANDLE hToken = NULL;  
     HANDLE hTokenDup = NULL;
     int errRet = -1;
     
     if (STRING_IS_EMPTY(process_name)) {
         return -1;
     }

         do   
         {  
             if(OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS,&hToken))  
             {  
                 if(DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS,NULL, SecurityIdentification, TokenPrimary, &hTokenDup))  
                 {  
                     STARTUPINFO si;  
                    
                     LPVOID pEnv = NULL;
                     DWORD dwSessionId = WTSGetActiveConsoleSessionId();  
                     
                     ZeroMemory(&si,sizeof(STARTUPINFO));  
                    
                     
                     if(!SetTokenInformation(hTokenDup,TokenSessionId,&dwSessionId,sizeof(DWORD)))  
                     {  
                        
                         break;  
                     }  
      
                     si.cb = sizeof(STARTUPINFO);  
                     si.lpDesktop = "WinSta0\\Default";  
                     si.wShowWindow = SW_SHOW;  
                     si.dwFlags     =   STARTF_USESHOWWINDOW /*|STARTF_USESTDHANDLES*/;  
      
                     if(!CreateEnvironmentBlock(&pEnv,hTokenDup,FALSE))  
                     {  
                        
                         break;  
                     }  
      
                     if(!CreateProcessAsUser(hTokenDup,process_name,NULL,NULL,NULL,FALSE,
                         NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE | CREATE_UNICODE_ENVIRONMENT,
                         pEnv,NULL,&si,process))  
                     {  
                 
                         break;  
                     }  
      
                     if(pEnv)  
                     {  
                         DestroyEnvironmentBlock(pEnv);  
                     }  
                 }  
                 else  
                 {  
                     break;  
                 }  
      
             }  
             else  
             {  
               
                 errRet = 0;
                 break;  
             }  
         }while(0);  
      
         if(hTokenDup != NULL && hTokenDup != INVALID_HANDLE_VALUE)  
             CloseHandle(hTokenDup);  
         if(hToken != NULL && hToken != INVALID_HANDLE_VALUE)  
             CloseHandle(hToken);  

     return errRet;
}
  用以上的代码就能用windows服务进程创建带有管理员权限的主程序了。
  references:
  http://stackoverflow.com/questions/6418791/requesting-administrator-privileges-at-run-time
  http://blog.csdn.net/woshinia/article/details/7850295
  http://stackoverflow.com/questions/6261427/how-to-run-a-process-as-an-administrator-from-win32-c

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-389274-1-1.html 上篇帖子: [转]Windows进程间通信的各种方法 下篇帖子: windows下tomcat切割日志按照日期输出
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表