SC命令詳解


    我們知道在MStools SDK,也就是在Resource Kit有一個很少有人知道的命令行軟件,SC.exe,這個軟件向所有的Windows NT和Windows 2000要求控制他們的API函數。我們可以在命令行里通過對這些函數設定參數的方式來設定他們(API)。
    SC.exe也可以顯示服務的狀態,同時也可以從狀態結構區域里重新找到存儲在里面的數值。它還可以列出遠程計算機的服務函數或者是服務狀況結構。
    SC.exe這個開發工具至少可以比服務控制面板程序和網絡命令行界面(net.exe,這個東西可以告訴你一個服務是在運行中,還是停止,還是暫停。)這兩個東西提供更多的細節和准確的信息。雖然上述兩個東西在正常工作的情況下,對於完整的調試是非常好用的,但是如果有新的服務,或者新的代碼被開發出來的時候,這兩個工具提供的信息可能造成誤導。這也就是我們需要用到SC的原因。         

    下面舉列說明,如果在開發階段,你的服務在掛住在一個start-pending的時候,控制面板和net.exe同樣報告服務是在運行的。但它掛在一個stop-pending的時候,net.exe報告它運行,而控制面板着報告它停止,如果你試着啟動它,這是控制面板則會告訴你這個服務正在運行。難道這不是很困惑嗎?呵呵!
    SC.exe可以讓你詢問服務的狀況和取出存儲在狀態結構區域內的數值,控制面板和net.exe不提供服務完整的狀況。但是無論如何,SC程序可以告訴你這個服務准確的情形,同樣也可以給你看最后的checkpoint數和等待提示。這個checkpoint,我叫它檢查點(我覺得他就像一個程序調試時置的斷點),所以我們也可以把看作為一個調試工具,因為它可以提供一個關於在程序停止時還要沿着初始化繼續前進多久准確報告。SC.exe也可以允許你調用很多的服務控制API函數,可以讓你從命令行里改變大量的參數。這為服務開發者們提供了很多的優勢。例如,它提供了一個方便的方式來創建或者在注冊表和服務控制管理數據庫中配置服務信息。開發者們不需要再手動的在注冊表里單獨的設置鍵值來配置服務,也不用重起機器來強迫服務控制管理數據庫升級。 
    作為一個命令行工具,SC.exe可以用來測試你自己的系統,你可以設置一個批處理文件來使用不同的參數調用SC.exe來控制服務。這個很有用,如果你想看看你的服務不斷的啟動和停止,我沒有試過哦!讓一個服務一下子打開,一下子關閉,聽上去很不錯的。如果你的服務進程里面有多個進程的話,你可以保持一個進程繼續運行不讓它走開,然后讓另一個不斷的打開在關閉,還可以尋找一下內存缺乏導致不完全清楚的證據。

    下面介紹SC,SC QC,and SC QUERY。

SC使用這樣的語法: 
1. SC [Servername] command Servicename [Optionname= Optionvalue] 

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和optionvalue參數允許你指定命令參數的名稱和數值。注意,這一點很重要在名稱和等號之間是沒有空格的。比如,start= optionvalue,這個很重要。 
optionvalue可以是0,1,或者是更多的參數名稱和數值對。如果你想要看每個命令的可以用的optionvalue,你可以使用sc command這樣的格式。這會為你提供詳細的幫助。

Optionvalue 
為optionname的參數的名稱指定它的數值。有效數值范圍常常限制於哪一個參數的optionname。如果要列表請用 sc command來詢問每個命令。 

Comments 
很多的命令需要管理員權限,所以我想說,在你操作這些東西的時候最好是管理員。
當你鍵入SC而不帶任何參數時,SC.exe會顯示幫助信息和可用的命令。當你鍵入SC緊跟着命令名稱時,你可以得到一個有關這個命令的詳細列表。比如,鍵入sc create可以得到和create有關的列表。但是除了一個命令,sc query,這會導出該系統中當前正在運行的所有服務和驅動程序的狀態。當你使用start命令時,你可以傳遞一些參數(arguments)給服務的主函數,但是不是給服務進程的主函數。

SC create 
這個命令可以在注冊表和服務控制管理數據庫建立一個入口。
語法1: 
sc [servername] create Servicename [Optionname= Optionvalue]
這里的servername,servicename,optionname,optionvalue和上面的一樣,這里就不多說了。這里我們
詳細說明一下optionname和optionvalue。
Optionname Optionvalue 描述:
type= own, share, interact, kernel, filesys 
關於建立服務的類型,選項值包括驅動程序使用的類型,默認是share。
start= boot, system, 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) 
賬號運行使用的名稱,也可以說是登陸身份。默認是localsystem Displayname= (string) 
一個為在用戶界面程序中鑒別各個服務使用的字符串。
password= (string) 
一個密碼,如果一個不同於localsystem的賬號使用時需要使用這個。
Optionvalue  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\system32\NewServ.exe 按照默認,這個服務會建立一個WIN32_SHARE_PROCESS使用。
SERVICE_DEMAND_START啟動方式。這將不會有任何從屬關系,也將會按照localsystem安全上下關系來運行。

例2: 
下面這個例子將在本地計算機上,建立一個服務,它將會是一個自動運行服務,並且運行在他自己的進程上。它從屬於TDI組和NetBios服務上。注意,你必須在從屬中間增加一個空格的引用。
sc create NewService binpath= c:\winnt\system32\NewServ.exe type= own  start= auto depend= "+TDI Netbios"

例3:
服務開發者可以通過臨時改變二進制路徑(影像路徑)的方式來將這個服務運行在內核調試器的上下關系中。下面這個例子就可以讓我們看到如何改變服務的配置。
sc config NewService binpath= "ntsd -d c:\winnt\system32\Newserv.exe"  這個例子會引起服務控制管理器調用ntsd.exe使用下例的參數字符串:  "-d c:\nt\system32\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\system32\NewServ.exe  LOAD_ORDER_GROUP :  TAG : 0 
DISPLAY_NAME : NewService  DEPENDENCIES : 
SERVICE_START_NAME : LocalSystem
NewService有能力和其他的服務共享一個進程。但是它不是自動啟動的。二進制文件名是NewServ.exe。
這個服務不依靠與其它的的服務,而且運行在lcoalsystem的安全上下關系中。這些都是調QueryServiceStatus
基本的返回,如果還需要更多的細節時,可以看看API函數文件。

SC QUERY
SC QUERY命令可以獲得服務的信息。
語法: 
sc [Servername] query { Servicename │ Optionname= Optionvalue... } 參數:
servername, servicename, optionname, optionvalue不在解釋。只談一下這個命令提供的數值。
Optionname Optionvalue  Description
type= driver, service, all 列舉服務的類型,默認是service state= active, inactive, all 列舉服務的狀態,默認是active bufsize= (numeric value) 
列舉緩沖區的尺寸,默認是1024 bytes ri= (numeric value) 
但開始列舉時,恢復指針的數字,默認是0。

Optionvalue  同上。
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
 



免責聲明!

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



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