c++小工具:将exe加入系统服务项,并设置为启动

本文目标:编写c++小工具,将某个exe加入系统服务项,并启动该服务。

思路:1.将exe加入系统服务(c++中使用批处理实现)

            2.编辑注册表(c++注册表编程实现)

            3.启动服务(c++中使用批处理实现,或者c++系统服务编程实现)


准备工作:

          需要两个小软件:Instsrv.exe和Srvany.exe。(Instsrv.exe可以给系统安装和删除服务,Srvany.exe可以让程序以服务的方式运行。)
          将两个软件放入 C:\Windows\System32\目录下
          将C:\Windows\System32\加入系统环境变量(此处不知道怎么加的话自己百度一下)


源码如下:

// Temp.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <windows.h>
#include <atlstr.h >
#include <shellapi.h>

int _tmain(int argc, _TCHAR* argv[])
{
	SHELLEXECUTEINFO ShExecInfo = { 0 };
	SERVICE_STATUS status;
	SC_HANDLE schSCManager;
	SC_HANDLE schService;

	HKEY hKey;
	HKEY hKeyPara;
	HKEY hTempKey;
	LPCTSTR SubKey = _T("SYSTEM\\CurrentControlSet\\Services\\GameManagerServer");
	LPCTSTR SubKeyPara = _T("SYSTEM\\CurrentControlSet\\Services\\GameManagerServer\\Parameters");
	CString m_name = "D:\\server\\GameManagerServer\\GameManageSvr.exe";
	CString m_nameDirectory = "D:\\server\\GameManagerServer\\";
	LPBYTE m_name_Set = (LPBYTE)(LPCTSTR)(m_name);//定义x轴名称
	LPBYTE m_name_SetDirectory = (LPBYTE)(LPCTSTR)(m_nameDirectory);//定义x轴名称
	DWORD length = m_name.GetLength() + 50;//定义数据长度

	//1.将exe加入系统服务(方法一:批处理)
	/*ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
	ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
	ShExecInfo.hwnd = NULL;
	ShExecInfo.lpVerb = NULL;
	ShExecInfo.lpFile = _T("cmd.exe");
	ShExecInfo.lpParameters = _T("/k instsrv GameManagerServer C:\\Windows\\System32\\srvany.exe ");
	ShExecInfo.lpDirectory = _T("");
	ShExecInfo.nShow = SW_HIDE;
	ShExecInfo.hInstApp = NULL;
	ShellExecuteEx(&ShExecInfo);*/

	//1.将exe加入系统服务(方法二:批处理)
	//WinExec("instsrv GameManagerServer C:\\Windows\\System32\\srvany.exe",SW_NORMAL);

	//1.将exe加入系统服务(方法三:批处理)
	system("instsrv GameManagerServer C:\\Windows\\System32\\srvany.exe");

	Sleep(3000);//cmd的执行需要时间,避免时间差,加个时延,此处千万注意!!!!!!!!!!!!

	//2.编辑注册表
	if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, SubKey, 0, KEY_ALL_ACCESS, &hKey))//打开注册表项
	{
		printf("打开GameManagerServer注册表成功\r\n");
		if (ERROR_SUCCESS == RegCreateKey(hKey, _T("Parameters"), &hTempKey))//添加项Parameters
		{
			printf("创建Parameters成功\r\n");
		}
		else
		{
			MessageBox(NULL, _T("创建Parameters错误!"), _T("错误"), NULL);

		}
	}
	else
	{
		MessageBox(NULL, _T("打开GameManagerServer注册表错误!"), _T("错误"), NULL);
	}
	::RegCloseKey(hKey);

	if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, SubKeyPara, 0, KEY_ALL_ACCESS, &hKeyPara) == ERROR_SUCCESS)//打开注册表项Parameters
	{
		//添加子键Application
		if (ERROR_SUCCESS != ::RegSetValueEx(hKeyPara, _T("Application"), 0, REG_SZ, m_name_Set, length))
		{
			MessageBox(NULL, _T("添加子键Application错误!"), _T("错误"), NULL);
			::RegCloseKey(hKeyPara);
		}
		else
		{
			//添加子键AppDirectory
			if (ERROR_SUCCESS != ::RegSetValueEx(hKeyPara, _T("AppDirectory"), 0, REG_SZ, m_name_SetDirectory, length))
			{
				MessageBox(NULL, _T("添加子键AppDirectory错误!"), _T("错误"), NULL);
				::RegCloseKey(hKeyPara);
			}
			else
			{
				//添加子键AppParameters
				if (ERROR_SUCCESS != ::RegSetValueEx(hKeyPara, _T("AppParameters"), 0, REG_SZ, NULL, NULL))
				{
					MessageBox(NULL, _T("添加子键AppParameters错误!"), _T("错误"), NULL);
					::RegCloseKey(hKeyPara);
				}
				else
				{
					printf("GameManagerServer添加系统服务成功\r\n");
					MessageBox(NULL, _T("GameManagerServer添加系统服务成功!"), _T("提示"), NULL);
					::RegCloseKey(hKeyPara);
				}
			}
		}
	}
	else
	{
		MessageBox(NULL, _T("打开注册表项Parameters错误!"), _T("错误"), NULL);
	}

	//3.启动服务(方法一:批处理)
	system("sc start GameManagerServer");

	3.启动服务(方法二:c++操作系统服务)
	//schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);   // 打开服务控制管理数据库,并返回服务控制管理数据库的句柄
	//if (schSCManager == NULL)
	//{
	//	MessageBox(NULL, _T("打开系统服务控制器失败!"), _T("错误"), NULL);
	//	return FALSE;
	//}
	//schService = OpenService(schSCManager, _T("GameManagerServer"), SERVICE_ALL_ACCESS | DELETE);    // 获得服务句柄
	//if (schService == NULL)
	//{
	//	return FALSE;
	//}
	//QueryServiceStatus(schService, &status);   // 获得服务的当前状态

	//if (status.dwCurrentState = SERVICE_STOPPED)   // 如果服务处于停止状态,则将其状态设置为启动

	//	//状态
	//	StartService(schService, 0, NULL);   //启动服务

	//CloseServiceHandle(schSCManager);   // 关闭服务句柄
	//CloseServiceHandle(schService);

	return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值