本文目标:编写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;
}