windows 9系统,九章 编程
文章目录前言一、Windows服务的概念和管理1.1 管理窗子服务sc.exe管理Windows操作系统操作系统服务1.2 服务控制器二、Windows服务编程2.1 与持有国家证书的助产士建立连接OpenSCManager 2.2创建服务创建服务2.5完整创建Windows操作系统操作系统服务前言一、Windows服务的概念和管理1.1 管理窗子服务打开Windows操作系统操作系统服务管理器窗口
快捷键命令:
services.mscsc.exe管理Windows操作系统操作系统服务南卡罗来纳州服务器[命令][服务名称]选项一选项2.
1.2 服务控制器服务控制器(服务控制管理器,SCM)是窗子操作系统家族操作系统中的一个系统进程,它可以启动、停止Windows操作系统操作系统服务,并与Windows操作系统操作系统服务交流。
服务控制器对应的可执行文件是%SystemRoot%\services.exe,它以Windows操作系统操作系统控制台程序的形式运行。在系统启动时,由Wininit进程加载。
持有国家证书的助产士的主函数是SvcCtrlMain(),它将加载被配置为自动启动的服务列表。
Windows操作系统操作系统服务的信息保存在注册表的如下位置中:
HKEY _ LOCAL _ MACHINE \ SYSTEM \ current control set \ Services二、Windows服务编程在开发工具程序中,可以对Windows操作系统操作系统服务进行控制,例如:
创建服务启动服务停止服务查询服务的状态枚举服务列表等2.1 与持有国家证书的助产士建立连接要在程序中访问Windows操作系统操作系统服务,首先需要与服务控制器(供应链管理)建立连接。
OpenSCManagerSC _ HANDLE OpenSCManager(
【在,可选] LPCSTR lpMachineName,
【在,可选] LPCSTR lpDatabaseName,
[in]DWORD dwdesireddaccess
);lpMachineName:目标计算机的名称。如果指针是空或空字符串,函数连接到本地计算机上的服务控制管理器。
lpDatabaseName:服务控制管理器数据库的名称。这个参数应该设置为服务_活动_数据库。如果是空,
服务_活动_数据库数据库默认打开。
dwDesiredAccess:对服务的访问控制管理。
相关权限查看访问
2.2 创建服务创建服务调用创建服务()函数可以创建一个服务对象,并将其添加到数据库中,函数原型如下:
SC_HANDLE创建服务(
[in] SC_HANDLE hSCManager,
[in] LPCSTR lpServiceName,
【在,可选] LPCSTR lpDisplayName,
[in]DWORD dwdesireddaccess,
[in] DWORD dwServiceType,
[in] DWORD dwStartType,
[in] DWORD dwErrorControl,
【在,可选] LPCSTR lpBinaryPathName,
【在,可选] LPCSTR lpLoadOrderGroup,
【出去,可选] LPDWORD lpdwTagId,
【在,可选] LPCSTR lpDependencies,
【在,可选] LPCSTR lpServiceStartName,
【在,可选] LPCSTR lpPassword
);2.5 完整创建Windows操作系统操作系统服务https://份文件。微软。com/en-us/windows/win32/services/SVC-CPP
#包含windows.h
#包含查尔. h
#包含strsafe.h
#杂注注释(lib, advapi32.lib )
#定义服务名称文本(服务名称)
服务状态gSvcStatus
SERVICE _ STATUS _ HANDLE gSvcStatusHandle;
句柄ghSvcStopEvent=NULL
VOID SvcInstall(VOID);
VOID WINAPI SvcCtrlHandler(DWORD);
VOID WINAPI SvcMain(DWORD,LPTSTR *);
VOID ReportSvcStatus(DWORD,DWORD,DWORD);
VOID SvcInit(DWORD,LPTSTR *);
VOID SvcReportEvent(LPCTSTR);
#定义SVC_ERROR -11
//int __cdecl _tmain(int argc,TCHAR* argv[])
//{
////如果命令行参数为“安装”,则安装该服务。
////否则,服务可能正在由持有国家证书的助产士启动。
//
//if (lstrcmpi(argv[1],TEXT( install )==0)
//{
//SvcInstall();
//返回0;
//}
//TCHAR SVC名称[]=SVC名称;
////待办事项:将进程的任何附加服务添加到此表中。
//SERVICE _ TABLE _ ENTRY调度表[]=
//{
//{ svcname,(LP service _ MAIN _ FUNCTION)SVC MAIN },
//{ NULL,NULL }
//};
//
////当服务停止时,此调用返回。
////当调用返回时,进程应该简单地终止。
//
//如果(!StartServiceCtrlDispatcher(调度表))
//{
//SvcReportEvent(TEXT( StartServiceCtrlDispatcher ));
//}
//返回0;
//}
VOID SvcInstall()
{
SC _ HANDLE schSCManager
SC _ HANDLE schService
TCHAR深圳路径[MAX _ PATH];
如果(!GetModuleFileName(NULL,szPath,MAX_PATH))
{
printf(无法安装服务(%d)\n ,GetLastError());
返回;
}
//获取持有国家证书的助产士数据库的句柄。
schSCManager=OpenSCManager(
空,//本地计算机
空,//服务活动数据库
SC _ MANAGER _ ALL _ ACCESS);//完全访问权限
if (NULL==schSCManager)
{
printf(OpenSCManager失败(%d)\n ,GetLastError());
返回;
}
//创建服务
schService=CreateService(
schSCManager,//SCM数据库
服务名称,//服务名称
SVCNAME,//要显示的服务名称
SERVICE_ALL_ACCESS,//期望的访问
SERVICE_WIN32_OWN_PROCESS,//服务类型
服务需求启动,//启动类型
服务错误正常,//错误控制类型
szPath,//服务二进制文件路径
空,//无加载顺序组
空,//没有标记标识符
空,//没有依赖关系
NULL,//LocalSystem帐户
NULL);//没有密码
if (schService==NULL)
{
printf(CreateService失败(%d)\n ,GetLastError());
CloseServiceHandle(schsc管理器);
返回;
}
else printf(服务安装成功\ n’);
CloseServiceHandle(sch服务);
CloseServiceHandle(schsc管理器);
}
VOID WINAPI SvcMain(DWORD dwArgc,LPTSTR* lpszArgv)
{
//注册服务的处理函数
gSvcStatusHandle=RegisterServiceCtrlHandler(
SVCNAME,
SvcCtrlHandler);
如果(!gSvcStatusHandle)
{
SvcReportEvent(TEXT( registerservicectrl handler ));
返回;
}
//这些服务状态成员保持此处设置的状态
gsvc状态。dwservicetype=SERVICE _ WIN32 _ OWN _ PROCESS;
gsvc状态。dwservicespecificexitcode=0;
//向持有国家证书的助产士报告初始状态
ReportSvcStatus(服务启动挂起,无错误,3000);
//执行特定于服务的初始化和工作。
SvcInit(dwArgc,lpszArgv);
}
VOID SvcInit(DWORD dwArgc,LPTSTR* lpszArgv)
{
//TO_DO:声明并设置任何必需的变量。
//确保定期调用ReportSvcStatus()
//服务启动挂起。如果初始化失败,调用
//带有服务_已停止的报告状态.
//创建一个事件。控制处理函数SvcCtrlHandler,
//当接收到停止控制代码时发出此事件的信号。
ghSvcStopEvent=CreateEvent(
空,//默认安全属性
真,//手动重置事件
FALSE,//无信号
NULL);//没有名字
if (ghSvcStopEvent==NULL)
{
ReportSvcStatus(服务停止,无错误,0);
返回;
}
//初始化完成时报告运行状态。
ReportSvcStatus(SERVICE _ RUNNING,NO_ERROR,0);
//TO_DO:执行工作直到服务停止。
while (1)
{
//检查是否停止服务。
WaitForSingleObject(ghSvcStopEvent,INFINITE);
ReportSvcStatus(服务停止,无错误,0);
返回;
}
}
VOID ReportSvcStatus(DWORD dwCurrentState,
DWORD dwWin32ExitCode,
DWORD dwWaitHint)
{
静态DWORD dw检查点=1;
//填写服务状态结构。
gsvc状态。dwCurrentState=dwCurrentState
gsvc状态。dw win 32退出代码=dw win 32退出代码;
gsvc状态。dwWaitHint=dwWaitHint
if(dwCurrentState==SERVICE _ START _ PENDING)
gsvc状态。dwcontrolsaccepted=0;
否则gsvc状态。dwcontrolsaccepted=SERVICE _ ACCEPT _ STOP;
if((dwCurrentState==SERVICE _ RUNNING)
(dwCurrentState==SERVICE _ STOPPED))
gsvc状态。dw检查点=0;
否则gsvc状态。dw检查点=dw检查点;
//向持有国家证书的助产士报告服务的状态。
SetServiceStatus(gSvcStatusHandle,gSvcStatus);
}
VOID WINAPI SvcCtrlHandler(DWORD dw ctrl)
{
//处理请求的控制代码。
开关(dwCtrl)
{
案例服务_控制_停止:
ReportSvcStatus(SERVICE _ STOP _ PENDING,NO_ERROR,0);
//通知服务停止。
SetEvent(ghSvcStopEvent);
ReportSvcStatus(gsvc状态。dwcurrentstate,NO_ERROR,0);
返回;
案例服务_控制_询问:
打破;
默认值:
打破;
}
}
VOID SvcReportEvent(LPCTSTR SZ函数)
{
处理hEventSource
LPCTSTR lpsz字符串[2];
通用字符缓冲区[80];
hEventSource=RegisterEventSource(NULL,SVCNAME);
if (NULL!=hEventSource)
{
stringchprintf(Buffer,80,TEXT(%s以%d 失败)、szFunction、GetLastError());
lpsz strings[0]=SVCNAME;
lpsz strings[1]=缓冲区;
ReportEvent(hEventSource,//事件日志句柄
事件日志错误类型,//事件类型
0,//事件类别
SVC_ERROR,//事件标识符
空,//没有安全标识符
2,lpszStrings数组的大小
0,//没有二进制数据
lpszStrings,//字符串数组
NULL);//没有二进制数据
注销事件源(hEventSource);
}
}
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。