首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

Windows NT服務程序開發完整指南

     編輯:VC 教學

服務程序核心特性

Windows服務(Service)無需用戶登錄即可在後台運行,支援開機自啟、暫停/繼續、事件日誌記錄,是FTP、數據庫、監控類程序的標準部署形態。

關鍵API函數詳解

1. 服務控制管理器連接

SC_HANDLE OpenSCManager(
    LPCTSTR lpMachineName,    // 目標計算機,NULL為本機
    LPCTSTR lpDatabaseName,   // 數據庫類別,通常為SERVICES_ACTIVE_DATABASE
    DWORD dwDesiredAccess     // 權限:SC_MANAGER_CREATE_SERVICE等
);

2. 服務創建與配置

SC_HANDLE CreateService(
    SC_HANDLE hSCManager,
    LPCTSTR lpServiceName,    // 服務內部名稱
    LPCTSTR lpDisplayName,    // 顯示名稱
    DWORD dwDesiredAccess,    // SERVICE_ALL_ACCESS
    DWORD dwServiceType,      // SERVICE_WIN32_OWN_PROCESS
    DWORD dwStartType,        // SERVICE_AUTO_START自動啟動
    DWORD dwErrorControl,     // SERVICE_ERROR_NORMAL
    LPCTSTR lpBinaryPathName, // 可執行文件完整路徑
    LPCTSTR lpLoadOrderGroup,
    LPDWORD lpdwTagId,
    LPCTSTR lpDependencies,   // 依賴服務組,雙重空字符結尾
    LPCTSTR lpServiceStartName, // 啟動賬戶:LocalSystem/用戶賬戶
    LPCTSTR lpPassword        // 賬戶密碼
);

3. 服務主程序入口結構

void WINAPI ServiceMain(DWORD dwArgc, LPTSTR* lpszArgv) {
    // 1. 註冊控制處理器
    hStatus = RegisterServiceCtrlHandler(szServiceName, HandlerEx);
    // 2. 設置狀態:SERVICE_START_PENDING
    SetServiceStatus(hStatus, &ssStatus);
    // 3. 初始化資源(線程、Socket、資料庫連接等)
    // 4. 設置狀態:SERVICE_RUNNING
    ssStatus.dwCurrentState = SERVICE_RUNNING;
    SetServiceStatus(hStatus, &ssStatus);
    // 5. 工作線程循環或等待事件
    WaitForSingleObject(hStopEvent, INFINITE);
    // 6. 清理並設置SERVICE_STOPPED
}

4. 控制處理器實現

DWORD WINAPI HandlerEx(DWORD dwControl, DWORD dwEventType, 
                       LPVOID lpEventData, LPVOID lpContext) {
    switch (dwControl) {
        case SERVICE_CONTROL_STOP:
            ssStatus.dwCurrentState = SERVICE_STOP_PENDING;
            SetServiceStatus(hStatus, &ssStatus);
            SetEvent(hStopEvent);  // 通知主線程退出
            return NO_ERROR;
        case SERVICE_CONTROL_PAUSE:
            // 暫停業務邏輯
            break;
        case SERVICE_CONTROL_CONTINUE:
            // 恢復業務邏輯
            break;
        case SERVICE_CONTROL_INTERROGATE:
            // 查詢狀態
            break;
    }
    return NO_ERROR;
}

安裝與調試技巧

  • 使用sc create命令行工具快速註冊服務
  • 主程序支持-install/-remove/-debug參數,-debug下作為控制台程序運行便於調試
  • 事件查看器Applications and Services Logs查看服務啟動/錯誤日誌
  • 依賴Netman(網絡連接管理器)確保網絡就緒後再啟動

安全加固建議

  1. 最小權限原則:使用專用服務賬戶而非LocalSystem
  2. 啟用服務SID(SERVICE_SID_TYPE_UNRESTRICTED)隔離資源訪問
  3. 設置SERVICE_LAUNCH_PROTECTED防止非簽名代碼注入
  4. 定期審計服務二進制文件完整性(Authenticode簽名驗證)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved