服務啟動一個程式
#include <TLHELP32.H>
#include <psapi.h>
#include <WtsApi32.h>
#include <UserEnv.h>
#include <tchar.h>
#pragma comment(lib,"psapi.lib")
#pragma comment(lib,"WtsApi32.lib")
#pragma comment(lib,"UserEnv.lib")
//根據程式名稱獲取Token
BOOL GetTokenByName(HANDLE &hToken, LPSTR lpName)
{
if (!lpName)
{
return FALSE;
}
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), _strupr(lpName)))
{
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,
FALSE, pe32.th32ProcessID);
bRet = OpenProcessToken(hProcess, TOKEN_ALL_ACCESS, &hToken);
CloseHandle(hProcessSnap);
return (bRet);
}
} while (Process32Next(hProcessSnap, &pe32));
}
else
{
bRet = FALSE;
}
CloseHandle(hProcessSnap);
return (bRet);
}
//啟動一個程式
BOOL StartProcessBySysService(const char* pAppFullFileName, const char* pRunParameter)
{
BOOL bRet = FALSE;
HANDLE hToken = NULL;
//獲取管理員的token
bRet = GetTokenByName(hToken, "EXPLORER.EXE");
if (bRet)
{
char szSoftWare[1024] = { 0 };
if (pRunParameter != NULL)
{
::sprintf_s(szSoftWare, 1024, "\"%s\" %s", pAppFullFileName, pRunParameter);
}
else
{
::sprintf_s(szSoftWare, 1024, "\"%s\"", pAppFullFileName);
}
//目錄工作路徑
char szProgrammeWorkPath[MAX_PATH] = { 0 };
::strcpy_s(szProgrammeWorkPath, MAX_PATH - 1, pAppFullFileName);//+1,從c:\..開始
if (::strchr(szProgrammeWorkPath, ':') != NULL &&
::strrchr(szProgrammeWorkPath, '\\') != NULL)
{
(_tcsrchr(szProgrammeWorkPath, '\\'))[1] = 0;
}
TCHAR szUsername[MAX_PATH];
TCHAR para[MAX_PATH] = { 0 };
TCHAR szUsernamePath[MAX_PATH];
DWORD dwUsernameLen = MAX_PATH;
DWORD UsernamePathSize = ARRAYSIZE(szUsernamePath);
//獲取到當前使用者路徑
if (!GetUserProfileDirectory(hToken, szUsernamePath, &UsernamePathSize))
{
return FALSE;
}
BOOL bResult = FALSE;
PROCESS_INFORMATION pi = { 0 };
STARTUPINFO si;
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.lpDesktop = "winsta0\\default";
LPVOID environment;
BOOL blockRet = CreateEnvironmentBlock(&environment, hToken, FALSE);
if (!blockRet)
{
return NULL;
}
else
{
DWORD creationFlags = NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW | CREATE_UNICODE_ENVIRONMENT;
bResult = CreateProcessAsUser(
hToken,
NULL,
szSoftWare,
NULL,
NULL,
FALSE,
creationFlags,
environment,
szProgrammeWorkPath,
&si,
&pi
);
if (bResult && pi.hProcess != INVALID_HANDLE_VALUE)
{
bRet = TRUE;
//WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
}
else
{
int nErrorCode = GetLastError();
bRet = FALSE;
}
if (pi.hThread != INVALID_HANDLE_VALUE)
{
CloseHandle(pi.hThread);
}
DestroyEnvironmentBlock(environment);
}
CloseHandle(hToken);
}
return bRet;
}
//測試程式碼
BOOL bRet = StartProcessBySysService("C:\\Windows\\system32\\calc.exe",NULL);
相關文章
- Swoole 啟動一個服務,開啟了哪些程式和執行緒?執行緒
- 如何讓 Hyperf 只啟動一個服務
- 使用node啟動一個簡單的服務
- What?一個 Dubbo 服務啟動要兩個小時!
- shell監控服務程式是否啟動
- windows 服務執行啟動桌面程式Windows
- 講一個linux服務啟動報錯問題排查Linux
- Systemd 服務:比啟動停止服務更進一步
- 前端如何用node開啟一個服務前端
- 案例十:shell編寫nginx服務啟動程式Nginx
- gitblit 服務啟動不了Git
- linux 下啟動服務Linux
- python 啟動http服務PythonHTTP
- Linux使用Ambari啟動服務啟動失敗Linux
- Kali Linux常用服務配置教程啟動DHCP服務Linux
- dubbo服務啟動的方式
- DUBBO服務啟動過程
- 啟動與關閉服務
- 控制linux啟動的服務Linux
- mongodb服務在哪裡啟動?MongoDB
- 怎麼啟動postgresql服務SQL
- windows下啟動nacos服務Windows
- centos 自動啟動指令碼和自啟動服務CentOS指令碼
- 把一個程式註冊成系統服務
- node.js啟動http服務Node.jsHTTP
- sqlserver服務啟動失敗-1067SQLServer
- Window下啟動/停止Zookeeper服務
- Ubuntu Server 24.04 自啟動服務UbuntuServer
- Nuxt動態ip啟動開發服務UX
- 寫一個RPC服務RPC
- systemctl 命令在 Linux 中啟動、停止和重新啟動服務Linux
- 國服啟動項csgo程式碼 csgo怎麼更改國服啟動項Go
- docker compose 服務啟動順序控制Docker
- 本地啟動服務的三種方法
- openstack 啟動認證服務錯誤
- Linux 如何啟動mail郵件服務LinuxAI
- Linux怎麼知道服務是否啟動?Linux
- vscode原始碼分析【七】主程式啟動訊息通訊服務VSCode原始碼