Windows服务编程Demo
实现一个开机自动启动的关机程序,具体代码如下:
#include <Windows.h> void ServiceMain();
void ControlHandler(DWORD request);
void RunService();
void Shutdown();
BOOL IsInstall();
BOOL Install(); SERVICE_STATUS_HANDLE hServiceStatus;
SERVICE_STATUS status; int WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd )
{
SERVICE_TABLE_ENTRY st[] =
{
{TEXT("Shutdown"), (LPSERVICE_MAIN_FUNCTION)ServiceMain},
{NULL, NULL}
}; if (!IsInstall())
{
Install();
} StartServiceCtrlDispatcher(st); RunService(); return ;
} void RunService()
{
SC_HANDLE schSCManager;
SC_HANDLE schService; schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (!schSCManager)
{
MessageBox(NULL, TEXT("OpenSCManager error"), TEXT("error"), MB_OK | MB_ICONERROR);
return;
} schService = OpenService(schSCManager, TEXT("Shutdown"), SERVICE_ALL_ACCESS);
if (!schService)
{
MessageBox(NULL, TEXT("OpenService error"), TEXT("error"), MB_OK | MB_ICONERROR);
} BOOL b = StartService(schService, , NULL);
} void ControlHandler(DWORD request)
{
switch (request)
{
case SERVICE_CONTROL_STOP:
case SERVICE_CONTROL_SHUTDOWN:
status.dwWin32ExitCode = ;
status.dwCurrentState = SERVICE_STOPPED;
break;
default:
break;
}
SetServiceStatus(hServiceStatus, &status);
} void ServiceMain()
{
status.dwServiceType = SERVICE_WIN32;
status.dwCurrentState = SERVICE_START_PENDING;
status.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
status.dwWin32ExitCode = ;
status.dwServiceSpecificExitCode = ;
status.dwCheckPoint = ;
status.dwWaitHint = ; hServiceStatus = RegisterServiceCtrlHandler(TEXT("Shutdown"), (LPHANDLER_FUNCTION)ControlHandler);
if ((SERVICE_STATUS_HANDLE) == hServiceStatus)
{
return;
} status.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus(hServiceStatus, &status);
Shutdown();
} void Shutdown()
{
OSVERSIONINFO os;
os.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&os);
if (VER_PLATFORM_WIN32_NT == os.dwPlatformId)
{
HANDLE handle;
TOKEN_PRIVILEGES tkp; OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &handle);
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[].Luid); tkp.PrivilegeCount = ;
tkp.Privileges[].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(handle, FALSE, &tkp, , (PTOKEN_PRIVILEGES)NULL, ); if (GetLastError() != ERROR_SUCCESS)
{
MessageBox(NULL, TEXT("AdjustTokenPrivileges error"), TEXT("error"), MB_OK | MB_ICONERROR);
}
} ExitWindowsEx(EWX_SHUTDOWN, );
} BOOL IsInstall()
{
BOOL bResult = FALSE; SC_HANDLE schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (schSCManager)
{
SC_HANDLE schService = OpenService(schSCManager, TEXT("Shutdown"), SERVICE_ALL_ACCESS);
if (schService)
{
bResult = TRUE;
CloseServiceHandle(schService);
}
CloseServiceHandle(schSCManager);
}
else
{
MessageBox(NULL, TEXT("OpenSCManager error"), TEXT("error"), MB_OK | MB_ICONERROR);
} return bResult;
} BOOL Install()
{
SC_HANDLE schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (!schSCManager)
{
MessageBox(NULL, TEXT("OpenSCManager error"), TEXT("error"), MB_OK | MB_ICONERROR);
return FALSE;
} TCHAR szFilePath[MAX_PATH];
GetModuleFileName(NULL, szFilePath, MAX_PATH); SC_HANDLE schService = CreateService(schSCManager, TEXT("Shutdown"), TEXT("Shutdown"), SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, szFilePath, NULL, NULL, TEXT(""), NULL, NULL);
if (!schService)
{
CloseServiceHandle(schSCManager);
MessageBox(NULL, TEXT("CreateService error"), TEXT("error"), MB_OK | MB_ICONERROR);
return FALSE;
} CloseServiceHandle(schService);
CloseServiceHandle(schSCManager); return TRUE;
}
本程序是开机自动关机的恶搞程序,本人亲自在物理机上测试,在windows server 2008 r2 enterprise版本的系统下测试通过。要解除本恶搞程序对你造成的不便,可以在开机时按F8进入安全模式下删除名字为Shutdown的服务即可。 输入命令: sc delete Shutdown
Windows服务编程Demo的更多相关文章
- c#写windows服务 小demo
前段时间做一个数据迁移项目,刚开始用B/S架构做的项目,但B/S要寄存在IIs中,而IIs又不稳定因素,如果重启IIs就要打开页面才能运行项目.有不便之处,就改用Windows服务实现.这篇就总结下, ...
- Windows服务编程集合
http://zyan.cc/windows_mstsc/ Optionname--Optionvalues描述 type=----own, share, interact, kernel, file ...
- C# 创建Windows服务demo
一.准备工作 1.操作系统:Windows 10 X64 2.开发环境:VS2017 3.编程语言:C# 4. .NET版本:.NET Framework 4.5 二.创建Windows Servic ...
- 用C#创建Windows服务(Windows Services)
用C#创建Windows服务(Windows Services) 学习: 第一步:创建服务框架 创建一个新的 Windows 服务项目,可以从Visual C# 工程中选取 Windows 服务(W ...
- (转)C#创建windows服务
原文地址:http://blog.itpub.net/23109131/viewspace-688117/ 第一步:创建服务框架 创建一个新的 Windows 服务项目,可以从Visual C# 工程 ...
- C# Windows服务开发从入门到精通
一.课程介绍 大家都知道如果想要程序一直运行在windows服务器上,最好是把程序写成windows服务程序:这样程序会随着系统的自动启动而启动,自动关闭而关闭,不需要用户直接登录,直接开机就可以启动 ...
- Windows服务调试小结(附Demo)
本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 阅读目录 介绍 搭建环境 调试方式 Demo下载 本文版权归mephisto和博客园共有,欢迎转载,但须 ...
- WindowsService(Windows服务)开发步骤附Demo
1.打开VS,新建项目,选择Windows服务,然后设置目录及项目名称后点击确定. 2.展开Service1服务文件,编写service1.cs类文件,不是Service1[设计].然后修改OnSta ...
- WindowsService(Windows服务)开发步骤附Demo 【转】
转http://www.cnblogs.com/moretry/p/4149489.html 1.打开VS,新建项目,选择Windows服务,然后设置目录及项目名称后点击确定. 2.展开Service ...
随机推荐
- cvc-elt.1: 找不到元素 'beans' 的声明
这次遇到的这个错误又坑爹又低级 , 是因为网上抄到了错误的xsd搞的. 这是网上抄到的 xsi:schemalocation=" http://www.springframework.org ...
- Java代码规范、格式化和checkstyle检查配置文档
http://www.blogjava.net/amigoxie/archive/2014/05/31/414287.html 文件下载: http://files.cnblogs.com/files ...
- jquery源码
null 与 undefined 都是 ==null 为true alert(typeof(123)) number alert(typeof(NAN)) 打印 number 不靠谱 ale ...
- php新浪微博登录接口用法实例
本文实例讲述了php新浪微博登录接口用法.分享给大家供大家参考.具体分析如下: 在做微博登陆之前是需要申请到APP KEY 和App Secret,这个的申请方式请去 open.weibo.com 申 ...
- [ActionScript 3.0] Away3D 天空盒(skybox)例子
/* SkyBox example in Away3d Demonstrates: How to use a CubeTexture to create a SkyBox object. How to ...
- 使用 cURL 获取站点的各类响应时间 – dns解析时间,响应时间,传输时间
http://zhangrenfang8738.blog.163.com/blog/static/95401881201142711450245/ curl监控站点响应时间 2011-05-27 11 ...
- testng.xml创建及解析
项目右键---TestNG -----> Convert to TestNG 会自动产生一个testng.xml的文件 http://www.cnblogs.com/choosewang/art ...
- poj 3295 Tautology
点击打开链接 Tautology Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8127 Accepted: 3115 ...
- [HDU 4417] Super Mario (树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4417 题目大意:给你n个数,下标为0到n-1,m个查询,问查询区间[l,r]之间小于等于x的数有多少个 ...
- Wireshark "The NPF driver isn’t running…"
(1)如果你使用的是Linux.Ubuntu系统,请用 >$ su Administrator命令切换到拥有最高权限的帐号,然后再输入命令:“net start npf”(如果不行自己查找类似命 ...