已阅读5页,还剩20页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
用VC+建立Service服务应用程序 收藏 为什么要使用服务应该程序呢?服务程序就像系统的一些服务一样,能够自动地启动,并执行相应的操作;而且因为服务程序的在层次上和一般的应用程序不同,其能够在系统启动时就自动地运行,而不像一般的应用程序那样一定要在登陆后才能运行,这些就是服务的一些好处了,如果你也想你的程序具有这样的功能,那么你就可以建立一个服务应用程序了。 下面就跟着我一步一步地教你怎么去创建一个服务应用程序吧。本文主要介绍了OpenSCManager、CreateService、OpenService、ControlService、DeleteService、RegisterServiceCtrlHandler、SetServiceStatus、StartServiceCtrlDispatcher等操作服务程序的主要几个API的用法,具体的函数参数大家可以查阅MSDN。一、建立Win32 Application应用程序(当然你也可以建立其它的应用程序,但服务一般是没有用户界面的),并命名为ServiceTest。二、定义全局函数变量/定义全局函数变量void Init();BOOL IsInstalled();BOOL Install();BOOL Uninstall();void LogEvent(LPCTSTR pszFormat, .);void WINAPI ServiceMain();void WINAPI ServiceStrl(DWORD dwOpcode);TCHAR szServiceName = _T(ServiceTest);BOOL bInstall;SERVICE_STATUS_HANDLE hServiceStatus;SERVICE_STATUS status;DWORD dwThreadID; 三、添加Init初始化函数这里主要是设置服务句柄和状态。hServiceStatus = NULL;status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;status.dwCurrentState = SERVICE_STOPPED;tatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;status.dwWin32ExitCode = 0;status.dwServiceSpecificExitCode = 0;status.dwCheckPoint = 0;status.dwWaitHint = 0; 四、添加安装和删除服务函数这里主要是用到了五个函数OpenSCManager、CreateService、OpenService、ControlService、DeleteService。OpenSCManager用于打开服务控制管理器;CreateService用于创建服务;OpenService用于打开已有的服务,返回该服务的句柄;ControlService则用于控制已打开的服务状态,这里是让服务停止后才删除;DeleteService用于删除指定服务。BOOL Install();/这里列出主要的两个函数,其它的可以在代码里找。/打开服务控制管理器OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);/创建服务SC_HANDLE hService = :CreateService(hSCM, szServiceName, szServiceName,SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,szFilePath, NULL, NULL, _T(), NULL, NULL);:CloseServiceHandle(hService);:CloseServiceHandle(hSCM);BOOL Uninstall();/这里列出主要的两个函数,其它的可以在代码里找。/打开服务控制管理器OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);/打开服务OpenService(hSCM, szServiceName, SERVICE_STOP | DELETE);/停止服务ControlService(hService, SERVICE_CONTROL_STOP, &status);/删除服务DeleteService(hService); 五、添加服务主线程函数和控制函数这里调用RegisterServiceCtrlHandler来注册服务的控制函数,这里要设置status.dwControlsAccepted为SERVICE_ACCEPT_STOP,否则你不能控制这个服务的状态。void WINAPI ServiceMain()/ Register the control request handlerstatus.dwCurrentState = SERVICE_START_PENDING;status.dwControlsAccepted = SERVICE_ACCEPT_STOP;/这个要使用,否则你不能控制/注册服务控制hServiceStatus = RegisterServiceCtrlHandler(szServiceName, ServiceStrl);if (hServiceStatus = NULL)LogEvent(_T(Handler not installed);return;SetServiceStatus(hServiceStatus, &status);status.dwWin32ExitCode = S_OK;status.dwCheckPoint = 0;status.dwWaitHint = 0;status.dwCurrentState = SERVICE_RUNNING;SetServiceStatus(hServiceStatus, &status);/模拟服务的运行,10后自动退出。应用时将主要任务放于此即可int i = 0;while (i 10)Sleep(1000);i+;/status.dwCurrentState = SERVICE_STOPPED;SetServiceStatus(hServiceStatus, &status);LogEvent(_T(Service stopped); 六、在主线程函数里注册控制函数和程序执行主体void WINAPI ServiceMain()/如上,这里主要是说明这就是程序的执行体/模拟服务的运行,10后自动退出。应用时将主要任务放于此即可int i = 0;while (i 10)Sleep(1000);i+; 七、在main函数里注册添加安装、删除、注册主函数int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)Init();dwThreadID = :GetCurrentThreadId();SERVICE_TABLE_ENTRY st = szServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain , NULL, NULL ;if (stricmp(lpCmdLine, /install) = 0)Install();else if (stricmp(lpCmdLine, /uninstall) = 0)Uninstall();elseif (!:StartServiceCtrlDispatcher(st)LogEvent(_T(Register Service Main Function Error!);return 0; 八、总结其实做一个服务程序并不难,主要是懂得程序的执行体放于哪里?注册程序的主函数和注册控制函数,如果这两个没有注册的话,你的程序就不知道如何去控制了。status.dwControlsAccepted = SERVICE_ACCEPT_STOP;这个也重要,如果你没有设置的话,那么服务就不会受你控制了。组策略编辑器用法如何使用组策略1、组策略编辑器的命令行启动 您只需单击选择“开始”“运行”命令,在“运行”对话框的“打开”栏中输入“gpedit.msc”,然后单击“确定”按扭即可启动Windows XP组策略编辑器。(注:这个“组策略”程序位于“C:WINNTSYSTEM32”中,文件名为“gpedit.msc”。) 当多人共用一台计算机时,在Windows XP中设置用户权限,可以按照以下步骤进行: 1、运行组策略编辑器程序(gpedit.msc)。 2、在编辑器窗口的左侧窗格中逐级展开“计算机配置”“Windows设置”“安全设置”“本地策略”“用户权限指派”分支。 3、双击需要改变的用户权限。单击“增加”,然后双击想指派给权限的用户帐号。如图8所示。 连续两次单击“确定”按扭。 在Windows XP中,新增了一条命令行工具“shutdown”,其作用是“关闭或重新启动本地或远程计算机”。利用它,我们不但可以注销用户,关闭或重新启动计算机,还可以实现定时关机、远程关机。 该命令的语法格式如下: shutdown -i |-l|-s |-r |-a -f -m ComputerName -t xx -c message -d :xx:yy 其中,各参数的含义为: -i 显示图形界面的对话框。 -l 注销当前用户,这是默认设置。 -m ComputerName优先。 -s 关闭计算机。 -r 关闭之后重新启动。 -a 中止关闭。除了-l 和ComputerName 外,系统将忽略其它参数。在超时期间,您只可以使用-a。 -f 强制运行要关闭的应用程序。 -m ComputerName 指定要关闭的计算机。 -t xx 将用于系统关闭的定时器设置为 xx 秒。默认值是20秒。 -c message 指定将在“系统关闭”窗口中的“消息”区域显示的消息。最多可以使用127 个字符。引号中必须包含消息。 -d :xx:yy 列出系统关闭的原因代码。 首先,我们来看一下该命令的一些基本用法: 1、注销当前用户 shutdown - l 该命令只能注销本机用户,对远程计算机不适用。 2、关闭本地计算机 shutdown - s 3、重启本地计算机 shutdown - r 4、定时关机 shutdown - s -t 30 指定在30秒之后自动关闭计算机。 向组策略安全组添加计算机和用户无线网络策略经过配置并且能够正常工作之后,向控制该策略应用程序的安全组中添加其他计算机则非常简单。 向无线网络组策略安全组添加计算机 1. 在“Active Directory 用户和计算机”中,找到与要应用的无线网络策略相对应的 Wireless Network Policy - Computer 安全组。您必须作为对此组具有“修改成员身份”权限的用户进行登录。 2. 向选定的安全组添加计算机。 向远程访问策略安全组添加用户 1. 登录到管理计算机,要求作为 Domain Administrators 组成员登录,或者使用具有修改 Remote Access Policy - Wireless Users 安全组成员身份所需的安全权限的其他帐户登录。 2. 在“Active Directory 用户和计算机”中,找到与控制无线 LAN 访问的远程访问策略相对应的 Remote Access Policy - Wireless Users 安全组。 3. 将用户添加到选定的安全组。 将计算机添加到远程访问策略安全组 1. 登录到管理计算机上,要求作为 Domain Administrators 组成员登录,或者使用具有修改 Remote Access Policy - Wireless Computers 安全组成员身份所需的安全权限的其他帐户登录。 2. 在“Active Directory 用户和计算机”中,找到与控制无线 LAN 访问的远程访问策略相对应的 Remote Access Policy - Wireless Users 安全组。 3. 向选定的安全组中添加计算机。 下面是针对2003的将组策略应用于组织单位或域 1. 依次单击“开始”、“管理工具”、“Active Directory 用户和计算机”,打开“Active Directory 用户和计算机”。 2. 突出显示相关域或组织单位,单击“操作”菜单,选择“属性”。 3. 选择“组策略”选项卡。 注意:每个容器可应用多个策略。这些策略的处理顺序是从列表的底部向上。如果出现冲突,最后应用的策略优先。 4. 单击“新建”创建一个策略,并为其指定有实际意义的名称,如“域策略”。 注意:单击“选项”按钮可配置“禁止替代”设置。“禁止替代”是为每个单独的策略配置的,而不是为整个容器;“阻止策略继承”则是为整个容器配置的。如果“禁止替代”和“阻止策略继承”设置发生冲突,“禁止替代”设置优先。要配置“阻止策略继承”,请选中 OU 属性中的复选框。 组策略可自动更新,但为了立即启动更新过程,可在命令提示符下使用下面的 GPUpdate 命令: GPUpdate /force 向“用户权限分配”添加安全组 1. 依次单击“开始”、“管理工具”、“Active Directory 用户和计算机”,打开“Active Directory 用户和计算机”。 2. 突出显示相关 OU(如“成员服务器”),单击“操作”菜单,选择“属性”。 3. 单击“组策略”选项卡,选择相关策略(如“成员服务器基准策略”),然后单击“编辑”。 4. 在“组策略对象编辑器”中,依次展开“计算机配置”、“Windows 设置”、“安全设置”、“本地策略”,然后突出显示“用户权限分配”。 5. 在右侧窗格中,右键单击相关用户权限。 6. 选中“定义这些策略设置”复选框,单击“添加用户和组”修改该列表。 7. 单击“确定”。 将安全模板导入组策略 导入安全模板 1. 依次单击“开始”、“管理工具”、“Active Directory 用户和计算机”,打开“Active Directory 用户和计算机”。 2. 突出显示相关域或 OU,单击“操作”菜单,选择“属性”。 3. 选择“组策略”选项卡。 4. 突出显示相关策略,单击“编辑”。 5. 依次展开“计算机配置”、“Windows 设置”,然后突出显示“安全设置”。 6. 单击“操作”菜单,选择“导入策略”。 7. 导航到 Security GuideJob Aids,选择相关模板,单击“打开”。 8. 在“组策略对象编辑器”中,单击“文件”菜单,选择“退出”。 9. 在容器属性中,单击“确定”。 使用“安全配置和分析” 导入安全模板 1. 依次单击“开始”、“运行”。在“打开”文本框中键入 mmc,然后单击“确定”。 2. 在 Microsoft 管理控制台中,单击“文件”,选择“添加/删除管理单元”。 3. 单击“添加”,突出显示列表中的“安全配置和分析”。 4. 依次单击“添加”、“关闭”、“确定”。 5. 突出显示“安全配置和分析”,单击“操作”菜单,选择“打开数据库”。 6. 键入新的数据库名称(如 Bastion Host),单击“打开”。 7. 在“导入模板”界面中,导航到 Security GuideJob Aids,选择相关模板。单击“打开”。 分析导入的模板并与当前设置比较 1. 突出显示 Microsoft 管理单元中的“安全配置和分析”,单击“操作”菜单,并选择“立即分析计算机”。 2. 单击“确定”,接受默认的“错误日志文件路径”。 3. 完成分析后,展开节点标题对结果进行研究。 应用安全模板 1. 突出显示 Microsoft 管理单元中的“安全配置和分析”,单击“操作”菜单,选择“立即配置计算机”。 2. 单击“确定”,接受默认的“错误日志文件路径”。 3. 在 Microsoft 管理控制台,单击“文件”,然后选择“退出”关闭“安全配置和分析”。VC/MFC 实现禁止,停止,启动,创建NT服务The CreateService function creates a service object and adds it to the specified service control manager database. SC_HANDLE CreateService( SC_HANDLE hSCManager, LPCTSTR lpServiceName, LPCTSTR lpDisplayName, DWORD dwDesiredAccess, DWORD dwServiceType, DWORD dwStartType, DWORD dwErrorControl, LPCTSTR lpBinaryPathName, LPCTSTR lpLoadOrderGroup, LPDWORD lpdwTagId, LPCTSTR lpDependencies, LPCTSTR lpServiceStartName, LPCTSTR lpPassword ); The DeleteService function marks the specified service for deletion from the service control manager database. BOOL DeleteService( SC_HANDLE hService ); Installing a Service A service configuration program uses the CreateService function to install a service in a SCM database. The application-defined schSCManager handle must have SC_MANAGER_CREATE_SERVICE access to the SCManager object. The following example shows how to install a service. VOID CreateSampleService() LPCTSTR lpszBinaryPathName = %SystemRoot%systemtestserv.exe ; schService = CreateService( schSCManager, / SCManager database Sample_Srv , / name of service lpszDisplayName, / service name to display SERVICE_ALL_ACCESS, / desired access SERVICE_WIN32_OWN_PROCESS, / service type SERVICE_DEMAND_START, / start type SERVICE_ERROR_NORMAL, / error control type lpszBinaryPathName, / service s binary NULL, / no load ordering group NULL, / no tag identifier NULL, / no dependencies NULL, / LocalSystem account NULL); / no password if (schService = NULL) MyErrorExit( CreateService ); else printf( CreateService SUCCESS.n ); CloseServiceHandle(schService); ControlService The ControlService function sends a control code to a service. BOOL ControlService( SC_HANDLE hService, DWORD dwControl, LPSERVICE_STATUS lpServiceStatus );Stopping a Service A service can be stopped with the ControlService function by sending a SERVICE_CONTROL_STOP request. If the SCM receives a SERVICE_CONTROL_STOP request for a service, it instructs the service to stop by forwarding the request to the service s ServiceMain function. However, if the SCM determines that other running services are dependent on the specified service, it will not forward the stop request. Instead, it returns ERROR_DEPENDENT_SERVICES_RUNNING. Therefore, to programmatically stop such a service, you must first enumerate and stop its dependent services. The following code implements a StopService function, which optionally attempts to stop the specified service s dependent services. #include #include #include / This function attempts to stop a service. It allows the caller to / specify whether dependent services should also be stopped. It also / accepts a timeout value, to prevent a scenario in which a service / shutdown hangs, then the application stopping the service hangs. / / Parameters: / hSCM - Handle to the service control manager. / hService - Handle to the service to be stopped. / fStopDependencies - Indicates whether to stop dependent services. / dwTimeout - maximum time (in milliseconds) to wait / / If the operation is successful, returns ERROR_SUCCESS. Otherwise, / returns a system error code. DWORD StopService( SC_HANDLE hSCM, SC_HANDLE hService, BOOL fStopDependencies, DWORD dwTimeout ) SERVICE_STATUS ss; DWORD dwStartTime = GetTickCount(); / Make sure the service is not already stopped if ( !QueryServiceStatus( hService, &ss ) ) return GetLastError(); if ( ss.dwCurrentState = SERVICE_STOPPED ) return ERROR_SUCCESS; / If a stop is pending, just wait for it while ( ss.dwCurrentState = SERVICE_STOP_PENDING ) Sleep( ss.dwWaitHint ); if ( !QueryServiceStatus( hService, &ss ) ) return GetLastError(); if ( ss.dwCurrentState = SERVICE_STOPPED ) return ERROR_SUCCESS; if ( GetTickCount() - dwStartTime dwTimeout ) return ERROR_TIMEOUT; / If the service is running, dependencies must be stopped first if ( fStopDependencies ) DWORD i; DWORD dwBytesNeeded; DWORD dwCount; LPENUM_SERVICE_STATUS lpDependencies = NULL; ENUM_SERVICE_STATUS ess; SC_HANDLE hDepService; / Pass a zero-length buffer to get the required buffer size if ( EnumDependentServices( hService, SERVICE_ACTIVE, lpDependencies, 0, &dwBytesNeeded, &dwCount ) ) / If the Enum call succeeds, then there are no dependent / services so do nothing else if ( GetLastError() != ERROR_MORE_DATA ) return GetLastError(); / Unexpected error / Allocate a buffer for the dependencies lpDependencies = (LPENUM_SERVICE_STATUS) HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, dwBytesNeeded ); if ( !lpDependencies ) return GetLastError(); _try / Enumerate the dependencies if ( !EnumDependentServices( hService, SERVICE_ACTIVE, lpDependencies, dwBytesNeeded, &dwBytesNeeded, &dwCount ) ) return GetLastError(); for ( i = 0; i dwTimeout ) return E
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026中国智慧农业区块链数字乡村行业市场供需分析及投资评估规划分析研究报告
- 2026软件外包服务行业市场现状与电子投资评估规划研究报告
- 2026中国食品饮料行业市场拓展前景张力分析及投资规划研究报告文档
- 2026软件服务产业数字化转型需求预测规划发展报告
- 2026旅游民宿产业标准化建设与市场需求预测规划
- 2026中国无人驾驶汽车测试场地建设与法规完善发展分析
- 2026中国饲料行业市场供需发展及环保饲料添加剂开发
- 2026体育招考面试题库及答案
- 2026及未来5年中国制冷剂泄漏检测仪数据监测研究报告
- 2026事业单位工勤技能-广东-广东造林管护工五级(初级工)历年参考题库含答案详解3套试卷
- 2025年重庆市从“五方面人员”中选拔乡镇领导班子成员考试历年参考题库含答案详解
- 文书模板-中标单位情况说明
- 2026第二届全国红旗杯班组长大赛考试备考核心试题库500题
- 2026年常德职业技术学院单招职业技能测试题库附答案详解(综合卷)
- 2026年安徽高中化学竞赛初赛试题及答案
- 企业用工管理培训课件
- 沪科版(2024)八年级上册物理期末复习:全册重点知识点讲义
- 灰渣处置安全培训课件
- 2025ACC专家共识声明:心源性休克的评估与管理
- 2025中国胸痛中心诊疗指南
- DGTJ08-2310-2019 外墙外保温系统修复技术标准
评论
0/150
提交评论