服務啟動一個程式
#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 啟動一個服務,開啟了哪些程式和執行緒?執行緒
- shell監控服務程式是否啟動
- windows 服務執行啟動桌面程式Windows
- 講一個linux服務啟動報錯問題排查Linux
- oracle手動啟動服務Oracle
- 前端如何用node開啟一個服務前端
- gitblit 服務啟動不了Git
- 案例十:shell編寫nginx服務啟動程式Nginx
- C++啟動一個程式C++
- linux 下啟動服務Linux
- 怎麼啟動postgresql服務SQL
- mongodb服務在哪裡啟動?MongoDB
- windows下啟動nacos服務Windows
- python 啟動http服務PythonHTTP
- centos 自動啟動指令碼和自啟動服務CentOS指令碼
- Linux使用Ambari啟動服務啟動失敗Linux
- Kali Linux常用服務配置教程啟動DHCP服務Linux
- Ubuntu 下啟動/停止/重啟mysql服務UbuntuMySql
- Windows服務無法啟動桌面應用程式(Winform介面)WindowsORM
- 控制linux啟動的服務Linux
- Android 啟動和停止服務Android
- Ubuntu Server 24.04 自啟動服務UbuntuServer
- node.js啟動http服務Node.jsHTTP
- Nuxt動態ip啟動開發服務UX
- 【MySql】開機自動啟動mysql服務MySql
- windows下啟動服務時不啟動oracle例項WindowsOracle
- 把一個程式註冊成系統服務
- WIN 10 IIS 服務或全球資訊網釋出服務,或者依賴這兩種服務的某個服務未能啟動。該服務或所依賴的服務可能在啟動期間發生錯誤或者已禁用。
- 深入淺出Netty:服務啟動Netty
- centos 服務開機啟動設定CentOS
- Oracle監聽服務無法啟動Oracle
- Flask 原始碼剖析——服務啟動篇Flask原始碼
- shell編寫服務啟動指令碼指令碼
- fedora core 啟動服務詳解(zt)
- solaris啟動ftp和telnet服務FTP
- openstack 啟動認證服務錯誤
- 記一次 Ubuntu 服務 Nginx 無法啟動問題UbuntuNginx
- 記錄一次docker快速啟動elasticsearch單機服務DockerElasticsearch