SC命令使用(創建window服務等)

//1 sc語法

作爲一個命令行工具,SC.exe可以用來測試你自己的系統,你可以設置一個批處理文件來使用不同的參數調用 SC.exe來控制服務。這個很有用,如果你想看看你的服務不斷的啓動和停止,我沒有試過哦!讓一個服務一下子 打開,一下子關閉,聽上去很不錯的。如果你的服務進程裏面有多個進程的話,你可以保持一個進程繼續運行不 讓它走開,然後讓另一個不斷的打開在關閉,還可以尋找一下內存缺乏導致不完全清楚的證據。
   

下面介紹SC,SC QC,and SC QUERY 
SC使用這樣的語法:
    1. SC [Servername] command Servicename [Optionname= Optionvalues]

    2. SC [command]

這裏使用第一種語法使用SC,使用第二種語法顯示幫助。

下面介紹各種參數。

Servername
    可選擇:可以使用雙斜線,如\\\\myserver,也可以是\\\\192.168.0.1來操作遠程計算機。如果在本地計算機上操作

就不用添加任何參數。

Command 
    下面列出SC可以使用的命令。

config----改變一個服務的配置。(長久的)

continue--對一個服務送出一個繼續控制的要求。

control----對一個服務送出一個控制。

create----創建一個服務。(增加到註冊表中)

delete----刪除一個服務。(從註冊表中刪除)

EnumDepend--列舉服務的從屬關係。

GetDisplayName--獲得一個服務的顯示名稱。

GetKeyName--獲得一個服務的服務鍵名。

interrogate--對一個服務送出一個詢問控制要求。

pause----對一個服務送出一個暫停控制要求。

qc----詢問一個服務的配置。

query----詢問一個服務的狀態,也可以列舉服務的狀態類型。

start----啓動一個服務。

stop----對一個服務送出一個停止的要求。

Servicename
    在註冊表中爲service key制定的名稱。注意這個名稱是不同於顯示名稱的(這個名稱可以用net start和服務控

制面板看到),而SC是使用服務鍵名來鑑別服務的。

Optionname 
    這個optionname和optionvalues參數允許你指定操作命令參數的名稱和數值。注意,這一點很重要在操作名稱和等

號之間是沒有空格的。一開始我不知道,結果………………,比如,start=optionvalues,這個很重要。 optionvalues可以是0,1,或者是更多的操作參數名稱和數值對。
    如果你想要看每個命令的可以用的optionvalues,你可以使用sc command這樣的格式。這會爲你提供詳細的幫助。

Optionvalues
    爲optionname的參數的名稱指定它的數值。有效數值範圍常常限制於哪一個參數的optionname。如果要列表請用

sc command來詢問每個命令。

Comments
    很多的命令需要管理員權限,所以我想說,在你操作這些東西的時候最好是管理員。呵呵!

    當你鍵入SC而不帶任何參數時,SC.exe會顯示幫助信息和可用的命令。當你鍵入SC緊跟着命令名稱時,你可以得 到一個有關這個命令的詳細列表。比如,鍵入sc create可以得到和create有關的列表。但是除了一個命令,sc query,這會導出該系統中當前正在運行的所有服務和驅動程序的狀態。

    當你使用start命令時,你可以傳遞一些參數(arguments)給服務的主函數,但是不是給服務進程的主函數。

SC create
    這個命令可以在註冊表和服務控制管理數據庫建立一個入口。

語法1
    sc [servername] create Servicename [Optionname= Optionvalues]

    這裏的servername,servicename,optionname,optionvalues和上面的一樣,這裏就不多說了。這裏我們詳細說 明一下optionname和optionvalues。

Optionname--Optionvalues
描述

type=----own, share, interact, kernel, filesys
關於建立服務的類型,選項值包括驅動程序使用的類型,默認是share。

start=----boot, sys tem, auto, demand, disabled
關於啓動服務的類型,選項值包括驅動程序使用的類型,默認是demand(手動)。

error=----normal, severe, critical, ignore
當服務在導入失敗錯誤的嚴重性,默認是normal。

binPath=--(string)
服務二進制文件的路徑名,這裏沒有默認值,這個字符串是必須設置的。

group=----(string)
這個服務屬於的組,這個組的列表保存在註冊表中的ServiceGroupOrder下。默認是nothing。

tag=----(string)
如果這個字符串被設置爲yes,sc可以從CreateService call中得到一個tagId。然而,SC並不顯示這個標籤,所

以使用這個沒有多少意義。默認是nothing

depend=----(space separated string)有空格的字符串。
在這個服務啓動前必須啓動的服務的名稱或者是組。

obj=----(string)
賬號運行使用的名稱,也可以說是登陸身份。默認是localsys tem

Displayname=--(string)
一個爲在用戶界面程序中鑑別各個服務使用的字符串。

password=--(string)
一個密碼,如果一個不同於localsys tem的賬號使用時需要使用這個。

Optionvalues
    Optionname參數名稱的數值列表。參考optionname。當我們輸入一個字符串時,如果輸入一個空的引用這意味着

一個空的字符串將被導入。

Comments
    The SC CREATE command perFORMs the operations of the CreateService API function.
    這個sc create命令執行CreateService API函數的操作。詳細請見CreateService。

    例1
    下面這個例子在一臺叫做(\\\\myserver)的計算機上爲一個叫“NewService”的服務建立的一個註冊表登記。
sc \\\\myserver create NewService binpath= c:\\winnt\\sys tem32\\NewServ.exe

    按照默認,這個服務會建立一個WIN32_SHARE_PROCESS使用SERVICE_DEMAND_START啓動方式。這將不會有任何從屬

關係,也將會按照localsys tem安全上下關係來運行。

    例2
    下面這個例子將在本地計算機上,建立一個服務,它將會是一個自動運行服務,並且運行在他自己的進程上。它

從屬於TDI組和NetBios服務上。注意,你必須在從屬中間增加一個空格的引用。

sc create NewService binpath= c:\\winnt\\sys tem32\\NewServ.exe type= own
start= auto depend= \'+TDI Netbios\'

    例3
    服務開發者可以通過臨時改變二進制路徑(影像路徑)的方式來將這個服務運行在內核調試器的上下關係中。下 面這個例子就可以讓我們看到如何改變服務的配置。

sc config NewService binpath= \'ntsd -d c:\\winnt\\sys tem32\\Newserv.exe\'
這個例子會引起服務控制管理器調用ntsd.exe使用下例的參數字符串:
\'-d c:\\nt\\sys tem32\\NewServ.exe\'

當系統裝入newserv.exe時ntsd將會轉而打斷調試器,所以斷點可以被設置在服務代碼裏。

SC QC
這個SC QC“詢問配置”命令可以列出一個服務的配置信息和QUERY_SERVICE_CONFIG結構。

語法1
sc [Servername] qc Servicename [Buffersize]

Parameters
servername和servicename前面已經介紹過了,這裏不再多說。

Buffersize,可選擇的,列出緩衝區的尺寸。

Comments

SC QC命令顯示了QUERY_SERVICE_CONFIG結構的內容。

以下是QUERY_SERVICE_CONFIG相應的區域。
TYPE------dwServiceType
START_TYPE----dwStartType
ERROR_CONTROL----dwErrorControl
BINARY_PATH_NAME--lpBinaryPathName
LOAD_ORDER_GROUP--lpLoadOrderGroup
TAG------dwTagId
DISPLAY_NAME----lpDisplayName
DEPENDENCIES----lpDependencies
SERVICE_START_NAME--lpServiceStartName

例1

下面這個例子詢問了在上面例子中建立的“NewService”服務的配置:

sc \\\\myserver qc NewService

sc顯示下面的信息:

SERVICE_NAME: NewService
TYPE : 20 WIN32_SHARE_PROCESS
START_TYPE : 3 DEMAND_START
ERROR_CONTROL : 1 NORMAL
BINARY_PATH_NAME : c:\\winnt\\sys tem32\\NewServ.exe
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : NewService
DEPENDENCIES :
SERVICE_START_NAME : Localsys tem

NewService有能力和其他的服務共享一個進程。但是它不是自動啓動的。二進制文件名是NewServ.exe。這個服務

不依靠與其它的的服務,而且運行在lcoalsys tem的安全上下關係中。這些都是調用QueryServiceStatus基本的返

回,如果還需要更多的細節屆時,可以看看API函數文件。

SC QUERY

SC QUERY命令可以獲得服務的信息。

語法:
sc [Servername] query { Servicename | Optionname= Optionvalues... }

參數:

servername, servicename, optionname, optionvalues不在解釋。只談一下這個命令提供的數值。

Optionname--Optionvalues
Description

type=----driver, service, all
列舉服務的類型,默認是service

state=----active, inactive, all
列舉服務的狀態,默認是active

bufsize=--(numeric values)
列舉緩衝區的尺寸,默認是1024 bytes

ri=----(numeric values)
但開始列舉時,恢復指針的數字,默認是0

Optionvalues
同上。

Comments

SC QUERY命令可以顯示SERVICE_STATUS結構的內容。

下面是SERVICE_STATUS結構相應的信息:
TYPE------dwServiceType
STATE------dwCurrentState, dwControlsAccepted
WIN32_EXIT_CODE----dwWin32ExitCode
SERVICE_EXIT_CODE--dwServiceSpecificExitCode
CHECKPOINT----dwCheckPoint
WAIT_HINT----dwWaitHint

在啓動計算機後,使用SC QUERY命令會告訴你是否,或者不是一個啓動服務的嘗試。如果這個服務成功啓動,WIN32_EXIT_CODE區間會將會包含一個0,當嘗試不成功時,當它意識到這個服務不能夠啓動時,這個區間也會提供一個退出碼給服務。

例子

查詢“NewService\'服務狀態,鍵入:

sc query NewService

顯示一下信息:

SERVICE_NAME: NewService
TYPE : 20 WIN32_SHARE_PROCESS
STATE : 1 STOPPED
(NOT_STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 1077 (0x435)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0

注意,這裏存在一個給這個服務的退出碼,即使這個服務部不在運行,鍵入net helpmsg 1077,將會得到對1077錯誤信息的說明:

上次啓動之後,仍未嘗試引導服務。

所以,這裏我想說一句,希望大家可以活用net helpmsg,這會對你的學習有很大的幫助。

下面在對SC query的命令在說明一下:

列舉活動服務和驅動程序狀態,使用以下命令:
sc query

顯示messenger服務,使用以下命令:
sc query messenger

只列舉活動的驅動程序,使用以下命令:
sc query type= driver

列舉Win32服務,使用以下命令:
sc query type= service

列舉所有的服務和驅動程序,使用以下命令:
sc query state= all

用50 byte的緩衝區來進行列舉,使用以下命令:
sc query bufsize= 50

在恢復列舉時使用index=14,使用以下命令:
sc query ri=14

列舉所有的交互式服務,使用以下命令:
sc query type= service type= interact

好了,說到這裏。SC命令基本上已經說完了。

//2 sc.exe命令功能列表:

1.更改服務的啓動狀態(這是比較有用的一個功能)   

2.刪除服務(除非對自己電腦的軟、硬件所需的服務比較清楚,否則不建議刪除任何系統服務,特別是基礎服務)   

3.停止或啓動服務(功能上類似於net stop/start,但速度更快且能停止的服務更多)

具體的命令格式如下:  

修改服務啓動類型的命令行格式爲(特別注意start=後面有一個空格)   

sc config 服務名稱 start= demand(設置服務爲手動啓動)   

sc config 服務名稱 start= disabled(設置服務爲禁用)   

停止/啓動服務的命令行格式爲   

sc stop/start 服務名稱   

注意:平時常接觸的都是服務的顯示名稱,而以上所指是服務名稱,都可以在控制面板->管理工具->服務裏面,雙擊對應的服務來查詢。   

先舉例說明一下具體的設置方法:   

如設置遠程註冊表服務爲手動其格式爲   

sc config RemoteRegistry start= demand   

設爲禁用的格式爲:

sc config RemoteRegistry start= disabled   

停止服務則格式爲:   

sc stop RemoteRegistry   

首先把自己所需設置的服務名稱查到之後,按照上面的格式做成批處理文件,重裝系統之後只要運行批處理文件即可。   

以下是我的設置,以XpSp2爲藍本,可比對所用的系統進行增刪和修改。注:未加入XpSp2的自動更新、安全中心、防火牆。 

sc config Alerter start= demand   

sc config TrkWks start= demand   

sc config helpsvc start= demand   

sc config policyAgent start= demand   

sc config dmserver start= demand   

sc config WmdmpmSn start= demand   

sc config Spooler start= demand   

sc config RemoteRegistry start= demand   

sc config NtmsSvc start= demand   

sc config seclogon start= demand   

sc config Schedule start= demand   

sc config WebClient start= demand   

sc config W32Time start= demand   

sc config WZCSVC start= demand

sc config ERSvc start= demand   

sc config Themes start= demand   

sc config FastUserSwitchingCompatibility start= disabled   

sc config Messenger start= disabled   

sc config protectedStorage start= disabled

sc config SSDpSRV start= disabled   

sc config TermService start= disabled   

sc config ShellHWDetection start= disabled   

如果需要立即關閉服務也可把以下代碼跟在上面的代碼之後

sc stop W32Time   

sc stop ShellHWDetection   

sc stop TrkWks

sc stop helpsvc

sc stop dmserver

sc stop policyAgent   

sc stop Spooler   

sc stop RemoteRegistry   

sc stop seclogon   

sc stop Schedule   

sc stop WZCSVC

sc stop ERSvc   

sc stop Themes   

sc stop FastUserSwitchingCompatibility   

sc stop protectedStorage   

sc stop SSDpSRV   

sc stop WebClient   

最後把修改好之後的代碼存爲services.cmd,在以後進行服務設置時,直接運行事先保存好的批處理文件就可以做到事半功倍了。   

看到這裏,使用Win2000的朋友也不必失望,sc.exe這個命令行工具對Win2000同樣適用,可從裝有WinXp或者Win2003的機器裏面拷貝sc.exe文件,與保存好的批處理文件放在一起,然後執行批處理文件即可。   

對註冊表比較熟悉的朋友可能會想到用註冊表來設置服務的啓動類型,這也是一種可行的方法,本身卻有着內在不足。原因是服務啓動類型在註冊表中對應的鍵值較長且分散,進行整理不方便直觀且易錯漏,所以這種方法比較適用於無人值守的安裝時使用。

//3  使用SC命令時注意事項

Windows 2003 Server存在一個sc命令,(好像Windows 2000/XP/NT都有這個。)該命令可以手工創建Windows服務(NT Service)

以下是微軟幫助文件中對sc命令的描述:

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

其他命令選項可以自己查幫助,主要看看create和delete這兩條我們常用的命令

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]

參數
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 將會產生一個無效參數錯誤。

 

start= {boot | system | auto | demand | disabled} 
指定服務的啓動類型。默認的啓動類型是 start= demand。 
boot
由啓動引導程序加載的設備驅動器。

system
在覈心初始化過程中啓動的設備驅動器。

auto
每次計算機重新啓動時,甚至沒有人登錄計算機時,都能自動開始的服務。

demand
必須手動啓動的服務。如果沒有指定 start=,這就默認值。

disabled
不能啓動的服務。要啓動一個禁用的服務,把啓動類型更改爲其他值。

 

error= {normal | severe | critical | ignore} 
如果在啓動中,服務器啓動失敗,則指定錯誤的嚴重性。默認設置爲 ascii。 
normal
將記錄錯誤,並且顯示消息對話框,通知用戶服務啓動失敗。啓動將繼續。這是默認設置。

severe
記錄錯誤(如果存在)。計算機嘗試以最新的有效配置重新啓動。這可能導致計算機能夠重新啓動,但服務器卻仍然不能運行。

critical
記錄錯誤(如果存在)。計算機嘗試以最新的有效配置重新啓動。如果上次已知正確的配置失敗,啓動也將失敗,啓動過程就會以“藍屏”錯誤而停止。

ignore
錯誤已記錄,啓動繼續。記錄錯誤超出在事件日誌的範圍,不再給用戶作出提示。

 

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

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,請忽略此參數。 
ServiceName 
指定由 getkeyname 操作返回的服務名。 
/? 
在命令提示符下顯示幫助。 
註釋
使用“添加或刪除程序”刪除 DHCP、DNS 或任何其他內置的操作系統服務。“添加或刪除程序”不只刪除該服務的註冊表子項,而且還卸載該服務並刪除其所有的快捷方式。 
示例
下面的示例顯示瞭如何使用 sc delete 命令:

sc delete newserv

需要注意的是:
1. 在option= xxxxx格式中,“=”號和後面的內容一定要有空格,如depend=  Tcpip
2. 如果命令中的需要進行雙引號的嵌套,使用反斜槓加引號 " \" " 來進行轉義處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章