用C/C++創建windows服務程序


轉載:https://blog.csdn.net/chenyujing1234/article/details/8023816

一、演示過程
下方代碼演示了如何使用vs(C/C++)創建windows服務程序

工程文件下載地址:  http://download.csdn.net/download/sooth2008/2759082

 
使用visual studio創建一個win32控制台應用程序,編譯后就OK了。

然后開始->運行->cmd->回車,輸入 sc create test binPath= 編譯成功后的可執行文件的路徑回車就創建了一個服務.

 

 

注意這里的格式,“=”后面是必須空一格的,否則會出現錯誤。  

然后開始->運行->services.msc->回車就可以看到剛剛創建的服務了。

 

 

描述:
        SC 是用於與服務控制管理器和服務進行通信的命令行程序。
用法:
        sc <server> [command] [service name] <option1> <option2>...

        選項 <server> 的格式為 "\\ServerName"
        鍵入 "sc [command]" 可以獲得有關命令的進一步幫助
        命令:
          query-----------查詢服務的狀態,
                          或枚舉服務類型的狀態。
          queryex---------查詢服務的擴展狀態,
                          或枚舉服務類型的狀態。
          start-----------啟動服務。
          pause-----------向服務發送 PAUSE 控制請求。
          interrogate-----向服務發送 INTERROGATE 控制請求。
          continue--------向服務發送 CONTINUE 控制請求。
          stop------------向服務發送 STOP 請求。
          config----------更改服務的配置(永久)。
          description-----更改服務的描述。
          failure---------更改服務失敗時執行的操作。
          failureflag-----更改服務的失敗操作標志。
          sidtype---------更改服務的服務 SID 類型。
          privs-----------更改服務的所需權限。
          qc--------------查詢服務的配置信息。
          qdescription----查詢服務的描述。
          qfailure--------查詢失敗時服務執行的操作。
          qfailureflag----查詢服務的失敗操作標志。
          qsidtype--------查詢服務的服務 SID 類型。
          qprivs----------查詢服務的所需權限。
          delete----------(從注冊表)刪除服務。
          create----------創建服務(將其添加到注冊表)。
          control---------向服務發送控制。
          sdshow----------顯示服務的安全描述符。
          sdset-----------設置服務的安全描述符。
          showsid---------顯示相應於假定名稱的 SID 字符串。
          GetDisplayName--獲取服務的 DisplayName。
          GetKeyName------獲取服務的 ServiceKeyName。
          EnumDepend------枚舉服務的依存關系。
示例:
        sc start MyService
----------------------------------
    實際上sc所完成的功能就是“控制面板.管理工具”中看到的“服務”完成的功能。
在命令行中輸入下面的命令,可以看到詳細語法:
----------------------------------
sc config hlep
----------------------------------
sc config 服務名 start= AUTO    (自動)
sc config 服務名 start= DEMAND  (手動)
sc config 服務名 start= DISABLED(禁用)
    注意:等號后面必須有一個空格。

 

1、啟動服務:
右鍵點擊->啟動 大功告成。(或者在提示建立成功后,可以直接輸入“net start Test” 來啟動服務)

 

此時可以在任務欄管理器中看到這個exe在運行。

PS:該服務每隔5秒往d:/test.txt 寫入一條記錄你的代碼就應該加在srv_core_thread中,當然你也可以添加多個類似srv_core_thread的線程.

在服務停止時我們可以看到D:\下生成了test.txt文檔

 

異常情況:假如啟動服務時提示

 

 


這是因為運行作為服務的應用程序不是按服務的流程寫的。所以運行提示“服務沒有及時響應啟動或控制請求”
 2、停止服務
 

 

3、刪除服務 :
在 "開始->運行->cmd" 中輸入 sc delete TEST

 

 

此時雖然把服務刪除了,但是從->services.msc->還是可以看到test服務的狀態不審“已經啟動".

任務欄管理器上還是有此進程的存在。

 

4、

 


這樣在開機會會自動啟動此服務,經實驗,在XP開機彈出登陸框時,服務已經啟動了。

問題:何時加載這些服務?

答: 請參照我的文章:<<Winlogon、LSASS、Userinit>>

里面有這樣一句“winlogon創建服務控制管理器(SCM)進程(\windows\system32\Services.exe),而SCM進程又依次加載所有被標記為自動-啟動斬服務和設備驅動程序”。

5、在服務啟動時彈出窗口

 

void WINAPI service_main(int argc, char** argv) 
{       
    ServiceStatus.dwServiceType        = SERVICE_WIN32; 
    ServiceStatus.dwCurrentState       = SERVICE_START_PENDING; 
    ServiceStatus.dwControlsAccepted   = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PAUSE_CONTINUE; 
    ServiceStatus.dwWin32ExitCode      = 0; 
    ServiceStatus.dwServiceSpecificExitCode = 0; 
    ServiceStatus.dwCheckPoint         = 0; 
    ServiceStatus.dwWaitHint           = 0;  
    hServiceStatusHandle = RegisterServiceCtrlHandler(_T(SERVICE_NAME), ServiceHandler); 
    if (hServiceStatusHandle==0) 
    {
        DWORD nError = GetLastError();
    }  
    ::MessageBox(NULL, L"Service test start Ok", L"OK", MB_OK);

運行時出現提示:

6、腳本啟動服務

 打開一個Txt,寫上下面的內容,保存“服務名.bat”文

:啟動服務名

echo 啟動服務名

net start 服務名

pause

 

關閉也一樣(打開一個Txt,寫上下面的內容,保存“服務名.bat”文件):

:關閉服務名

echo 關閉服務名

net stop 服務名

pause

@echo off
 
sc.exe create test type= own type= interact start= auto binPath= %CD%\test.exe

 二、代碼

1、不加服務事件

/*******************************************************************************
Written by:   shiyang sun
    First: you can used this code free,absolutely free!
    Second:of course,you can remove this header unconstrained!
    but this header might useful if you sometimes want to kick my ass or praise me.
   Copyright:none
   Get more message on:http://blog.sina.com.cn/lipfreedom
   Address:sunshiyang shenzhen city guangdong province china
   E-mail:zyy6569@163.com
 Create date:2010/10/14
********************************************************************************/
 
#include "stdafx.h"
#include "Windows.h"
 
#define SERVICE_NAME "srv_demo"
 
SERVICE_STATUS ServiceStatus;
SERVICE_STATUS_HANDLE hServiceStatusHandle;
void WINAPI service_main(int argc, char** argv); 
void WINAPI ServiceHandler(DWORD fdwControl);
 
TCHAR szSvcName[80];
SC_HANDLE schSCManager;
SC_HANDLE schService;
int uaquit;
FILE* log;
 
DWORD WINAPI srv_core_thread(LPVOID para)
{   
int i = 0;
for(;;)
{
    if(uaquit)
    {
        break; 
    }
    fprintf(log,"srv_core_thread run time count:%d\n",i++);
    Sleep(5000); 
}    
   return NULL; 
}   
 
 
void WINAPI ServiceHandler(DWORD fdwControl)
{
    switch(fdwControl) 
    {
        case SERVICE_CONTROL_STOP:
        case SERVICE_CONTROL_SHUTDOWN:
        ServiceStatus.dwWin32ExitCode = 0; 
        ServiceStatus.dwCurrentState  = SERVICE_STOPPED; 
        ServiceStatus.dwCheckPoint    = 0; 
        ServiceStatus.dwWaitHint      = 0;
        uaquit= 1;
        //add you quit code here
        if(log != NULL)
            fclose(log);
        break; 
        default:
            return;    
    };
    if (!SetServiceStatus(hServiceStatusHandle,  &ServiceStatus)) 
    { 
        DWORD nError = GetLastError();
    } 
}
 
  
void WINAPI service_main(int argc, char** argv) 
{       
    ServiceStatus.dwServiceType        = SERVICE_WIN32; 
    ServiceStatus.dwCurrentState       = SERVICE_START_PENDING; 
    ServiceStatus.dwControlsAccepted   = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PAUSE_CONTINUE; 
    ServiceStatus.dwWin32ExitCode      = 0; 
    ServiceStatus.dwServiceSpecificExitCode = 0; 
    ServiceStatus.dwCheckPoint         = 0; 
    ServiceStatus.dwWaitHint           = 0;  
    hServiceStatusHandle = RegisterServiceCtrlHandler(_T(SERVICE_NAME), ServiceHandler); 
    if (hServiceStatusHandle==0) 
    {
        DWORD nError = GetLastError();
    }  
    //add your init code here
    log = fopen("d:\\test.txt","w");
    //add your service thread here
    HANDLE task_handle = CreateThread(NULL,NULL,srv_core_thread,NULL,NULL,NULL);
    if(task_handle == NULL)
    {
        fprintf(log,"create srv_core_thread failed\n");
    }
    
    // Initialization complete - report running status 
    ServiceStatus.dwCurrentState       = SERVICE_RUNNING; 
    ServiceStatus.dwCheckPoint         = 0; 
    ServiceStatus.dwWaitHint           = 9000;  
    if(!SetServiceStatus(hServiceStatusHandle, &ServiceStatus)) 
    { 
        DWORD nError = GetLastError();
    } 
 
} 
//do not change main function
int main (int argc, const char *argv[])
{
    SERVICE_TABLE_ENTRY ServiceTable[2];
    
    ServiceTable[0].lpServiceName = _T(SERVICE_NAME);
    ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)service_main;
    
    ServiceTable[1].lpServiceName = NULL;
    ServiceTable[1].lpServiceProc = NULL;
    // 啟動服務的控制分派機線程
    StartServiceCtrlDispatcher(ServiceTable); 
    return 0;
}

2、加服務事件

// ServiceTest.cpp : Defines the entry point for the application.
//
 
#include "stdafx.h"
#include "stdio.h"
#include "tchar.h"
#include <windows.h>
#include<iostream>
using namespace std;
 
 
//定義全局函數變量
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;
 
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();
    }
    else
    {
        if (!::StartServiceCtrlDispatcher(st))
        {
            LogEvent(_T("Register Service Main Function Error!"));
        }
    }
 
    return 0;
}
//*********************************************************
//Functiopn:            Init
//Description:            初始化
//Calls:                main
//Called By:                
//Table Accessed:                
//Table Updated:                
//Input:                
//Output:                
//Return:                
//Others:                
//History:                
//            <author>niying <time>2006-8-10        <version>        <desc>
//*********************************************************
void Init()
{
    hServiceStatus = NULL;
    status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
    status.dwCurrentState = SERVICE_STOPPED;
    status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
    status.dwWin32ExitCode = 0;
    status.dwServiceSpecificExitCode = 0;
    status.dwCheckPoint = 0;
    status.dwWaitHint = 0;
}
 
//*********************************************************
//Functiopn:            ServiceMain
//Description:            服務主函數,這在里進行控制對服務控制的注冊
//Calls:
//Called By:
//Table Accessed:
//Table Updated:
//Input:
//Output:
//Return:
//Others:
//History:
//            <author>niying <time>2006-8-10        <version>        <desc>
//*********************************************************
void WINAPI ServiceMain()
{
    // Register the control request handler
    status.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)
    { 
 
        //新建文件
        FILE * fp0=fopen("c:/tt.txt","a");
        fclose(fp0);
        Sleep(10000);
        i++;
    }
    //
 
    status.dwCurrentState = SERVICE_STOPPED;
    SetServiceStatus(hServiceStatus, &status);
    LogEvent(_T("Service stopped"));
}
 
//*********************************************************
//Functiopn:            ServiceStrl
//Description:            服務控制主函數,這里實現對服務的控制,
//                        當在服務管理器上停止或其它操作時,將會運行此處代碼
//Calls:
//Called By:
//Table Accessed:
//Table Updated:
//Input:                dwOpcode:控制服務的狀態
//Output:
//Return:
//Others:
//History:
//            <author>niying <time>2006-8-10        <version>        <desc>
//*********************************************************
void WINAPI ServiceStrl(DWORD dwOpcode)
{
    switch (dwOpcode)
    {
    case SERVICE_CONTROL_STOP:
        status.dwCurrentState = SERVICE_STOP_PENDING;
        SetServiceStatus(hServiceStatus, &status);
        PostThreadMessage(dwThreadID, WM_CLOSE, 0, 0);
        break;
    case SERVICE_CONTROL_PAUSE:
        break;
    case SERVICE_CONTROL_CONTINUE:
        break;
    case SERVICE_CONTROL_INTERROGATE:
        break;
    case SERVICE_CONTROL_SHUTDOWN:
        break;
    default:
        LogEvent(_T("Bad service request"));
    }
}
//*********************************************************
//Functiopn:            IsInstalled
//Description:            判斷服務是否已經被安裝
//Calls:
//Called By:
//Table Accessed:
//Table Updated:
//Input:
//Output:
//Return:
//Others:
//History:
//            <author>niying <time>2006-8-10        <version>        <desc>
//*********************************************************
BOOL IsInstalled()
{
    BOOL bResult = FALSE;
 
    //打開服務控制管理器
    SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
 
    if (hSCM != NULL)
    {
        //打開服務
        SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_QUERY_CONFIG);
        if (hService != NULL)
        {
            bResult = TRUE;
            ::CloseServiceHandle(hService);
        }
        ::CloseServiceHandle(hSCM);
    }
    return bResult;
}
 
//*********************************************************
//Functiopn:            Install
//Description:            安裝服務函數
//Calls:
//Called By:
//Table Accessed:
//Table Updated:
//Input:
//Output:
//Return:
//Others:
//History:
//            <author>niying <time>2006-8-10        <version>        <desc>
//*********************************************************
BOOL Install()
{
    if (IsInstalled())
        return TRUE;
 
    //打開服務控制管理器
    SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    if (hSCM == NULL)
    {
        MessageBox(NULL, _T("Couldn't open service manager"), szServiceName, MB_OK);
        return FALSE;
    }
 
    // Get the executable file path
    TCHAR szFilePath[MAX_PATH];
    ::GetModuleFileName(NULL, szFilePath, MAX_PATH);
 
    //創建服務
    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);
 
    if (hService == NULL)
    {
        ::CloseServiceHandle(hSCM);
        MessageBox(NULL, _T("Couldn't create service"), szServiceName, MB_OK);
        return FALSE;
    }
 
    ::CloseServiceHandle(hService);
    ::CloseServiceHandle(hSCM);
    return TRUE;
}
 
//*********************************************************
//Functiopn:            Uninstall
//Description:            刪除服務函數
//Calls:
//Called By:
//Table Accessed:
//Table Updated:
//Input:
//Output:
//Return:
//Others:
//History:
//            <author>niying <time>2006-8-10        <version>        <desc>
//*********************************************************
BOOL Uninstall()
{
    if (!IsInstalled())
        return TRUE;
 
    SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
 
    if (hSCM == NULL)
    {
        MessageBox(NULL, _T("Couldn't open service manager"), szServiceName, MB_OK);
        return FALSE;
    }
 
    SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_STOP | DELETE);
 
    if (hService == NULL)
    {
        ::CloseServiceHandle(hSCM);
        MessageBox(NULL, _T("Couldn't open service"), szServiceName, MB_OK);
        return FALSE;
    }
    SERVICE_STATUS status;
    ::ControlService(hService, SERVICE_CONTROL_STOP, &status);
 
    //刪除服務
    BOOL bDelete = ::DeleteService(hService);
    ::CloseServiceHandle(hService);
    ::CloseServiceHandle(hSCM);
 
    if (bDelete)
        return TRUE;
 
    LogEvent(_T("Service could not be deleted"));
    return FALSE;
}
 
//*********************************************************
//Functiopn:            LogEvent
//Description:            記錄服務事件
//Calls:
//Called By:
//Table Accessed:
//Table Updated:
//Input:
//Output:
//Return:
//Others:
//History:
//            <author>niying <time>2006-8-10        <version>        <desc>
//*********************************************************
void LogEvent(LPCTSTR pFormat, ...)
{
    TCHAR    chMsg[256];
    HANDLE  hEventSource;
    LPTSTR  lpszStrings[1];
    va_list pArg;
 
    va_start(pArg, pFormat);
    _vstprintf(chMsg, pFormat, pArg);
    va_end(pArg);
 
    lpszStrings[0] = chMsg;
    
    hEventSource = RegisterEventSource(NULL, szServiceName);
    if (hEventSource != NULL)
    {
        ReportEvent(hEventSource, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, (LPCTSTR*) &lpszStrings[0], NULL);
        DeregisterEventSource(hEventSource);
    }
}

三、

SC與“服務控制器”和已安裝設備通訊。SC.exe 檢索和設置有關服務的控制信息。可以使用 SC.exe 來測試和調試服務程序。可以設置存儲在注冊表中的服務屬性來控制如何在啟動時和作為后台程序運行時啟動服務應用程序。SC.exe 的參數可以配置指定的服務,檢索當前服務的狀態,也可以停止和啟動服務。可以生成批處理文件來調用不同的 SC.exe 命令以自動啟動或關閉服務序列。SC.exe 提供的功能類似於“控制面板”中“管理工具”項中的“服務”。
“dos命令大全”www.daohei.com“dos游戲”

有關命令的語法,請單擊下面任一 sc 命令:

sc boot

表明最近的啟動是否應該存儲為上次已知的正常配置。

語法
sc [ServerName] boot [{bad|OK}]

參數
ServerName
指定服務所在的遠程服務器名稱。名稱必須采用通用的命名慣例 (UNC) 格式("\\\\myserver")。若要在本機上運行 SC.exe,請忽略此參數。
[{bad|OK}] dos命令大全
指定最近的啟動是否錯誤或它是否應該存儲為上次已知的正常配置。
/?
在命令提示符顯示幫助。
范例
下面的范例顯示了如何使用 sc boot 命令:

sc boot ok
sc boot bad

sc config

修改注冊表和“服務控制管理器”數據庫中的服務項的值。

語法
sc [ServerName] config [ServiceName] [type= {own|share|kernel|filesys|rec|adapt|interact type= {own|share}}] [start= {boot|system|auto|demand|disabled}] [error= {normal|severe|critical|ignore}] [binpath= BinaryPathName] [group= LoadOrderGroup] [tag= {yes|no}] [depend= dependencies] [obj= {AccountName|ObjectName}] [displayname= DisplayName] [password= Password]

參數
dos命令大全ServerName
指定服務所在的遠程服務器名稱。名稱必須采用通用的命名慣例(UNC)格式("\\\\myserver")。若要在本機上運行 SC.exe,請忽略此參數。
ServiceName
指定由 getkeyname 操作返回的服務名。
type= {own|share|kernel|filesys|rec|adapt|interact type= {own|share}}
指定該服務類型。 值 說明
own 服務以其自身的進程運行。不與其它服務共享可執行文件。這是默認設置。
share 服務作為共享進程運行。它與其它服務共享一可執行文件。
kernel 驅動程序
filesys 文件系統驅動程序。
rec 文件系統識別驅動器(表示計算機上使用的文件系統)。
adapt 適配器驅動器(表示鍵盤、鼠標、磁盤驅動器這樣的硬件項)。
interact 服務可以與桌面交互作用,接收用戶的輸入。交互服務必須以在 LocalSystem 帳戶下運行。該類型必須與 type= own 或 type= shared(例如, type= interact type= own)結合使用。自身使用 type= interact 將會產生一個無效參數錯誤。

start= {boot|system|auto|demand|disabled}
指定服務的起始類型。 值 說明
boot 由啟動引導程序加載的設備驅動器。
system 在核心初始化過程中啟動的設備驅動器。
auto 每次計算機重新啟動時,甚至沒有人登錄計算機時,都能自動開始的服務。
dos命令大全demand 必須手動啟動的服務。如果沒有指定“start=”,這就默認值。
disabled 不能啟動的服務。要啟動一個禁用的服務,把啟動類型更改為其他值。

error= {normal|severe|critical|ignore}
如果在啟動中,服務器啟動失敗,則指定錯誤的嚴重性。 值 說明
normal 將記錄錯誤,並且顯示消息對話框,通知用戶服務啟動失敗。啟動將會繼續這是默認設置。
severe 記錄錯誤(如果存在)。計算機嘗試以最新的有效配置重新啟動。這可能是由於計算機能夠重新啟動,但服務器卻仍然不能運行。
critical 記錄錯誤(如果存在)。計算機嘗試以最新的有效配置重新啟動。如果上次已知正常的配置失敗,啟動也將失敗,啟動過程就會以“藍屏”錯誤而停止。
ignore 錯誤已記錄,啟動繼續。記錄錯誤超出在事件日志的范圍,不再給用戶作出提示。
dos命令大全
binpath= BinaryPathName
指定一個進入服務二進制文件的路徑。
group= LoadOrderGroup
指定一個該服務為其中成員的組名。組列表儲存在注冊中的 HKLM\\System\\CurrentControlSet\\Control\\ServiceGroupOrder 子項中。默認設置為空值。
tag= {yes | no}
指定是否在“CreateService”調用中獲得 TagID。標記僅用於根啟動或系統啟動驅動程序。
depend= dependencies
指定必須在此項服務之前啟動的服務名或組名。前面斜線 (/) 分離開來的名字。
obj= {AccountName|ObjectName}
指定一個將運行的服務的賬戶名,或指定一個將會運行的驅動程序的 Windows 驅動程序對象名。默認設置為 LocalSystem。
displayname= DisplayName
指定一個可以在用戶界面程序用來為用戶標識服務的友好的、有意義的名稱。例如,一項服務的子項名是對用戶沒有幫助的 wuauserv,而顯示的名稱是“自動更新”。
password:password
指定一個密碼。如果使用了一個不是 LocalSystem 的帳戶,則此項是必需的。
/?
dos命令大全在命令提示符顯示幫助。
注釋
如果參數及其值之間沒有空格,(例如,是 type= own, 而不是 type=own),則操作會失敗。
范例
下面范例顯示了如何使用 sc config 命令:

sc config NewService binpath= "ntsd -d c:\\windows\\system32\\NewServ.exe"

sc continue

為了繼續暫停的服務,要給服務發送一個 CONTINUE 控制請求。

語法
sc [ServerName] continue [ServiceName]

參數
ServerName
指定服務所在的遠程服務器名稱。該名稱必須使用 UNC 格式 ("\\\\myserver")。若要在本機上運行 SC.exe,請忽略此參數。
ServiceName
指定由 getkeyname 操作返回的服務名。
/?
在命令提示符顯示幫助。
注釋
使用 continue 操作來繼續暫停的服務。
范例
下面的范例顯示了如何使用 sc continue 命令:
dos命令大全
sc continue tapisrv

sc control

發送給服務CONTROL B。

語法
sc [ServerName] control [ServiceName] [{paramchange|netbindadd|netbindremove|netbindenable|netbinddisable|UserDefinedControlB}]

參數
ServerName
指定服務所在的遠程服務器名稱。該名稱必須使用 UNC 格式 ("\\\\myserver")。若要在本機上運行 SC.exe,請忽略此參數。
ServiceName
指定由 getkeyname 操作返回的服務名。
{paramchange|netbindadd|netbindremove|netbindenable|netbinddisable|UserDefinedControlB}
指定要發送到服務的控制。
/?
在命令提示符顯示幫助。
sc create

為服務在注冊表和“服務控制管理器”中創建子項和入口。

語法
sc [ServerName] create [ServiceName] [type= {own|share|kernel|filesys|rec|adapt|interact type= {own|share}}] [start= {boot|system|auto|demand|disabled}] [error= {normal|severe|critical|ignore}] [binpath= BinaryPathName] [group= LoadOrderGroup] [tag= {yes|no}] [depend= dependencies] [obj= {AccountName|ObjectName}] [displayname= DisplayName] [password= Password]dos命令大全

參數
ServerName
指定服務所在的遠程服務器名稱。該名稱必須使用 UNC 格式 ("\\\\myserver")。若要在本機上運行 SC.exe,請忽略此參數。
ServiceName
指定由 getkeyname 操作返回的服務名。
type= {own|share|kernel|filesys|rec|adapt|interact type= {own|share}}
指定該服務類型。默認類型為 type= own。值 說明
own 服務以其自身的進程運行。不與其它服務共享可執行文件。這是默認設置。
share 服務作為共享進程運行。它與其它服務共享一可執行文件。
kernel 驅動程序
filesys 文件系統驅動程序。
rec 文件系統識別驅動器(表明在計算機上使用的文件系統)。
interact 服務可以與桌面交互作用,接收用戶的輸入。交互服務必須以在 LocalSystem 帳戶下運行。該類型必須與 type= own 或 type= shared(例如, type= interact type= own)結合使用。自身使用 type= interact 將會產生一個無效參數錯誤。
dos命令大全
start= {boot|system|auto|demand|disabled}
指定服務的起始類型。默認的起始類型是 start= demand。boot 由啟動引導程序加載的設備驅動器。
system 在核心初始化過程中啟動的設備驅動器。
auto 每次計算機重新啟動時,甚至沒有人登錄計算機時,都能自動開始的服務。
demand 必須手動啟動的服務。如果沒有指定“start=”,這就默認值。
disabled 不能啟動的服務。要啟動一個禁用的服務,把啟動類型更改為其他值。

error= {normal|severe|critical|ignore}
如果在啟動中,服務器啟動失敗,則指定錯誤的嚴重性。默認設置為 ascii。normal 將記錄錯誤,並且顯示消息對話框,通知用戶服務啟動失敗。啟動將會繼續這是默認設置。
severe 記錄錯誤(如果存在)。計算機嘗試以最新的有效配置重新啟動。這可能是由於計算機能夠重新啟動,但服務器卻仍然不能運行。
critical 記錄錯誤(如果存在)。計算機嘗試以最新的有效配置重新啟動。如果上次已知正常的配置失敗,啟動也將失敗,啟動過程就會以“藍屏”錯誤而停止。 dos命令大全
ignore 錯誤已記錄,啟動繼續。記錄錯誤超出在事件日志的范圍,不再給用戶作出提示。

binpath= BinaryPathName
指定一個進入服務二進制文件的路徑。binpath= 沒有默認值,必須要給出此字符串。
group= LoadOrderGroup
指定一個該服務為其中成員的組名。組列表儲存在注冊中的 HKLM\\System\\CurrentControlSet\\Control\\ServiceGroupOrder 子項中。默認設置為空值。
/hidden:{yes | no}
指定是否在“CreateService”調用中獲得 TagID。標記僅用於根啟動或系統啟動驅動程序。
depend= dependencies
指定必須要在此項服務之前啟動的服務名或組名。前面斜線 (/) 分離開來的名字。
obj= {Ados命令大全ccountName|ObjectName}
指定一個將運行的服務的賬戶名,或指定一個將會運行的驅動程序的 Windows 驅動程序對象名。
displayname= DisplayName
指定被用戶界面程序用來標識服務的友好名稱。
password:password
指定一個密碼。如果使用的不是 LocalSystem 的帳戶,密碼是必需的。
/?
在命令提示符顯示幫助。
注釋
如果參數及其值之間沒有空格,(例如,是 type= own, 而不是 type=own),則操作會失敗。
范例
下面的范例顯示了如何使用 sc create 命令:
dos命令大全
sc \\\\myserver create NewService binpath= c:\\windows\\system32\\NewServ.exe
sc create NewService binpath= c:\\windows\\system32\\NewServ.exe type= share start= auto depend= "+TDI Netbios"

sc delete

從注冊表中刪除服務子項。如果服務正在運行或者另一個進程有一個該服務的打開句柄,那么為了刪除而標記該服務。

語法
sc [ServerName] delete [ServiceName]

參數
ServerName
指定服務所在的遠程服務器名稱。該名稱必須使用 UNC 格式 ("\\\\myserver")。若要在本機上運行 SC.exe,請忽略此參數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM