windows 服务进程中调用UI进程

本文详细介绍了在Windows环境下,如何使服务进程通过调用UI进程实现提权,以获得Administrator权限。通过获取explorer.exe的进程句柄,并利用CreateProcessAsUser方法,创建具有指定权限的应用程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述:

    Windows 服务程序的权限一般只是SYSTEM权限,而UI进程则需要Administrator权限才能正常显示,因此服务进程需要调用UI进程则需要进行提权处理.可使用CreateProcessAsUser 方法创建指定权限的应用程序。

    提权则需要获取对应权限令牌,一般explorer.exe进程的权限是Administrator,因此我们可以通过 explorer.exe进程获取Administraror权限。

具体实现方法如下:

//根据进程名称获取进程句柄

HANDLE GetProcessHandle(LPCTSTR szExeName)
 {
  PROCESSENTRY32 Pc = { sizeof(PROCESSENTRY32) };
  HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
  if (Process32First(hSnapshot, &Pc)){

   do{

    if (!_tcsicmp(Pc.szExeFile, szExeName)) {  
     printf("explorer's PID=%d\n", Pc.th32ProcessID);
     return OpenProcess(PROCESS_ALL_ACCESS, TRUE, Pc.th32ProcessID);

    }

   } while (Process32Next(hSnapshot, &Pc));

  }

  return NULL;
 }

//创建进程阻塞并返回进程句柄

bool ShellExecuteByAdmin( LPCTSTR strCommand,  HANDLE* pProcessHandle)
 {
  HANDLE hToken;
  HANDLE   hExp = GetProcessHandle(_T("explorer.exe"));  //获取进程 句柄
  if (hExp == NULL)
   return   FALSE;

  OpenProcessToken(hExp, TOKEN_ALL_ACCESS, &hToken);
  if (hToken == NULL)
   return   FALSE;
  STARTUPINFO si;
  PROCESS_INFORMATION pi;
  ZeroMemory(&si, sizeof(STARTUPINFO));
  si.cb = sizeof(STARTUPINFO);
  si.lpDesktop = L"winsta0\\default";
  si.wShowWindow = SW_HIDE;
  si.dwFlags = STARTF_USESHOWWINDOW;

  TCHAR   szParameter[256] = {0};
  lstrcat(szParameter, strCommand.c_str());


  if (CreateProcessAsUser(hToken, NULL, szParameter, NULL,
   NULL, FALSE, CREATE_NO_WINDOW|CREATE_NEW_CONSOLE|CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &si, &pi))   //以administrator用户身份执行程序,CREATE_NO_WINDOW,CREATE_NEW_CONSOLE,CREATE_DEFAULT_ERROR_MODE
  {
   if (pi.hProcess != INVALID_HANDLE_VALUE)
   {
    *pProcessHandle = pi.hProcess;

    WaitForSingleObject(pi.hProcess, INFINITE);  //直到进程结束。可通过pProcessHandle 控制创建进程的生命周期。

   }
   CloseHandle(pi.hProcess);
   CloseHandle(pi.hThread);
  }

  

  CloseHandle(hToken);
  return 0;

 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值