zoukankan      html  css  js  c++  java
  • Windows服务编程Demo

    Windows服务编程Demo

     

    实现一个开机自动启动的关机程序,具体代码如下:

    复制代码
      1 #include <Windows.h>
      2 
      3 void ServiceMain();
      4 void ControlHandler(DWORD request);
      5 void RunService();
      6 void Shutdown();
      7 BOOL IsInstall();
      8 BOOL Install();
      9 
     10 SERVICE_STATUS_HANDLE hServiceStatus;
     11 SERVICE_STATUS status;
     12 
     13 int WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd )
     14 {
     15     SERVICE_TABLE_ENTRY st[] = 
     16     {
     17         {TEXT("Shutdown"), (LPSERVICE_MAIN_FUNCTION)ServiceMain},
     18         {NULL, NULL}
     19     };
     20 
     21     if (!IsInstall())
     22     {
     23         Install();
     24     }
     25 
     26     StartServiceCtrlDispatcher(st);
     27 
     28     RunService();
     29 
     30     return 0;
     31 }
     32 
     33 void RunService()
     34 {
     35     SC_HANDLE schSCManager;
     36     SC_HANDLE schService;
     37 
     38     schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
     39     if (!schSCManager)
     40     {
     41         MessageBox(NULL, TEXT("OpenSCManager error"), TEXT("error"), MB_OK | MB_ICONERROR);
     42         return;
     43     }
     44 
     45     schService = OpenService(schSCManager, TEXT("Shutdown"), SERVICE_ALL_ACCESS);
     46     if (!schService)
     47     {
     48         MessageBox(NULL, TEXT("OpenService error"), TEXT("error"), MB_OK | MB_ICONERROR);
     49     }
     50 
     51     BOOL b = StartService(schService, 0, NULL);
     52 }
     53 
     54 void ControlHandler(DWORD request)
     55 {
     56     switch (request)
     57     {
     58     case SERVICE_CONTROL_STOP:
     59     case SERVICE_CONTROL_SHUTDOWN:
     60         status.dwWin32ExitCode = 0;
     61         status.dwCurrentState = SERVICE_STOPPED;
     62         break;
     63     default:
     64         break;
     65     }
     66     SetServiceStatus(hServiceStatus, &status);
     67 }
     68 
     69 void ServiceMain()
     70 {
     71     status.dwServiceType = SERVICE_WIN32;
     72     status.dwCurrentState = SERVICE_START_PENDING;
     73     status.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
     74     status.dwWin32ExitCode = 0;
     75     status.dwServiceSpecificExitCode = 0;
     76     status.dwCheckPoint = 0;
     77     status.dwWaitHint = 0;
     78 
     79     hServiceStatus = RegisterServiceCtrlHandler(TEXT("Shutdown"), (LPHANDLER_FUNCTION)ControlHandler);
     80     if ((SERVICE_STATUS_HANDLE)0 == hServiceStatus)
     81     {
     82         return;
     83     }
     84 
     85     status.dwCurrentState = SERVICE_RUNNING;
     86     SetServiceStatus(hServiceStatus, &status);
     87     Shutdown();
     88 }
     89 
     90 void Shutdown()
     91 {
     92     OSVERSIONINFO os;
     93     os.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
     94     GetVersionEx(&os);
     95     if (VER_PLATFORM_WIN32_NT == os.dwPlatformId)
     96     {
     97         HANDLE handle;
     98         TOKEN_PRIVILEGES tkp;
     99 
    100         OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &handle);
    101         LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
    102 
    103         tkp.PrivilegeCount = 1;
    104         tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    105 
    106         AdjustTokenPrivileges(handle, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
    107 
    108         if (GetLastError() != ERROR_SUCCESS)
    109         {
    110             MessageBox(NULL, TEXT("AdjustTokenPrivileges error"), TEXT("error"), MB_OK | MB_ICONERROR);
    111         }
    112     }
    113 
    114     ExitWindowsEx(EWX_SHUTDOWN, 0);
    115 }
    116 
    117 BOOL IsInstall()
    118 {
    119     BOOL bResult = FALSE;
    120 
    121     SC_HANDLE schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    122     if (schSCManager)
    123     {
    124         SC_HANDLE schService = OpenService(schSCManager, TEXT("Shutdown"), SERVICE_ALL_ACCESS);
    125         if (schService)
    126         {
    127             bResult = TRUE;
    128             CloseServiceHandle(schService);
    129         }
    130         CloseServiceHandle(schSCManager);
    131     }
    132     else
    133     {
    134         MessageBox(NULL, TEXT("OpenSCManager error"), TEXT("error"), MB_OK | MB_ICONERROR);
    135     }
    136 
    137     return bResult;
    138 }
    139 
    140 BOOL Install()
    141 {
    142     SC_HANDLE schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    143     if (!schSCManager)
    144     {
    145         MessageBox(NULL, TEXT("OpenSCManager error"), TEXT("error"), MB_OK | MB_ICONERROR);
    146         return FALSE;
    147     }
    148 
    149     TCHAR szFilePath[MAX_PATH];
    150     GetModuleFileName(NULL, szFilePath, MAX_PATH);
    151 
    152     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);
    153     if (!schService)
    154     {
    155         CloseServiceHandle(schSCManager);
    156         MessageBox(NULL, TEXT("CreateService error"), TEXT("error"), MB_OK | MB_ICONERROR);
    157         return FALSE;
    158     }
    159 
    160     CloseServiceHandle(schService);
    161     CloseServiceHandle(schSCManager);
    162 
    163     return TRUE;
    164 }
    复制代码

    本程序是开机自动关机的恶搞程序,本人亲自在物理机上测试,在windows server 2008 r2 enterprise版本的系统下测试通过。要解除本恶搞程序对你造成的不便,可以在开机时按F8进入安全模式下删除名字为Shutdown的服务即可。 输入命令: sc delete Shutdown

     
     
     
    标签: Windows服务
  • 相关阅读:
    盒子模型中问题
    outline
    高度自动相等方法
    正则表达式
    绝对定位 相对定位
    replace 使用函数作为第二参数
    float 浮动
    line-height 行高
    元素隐藏
    现代浏览器内部
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3496949.html
Copyright © 2011-2022 走看看