程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 木馬編程天天練 進入第3天 服務管理

木馬編程天天練 進入第3天 服務管理

編輯:.NET實例教程

服務函數

下面的函數用於被服務執行或者使用

函數            描述

Handler            An application-defined callback function used with the RegisterServiceCtrlHandler function.
HandlerEx    
RegisterServiceCtrlHandler    注冊一個函數處理控制碼請求。
RegisterServiceCtrlHandlerEx    
ServiceMain    服務程序入口函數。
SetServiceBits    Registers a service type with the service control manager and the Server service.
SetServiceStatus    Updates the service control manager's status information for the calling service.
StartServiceCtrlDispatcher    Connects the main thread of a service process to the service control manager.



下面的函數被用於管理和配置服務

函數            描述

ChangeServiceConfig    改變服務的開機運行狀態。
ChangeServiceConfig2    改變服務的描述。
CloseServiceHandle    關閉服務句柄。
ControlService            在一個服務已經被開啟的情況下,向這個服務發出控制碼。 
ControlServiceEx     
CreateService    創建一個服務對象,並增加它到服務控制管理數據庫。
DeleteService    在服務控制管理數據庫中標示要刪除的服務。
EnumDependentServices    獲取服務管理數據庫中所有服務的名稱和當前狀態。
EnumServicesStatusEx    
GetServiceDisplayName    獲取服務的描述。
GetServiceKeyName    Retrieves the service name of the specifIEd service.
NotifyBootConfigStatus    Reports the boot status to the service control manager.
NotifyServiceStatusChange    Enables an application to receive notification when the specifIEd service is created or 

deleted or when its status changes.
OpenSCManager    和指定機器的服務控制管理器建立連接並打開服務控制管理器數據庫。 
OpenService    打開一個存在的服務。
QueryServiceConfig    
QueryServiceConfig2    
QueryServiceObjectSecurity    RetrIEves a copy of the security descriptor associated with a service object.
QueryServiceStatusEx    查詢服務程序現在的運行狀態。
SetServiceObjectSecurity    Sets the security descriptor of a service object.
StartService    開啟一個服務。

廢棄函數

下面的函數已經被廢棄。

    EnumServicesStatus
    LockServiceDatabase
    QueryServiceLockStatus
    QueryServiceStatus
    UnlockServiceDatabase

Build date: 12/3/2009

程序例子:

#include<Windows.h>
#include&lt;stdio.h>

bool Start_Service(wchar_t * ServiceName);
bool Stop_Service(wchar_t * ServiceName);
bool Create_Service(wchar_t * ServiceName);
bool Delete_Service(wchar_t * ServiceName);
void ReconfigureService(wchar_t * ServiceName, wchar_t * ServiceDes); 
void  ChangeServiceRun(wchar_t * ServiceName);
void EnumService(void);

int main()
{
    wchar_t * ServiceDisp = L"快速緩存服務,為網絡文件交換提供緩存,提高網絡連接速度。";
    //Start_Service(L"WmdmPmSN");
    //Stop_Service(L"WmdmPmSN");
    //Create_Service(L"ServiceTest");
    //Delete_Service(L"ServiceTest");
    //ReconfigureService(L"ServiceTest",ServiceDisp);
    ChangeServiceRun(L"WmdmPmSN");
    EnumService();
    return 0;
}

bool Start_Service(wchar_t * ServiceName)
{
    SC_HANDLE schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_Access);
    if(NULL != schSCManager)
    {
        // L"WmdmPmSN"
        SC_HANDLE schService = OpenService(schSCManager,ServiceName,SERVICE_ALL_Access);
        if( NULL != schService)
        {
            if(StartService(schService,0,NULL))
            {
                CloseServiceHandle(schService);
                CloseServiceHandle(schSCManager);
                return 1;
            }
            CloseServiceHandle(schService);
            CloseServiceHandle(schSCManager);
            wprintf(L"Start Service failed!\n");
            return 0;
        }
        CloseServiceHandle(schSCManager);
        wprintf(L"Open Service failed!\n");
        return 0;
    }&n
bsp;   
    wprintf(L"OpenSCManager failed!\n");
    CloseServiceHandle(schSCManager);
    return 0;
}

bool  Stop_Service(wchar_t * ServiceName)
{
    SC_HANDLE schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_Access);
    if(NULL != schSCManager)
    {
        // L"WmdmPmSN"
        SC_HANDLE schService = OpenService(schSCManager,ServiceName,SERVICE_ALL_Access);
        if( NULL != schService)
        {
            SERVICE_STATUS ServiceStatus;
            if(ControlService(schService,SERVICE_CONTROL_STOP,&ServiceStatus))
            {
                CloseServiceHandle(schService);
                CloseServiceHandle(schSCManager);
                return 1;
            }
            CloseServiceHandle(schService);
            CloseServiceHandle(schSCManager);
            wprintf(L"Start Service failed!\n");
            return 0;
        }
        CloseServiceHandle(schSCManager);
        wprintf(L"Open Service failed!\n");
        return 0;
    }    
    wprintf(L"OpenSCManager failed!\n");
    CloseServiceHandle(schSCManager);
    return 0;
    
}

bool Create_Service(wchar_t * ServiceName)
{
    SC_HANDLE schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_Access);
    if(NULL != schSCManager)
    {
        wchar_t * DisplayName = L"Service Program Test\n";
        wchar_t * FilePathName
= L"d:\\cyuyan\\servicetest.exe";
        SC_HANDLE schService = CreateService(
            schSCManager,
            ServiceName,
            DisplayName,
            SC_MANAGER_ALL_Access,
            SERVICE_WIN32_OWN_PROCESS,
            SERVICE_AUTO_START,
            SERVICE_ERROR_IGNORE,
            FilePathName,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL);
        if(schService != NULL)
        {
            CloseServiceHandle(schService);
            CloseServiceHandle(schSCManager);
            return 1;
        }
        else
        {
            CloseServiceHandle(schSCManager);
            return 0;
        }
    }
    else
        return 0;    
}

bool Delete_Service(wchar_t * ServiceName)
{
    SC_HANDLE schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_Access);
    if(NULL != schSCManager)
    {
        // L"WmdmPmSN"
        SC_HANDLE schService = OpenService(schSCManager,ServiceName,SERVICE_ALL_Access);
        if( NULL != schService)
        {
            SERVICE_STATUS ServiceStatus;
     QueryServiceStatus(schService,&ServiceStatus);
            if(ServiceStatus.dwCurrentState != SERVICE_STOPPED)
            {
                ControlService(schService,SERVICE_CONTROL_STOP,&ServiceStatus);    
            }
            DeleteService(schService);
            CloseServiceHandle(schService);
            CloseServiceHandle(schSCManager);
            return 1;
        }
        else
            wprintf(L"Open Service failed!\n");
            return 0;
    }    
    else
    {
        wprintf(L"OpenSCManager failed!\n");
        CloseServiceHandle(schSCManager);
        return 0;
    }
}



void ReconfigureService(wchar_t * ServiceName, wchar_t * ServiceDisp) 

  SC_HANDLE schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_Access);
  if (schSCManager != NULL)
  {
    // Need to acquire database lock before reconfiguring. 
    SC_LOCK sclLock = LockServiceDatabase(schSCManager); 
    if (sclLock != NULL) 
    { 
      // Open a handle to the service. 
      SC_HANDLE schService = OpenService( 
          schSCManager,           // SCManager database 
          ServiceName,            // name of service 
          SERVICE_CHANGE_CONFIG); // need CHANGE Access 
   
      if (schService != NULL) 
      {
         &
nbsp;SERVICE_DESCRIPTION sdBuf;
          sdBuf.lpDescription = ServiceDisp;
          if (ChangeServiceConfig2(schService, SERVICE_CONFIG_DESCRIPTION, &sdBuf))
          {
             MessageBox(NULL,L"Change SUCCESS",L" ",MB_OK); 
          }
          CloseServiceHandle(schService); 
      }
      UnlockServiceDatabase(sclLock); 
    }   
    CloseServiceHandle(schSCManager); 
  }
}


void  ChangeServiceRun(wchar_t * ServiceName)
{
    SC_HANDLE schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_Access);
    if(NULL != schSCManager)
    {
        // L"WmdmPmSN"
        SC_HANDLE schService = OpenService(schSCManager,ServiceName,SERVICE_ALL_Access);
        if( NULL != schService)
        {
            if(ChangeServiceConfig(
                schService,
                SERVICE_NO_CHANGE,
                SERVICE_AUTO_START,
                SERVICE_NO_CHANGE,
                NULL,
                NULL,
                NULL,
                NULL,
                NULL,
                NULL,
                NULL))
            {
                wprintf
(L"Change Service done!\n");
                return;
            }
            CloseServiceHandle(schService);
            CloseServiceHandle(schSCManager);
        }
        wprintf(L"Open Service failed!\n");
    }    
    wprintf(L"OpenSCManager failed!\n");
    CloseServiceHandle(schSCManager);
}

void EnumService(void)
{
    LPENUM_SERVICE_STATUS st;
    st=(LPENUM_SERVICE_STATUS)LocalAlloc(LPTR,64*1024);
    DWord ret=0;
    DWord size=0;
    SC_HANDLE sc=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_Access);

    EnumServicesStatus(sc,SERVICE_WIN32,SERVICE_STATE_ALL, (LPENUM_SERVICE_STATUS)st,1024*64,&size,&ret,NULL);


    for(int i=0;i<ret;i++){
        wprintf(L"%-20s%-50s",st[i].lpServiceName,st[i].lpDisplayName);
        switch(st[i].ServiceStatus.dwCurrentState){
    case(SERVICE_RUNNING):
        wprintf(L"running\n");
        break;
    case(SERVICE_STOPPED):
        wprintf(L"stopped\n");
        break;

        }
    }
}



本文來自CSDN博客,轉載請標明出處:http://blog.csdn.Net/armor51/archive/2009/12/17/5027209.ASPx
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved