1. 程式人生 > >Windows服務“允許服務與桌面互動”的使用和修改方法

Windows服務“允許服務與桌面互動”的使用和修改方法

描述:在自己寫的一個系統服務程式,需要經常用到“允許與桌面進行互動”的設定,網上很多使用修改登錄檔的形式實現,我測試過,修改登錄檔後,選中的勾是選上了,但不能彈出應用程式;據說重啟電腦後可以,但我不想重啟,實際應用也不允許重啟,故沒有測試重啟是否可行的情況。如圖:

例如:

當我需要執行服務程式的時候,彈出我的應用程式,則要在Windows服務“允許服務與桌面互動”中打勾,

當我不想彈出應用程式介面的時候,則去掉其中的勾選。

實現方式:

1.在服務程式安裝時程式設計實現,ProjectInstaller.cs


/*----------------------------------------------------------------
// 穗聯技術公司
//
// 檔名:ProjectInstaller.cs
// 檔案功能描述:服務程式安裝,安裝後,把服務設定為允許允許服務與桌面互動
// 編寫人:周林鬱
-----------------------------------------------------------------
*/using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
//using System.Linq;using Microsoft.Win32; //對登錄檔操作一定要引用這個名稱空間namespace MonitorService
{
    [RunInstaller(
true)]
    
publicpartialclass ProjectInstaller : Installer
    {
        
public ProjectInstaller()
        {
            InitializeComponent();            
            
//this.Context.Parameters["ServerCode"].ToString(); // 讀取安裝時輸入的伺服器編號                   }

        
privatevoid ProjectInstaller_AfterInstall(object sender, InstallEventArgs e)
        {
            
//設定允許服務與桌面互動            SetServiceTable(
"MonitorService");            
        }
        
///<summary>/// 設定允許服務與桌面互動 ,修改了登錄檔,要重啟系統才能生效
        
///</summary>///<param name="ServiceName">服務程式名稱</param>privatevoid SetServiceTable(string ServiceName)
        {
            RegistryKey rk 
= Registry.LocalMachine;
            
string key =@"SYSTEM/CurrentControlSet/Services/"+ ServiceName;
            RegistryKey sub 
= rk.OpenSubKey(key, true);
            
int value = (int)sub.GetValue("Type");
            sub.SetValue(
"Type", value |256);
        }
    }
}

2.登錄檔修改

onstart的時候修改登錄檔   
   [HKEY_LOCAL_MACHINE"SYSTEM"CurrentControlSet"Services"你的服務名]   
   "Type"=dword:00000010   
   key    value+256   
   比如現在00000010是16+256=272   
   16精製就是00000110
 

3.SC程式修改, 允許與桌面進行互動

 在dos命令提示符下輸入:
sc config MonitorService type= interact type= own

 回車即可。

可以用批處理的方式實現,把下面程式碼儲存為 myservice.bat 即可:

 rem 配置服務程式為允許與桌面進行互動方式
@echo "準備停止服務程式..."
sc stop MyService
@echo "設定允許與桌面進行互動方式允許"
sc config MyService type= interact type= own
@echo "正在重新啟動服務..."
sc start MyService
@echo "啟動服務成功!"

取消“允許與桌面進行互動”

DOS命令提示符下執行下面語句即可:

 sc config MyService type= own

經測試:1,2 可以選中“允許與桌面進行互動”,但啟動服務的時候,不能彈出應用程式的介面。

           3 可以完美實現所有要求。

至此,我遇到的問題也完美的得到解決。

參考資料:

 SC
與“服務控制器”和已安裝裝置通訊。SC.exe 檢索和設定有關服務的控制資訊。可以使用 SC.exe 來測試和除錯服務程式。可以設定儲存在登錄檔中的服務屬性來控制如何在啟動時和作為後臺程式執行時啟動服務應用程式。SC.exe 的引數可以配置指定的服務,檢索當前服務的狀態,也可以停止和啟動服務。可以生成批處理檔案來呼叫不同的 SC.exe 命令以自動啟動或關閉服務序列。SC.exe 提供的功能類似於“控制面板”中“管理工具”項中的“服務”。

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

sc boot

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

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

引數
ServerName
指定服務所在的遠端伺服器名稱。名稱必須採用通用的命名慣例 (UNC) 格式("""myserver")。若要在本機上執行 SC.exe,請忽略此引數。
[{bad|OK}]
指定最近的啟動是否錯誤或它是否應該儲存為上次已知的正常配置。
/?
在命令提示符顯示幫助。
範例
下面的範例顯示瞭如何使用 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]

引數
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 每次計算機重新啟動時,甚至沒有人登入計算機時,都能自動開始的服務。
demand 必須手動啟動的服務。如果沒有指定“start=”,這就預設值。
disabled 不能啟動的服務。要啟動一個禁用的服務,把啟動型別更改為其他值。

error= {normal|severe|critical|ignore}
如果在啟動中,伺服器啟動失敗,則指定錯誤的嚴重性。 值 說明
normal 將記錄錯誤,並且顯示訊息對話方塊,通知使用者服務啟動失敗。啟動將會繼續這是預設設定。
severe 記錄錯誤(如果存在)。計算機嘗試以最新的有效配置重新啟動。這可能是由於計算機能夠重新啟動,但伺服器卻仍然不能執行。
critical 記錄錯誤(如果存在)。計算機嘗試以最新的有效配置重新啟動。如果上次已知正常的配置失敗,啟動也將失敗,啟動過程就會以“藍屏”錯誤而停止。
ignore 錯誤已記錄,啟動繼續。記錄錯誤超出在事件日誌的範圍,不再給使用者作出提示。

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 的帳戶,則此項是必需的。
/?
在命令提示符顯示幫助。
註釋
如果引數及其值之間沒有空格,(例如,是 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 命令:

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]

引數
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 子項中。預設設定為空值。
/hidden:{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

sc description

設定服務的描述字串。

語法
sc [ServerName] description [ServiceName] [Description]

引數
ServerName
指定服務所在的遠端伺服器名稱。該名稱必須使用 UNC 格式 ("""myserver")。若要在本機上執行 SC.exe,請忽略此引數。
ServiceName
指定由 getkeyname 操作返回的服務名。
說明
為指定服務指定描述。如果沒有指定字串,則不會修改該服務的描述。對包含在服務描述中的字元數量沒有限制。
/?
在命令提示符顯示幫助。
範例
下面的範例顯示瞭如何使用 sc description 命令:

sc description newserv "Runs quality of service control."

sc enumdepend

列出只有運行了指定服務才能夠執行的服務。

語法
sc [ServerName] enumdepend [ServiceName] [BufferSize]

引數
ServerName
指定服務所在的遠端伺服器名稱。該名稱必須使用 UNC 格式 ("""myserver")。若要在本機上執行 SC.exe,請忽略此引數。
ServiceName
指定由 getkeyname 操作返回的服務名。
BufferSize
以位元組為單位指定列舉快取區的大小。預設值為 1024 位元組。
/?
在命令提示符顯示幫助。
註釋
如果緩衝區不夠大,enumdepend 操作只會部分輸出依存服務,並指定輸出所有依存服務所需的額外緩衝區大小。如果輸出被截斷,重新執行該操作並指定更大的緩衝區大小。
範例
下面的範例顯示瞭如何使用 sc enumdepend 命令:

sc enumdepend rpcss 5690
sc enumdepend tapisrv

sc failure

指定服務失敗時要採取的操作。

語法
sc [ServerName] failure [ServiceName] [reset= ErrorFreePeriod] [reboot= BroadcastMessage] [command= CommandLine] [actions= FailureActionsAndDelayTime]

引數
ServerName
指定服務所在的遠端伺服器名稱。該名稱必須使用 UNC 格式 ("""myserver")。若要在本機上執行 SC.exe,請忽略此引數。
ServiceName
指定由 getkeyname 操作返回的服務名。
reset= ErrorFreePeriod
指定沒有失敗的週期長度(單位為秒),此後失敗計算器的應該重置為 0。這個引數必須與 actions= 引數結合使用。
reboot= BroadcastMessage
指定服務失敗時要廣播的訊息。
command= CommandLine
指定服務失敗時要執行的命令列。有關在失敗時如何執行批處理或 VBS 檔案的資訊,請參閱“註釋”。
actions= FailureActionsAndDelayTime
指定失敗操作及其延遲時間(單位為毫秒),以正斜槓 (/) 隔開。下列操作有效:run、restart 和 reboot。此引數必須與 reset= 引數結合使用。在失敗時不採取操作請使用 actions= ""。
/?
在命令提示符顯示幫助。
註釋
不是所有的服務都允許更改其失敗選項。其中一些作為服務集的一部分執行。
要在失敗時執行批處理檔案,請指定 cmd.exe Drive:"FileName.bat 為 command= 的引數,其中 Drive:"FileName.bat 是批處理檔案的完整的合格名稱。
要在失敗時執行 VBS 檔案,請指定 cscript drive:"myscript.vbs 為 command= 的引數,其中 drive:"myscript.vbs 是指令碼檔案的完整的合格名稱。
可以將三種不同的操作指定為 actions= 的引數,它們將會在服務的第一次、第二次、第三次失敗時使用。
如果引數及其值之間沒有空格,(例如,是 type= own,而不是 type=own),則操作會失敗。
範例
下面的範例顯示瞭如何使用 sc failure 命令:

sc failure msftpsvc reset= 30 actions= restart/5000
sc failure dfs reset= 60 command= c:"windows"services"restart_dfs.exe actions= run/5000
sc failure dfs reset= 60 actions= reboot/30000
sc failure dfs reset= 60 reboot= "The Distributed File System service has failed. Because of this, the computer will reboot in 30 seconds." actions= reboot/30000
sc failure myservice reset= 3600 reboot= "MyService crashed -- rebooting machine" command= "%windir%"MyServiceRecovery.exe" actions= restart/5000/run/10000/reboot/60000

sc getdisplayname

獲得與特定服務關聯的顯示名稱。

語法
sc [ServerName] getdisplayname [ServiceName] [BufferSize]

引數
ServerName
指定服務所在的遠端伺服器名稱。該名稱必須使用 UNC 格式 ("""myserver")。若要在本機上執行 SC.exe,請忽略此引數。
ServiceName
指定由 getkeyname 操作返回的服務名。
BufferSize
指定緩衝區大小(以位元組為單位)。預設值為 1024 位元組。
/?
在命令提示符顯示幫助。
範例
下面的範例顯示瞭如何使用 sc getdisplayname 命令:

sc getdisplayname clipsrv
sc getdisplayname tapisrv
sc getdisplayname sharedaccess

sc getkeyname

使用特定服務的顯示名稱作為輸入會獲得與其相關聯的鍵名。

語法
sc [ServerName] getkeyname [ServiceDisplayName] [BufferSize]

引數
ServerName
指定服務所在的遠端伺服器名稱。該名稱必須使用 UNC 格式 ("""myserver")。若要在本機上執行 SC.exe,請忽略此引數。
ServiceDisplayName
指定服務的顯示名稱。
BufferSize
指定緩衝區大小(以位元組為單位)。預設值為 1024 位元組。
/?
在命令提示符顯示幫助。
註釋
如果 ServiceDisplayName 包含空格,請使用引號將文字引起來(例如,"Service Display Name")。
範例
下面的範例顯示瞭如何使用 sc getkeyname 命令:

sc getkeyname "remote procedure call (rpc)"
sc getkeyname "internet connection sharing"
sc getkeyname clipbook

sc interrogate

向服務傳送一個 INTERROGATE 控制請求。

語法
sc [ServerName] interrogate [ServiceName]

引數
ServerName
指定服務所在的遠端伺服器名稱。該名稱必須使用 UNC 格式 ("""myserver")。若要在本機上執行 SC.exe,請忽略此引數。
ServiceName
指定由 getkeyname 操作返回的服務名。
/?
在命令提示符顯示幫助。
註釋
使用“服務控制管理器”向服務傳送 INTERROGATE 會導致該服務使用“服務控制管理器”更新其狀態。
範例
下面的範例顯示瞭如何使用 sc interrogate 命令:

sc interrogate sharedaccess
sc interrogate rpcss

sc lock

鎖定“服務控制管理器”的資料庫。

語法
sc [ServerName] lock

引數
ServerName
指定服務所在的遠端伺服器名稱。該名稱必須使用 UNC 格式 ("""myserver")。若要在本機上執行SC.exe,請忽略此引數。
/?
在命令提示符顯示幫助。
註釋
鎖定“服務控制管理器”的資料庫會阻止啟動任何服務。 如果要確保服務在停止之後不會啟動,請使用這個命令。這允許您不受干擾的進行一些操作(例如,刪除服務)。
使用 lock 操作鎖定“服務控制管理器”的資料庫,然後通過鍵入 u 來使資料庫解鎖。也可以從鎖定資料庫的程序中關閉該程序。
範例
下面的範例顯示瞭如何使用sc lock 命令:

sc lock

sc pause

傳送 PAUSE 控制請求到服務。

語法
sc [ServerName] pause [ServiceName]

引數
ServerName
指定服務所在的遠端伺服器名稱。該名稱必須使用 UNC 格式 ("""myserver")。若要在本機上執行 SC.exe,請忽略此引數。
ServiceName
指定由 getkeyname 操作返回的服務名。
/?
在命令提示符顯示幫助。
註釋
在終止服務之前使用 pause 操作來暫停它。
不是所有的服務都能夠被暫停。
在暫停時不是所有的服務都執行同樣的操作。一些服務繼續為已有的客戶端服務,但不會接受新的客戶端。其他的會終止對已有客戶端的服務,而且也不會接受新的客戶端。
範例
下面的範例顯示瞭如何使用sc pause 命令:

sc pause tapisrv

sc qc

查詢服務的配置資訊。

語法
sc [ServerName] qc [ServiceName] [BufferSize]

引數
ServerName
指定服務所在的遠端伺服器名稱。該名稱必須使用 UNC 格式 ("""myserver")。若要在本機上執行 SC.exe,請忽略此引數。
ServiceName
指定由 getkeyname 操作返回的服務名。
BufferSize
指定緩衝區大小(以位元組為單位)。預設值為 1024 位元組。
/?
在命令提示符顯示幫助。
註釋
qc 操作顯示有關服務的下列資訊:SERVICE_NAME(服務在登錄檔中的子鍵名)、TYPE、ERROR_CONTROL、BINARY_PATH_NAME、LOAD_ORDER_GROUP、TA、DISPLAY_NAME、DEPENDENCIES 和 SERVICE_START_NAME。
管理員可以使用 SC 來確定任一服務的二進位制名稱,並查明它是否與其它服務共享一個程序,在命令列鍵入下列命令:

sc qc ServiceName

SC 有助於將 Microsoft 管理控制檯 (MMC) 中的服務與“系統監視器”中的程序匹配起來。如果二進位制名稱是 Services.exe,那麼服務共享“服務控制器”程序。

Services.exe 啟動所有的服務。為儲存系統資源,幾個為 Windows 開發的 Win32 服務被編寫為共享 Services.exe 程序。這些服務不作為獨立的程序列在“系統監視器”或“工作管理員”之中。Svchost.exe 也是如此,它是很多操作服務共享的服務主程序。

因為第三方 Win32 服務也可以配置為共享程序,所以不可能為每一個 Win32 服務建立一個程序。SC 可以用來獲得這些服務的配置資訊。但是,如果一項服務不與其他服務共享其程序,那麼在服務執行時,“系統監視器”中會出現其程序。

因為 SC 與包含在 Windows 中的 Services.exe 相比,提供了更為詳細和準確的、關於服務的資訊,所以對於服務開發員來說 SC 更有用處。Services.exe 可以確定服務是在執行、停止還是正在暫停。儘管這些工具對於正在平穩執行的已除錯程式已經足夠,但是它們提供的關於正在開發的服務的資訊卻會使人誤解。例如,一項正在啟動的服務不管其實際執行與否都顯示為已啟動。

SC 執行對所有 Windows 服務控制應用程式設計介面 (API) 函式的呼叫。通過在命令列指定這些函式來將其設定為引數。

使用 SC,可以查詢服務狀態,檢索儲存在狀態結構域中的值。Services.exe 不能提供服務的完整狀態,但 SC 顯示了精確的服務狀態,以及最新的檢查點號碼和等待提示。可以將檢查點用作除錯工具,原因在於它表明了在程式停止響應之前初始化進行了多遠。SC 也可以用來指定遠端計算機名,以便於在遠端計算機上呼叫服務 API 函式或檢視服務狀態結構。

範例
下面的範例顯示瞭如何使用 sc qc 命令:

sc qc ""myserver newsrvice
sc qc rpcss 248

sc qdescription

顯示服務的描述字串。

語法
sc [ServerName] qdescription [ServiceName] [BufferSize]

引數
ServerName
指定服務所在的遠端伺服器名稱。該名稱必須使用 UNC 格式 ("""myserver")。若要在本機上執行 SC.exe,請忽略此引數。
ServiceName
指定由 getkeyname 操作返回的服務名。
BufferSize
指定緩衝區大小(以位元組為單位)。預設值為 1024 位元組。
/?
在命令提示符顯示幫助。
範例
下面的範例顯示瞭如何使用 sc qdescription 命令:

sc qdescription rpcss
sc qdescription rpcss 138

sc qfailure

顯示指定服務失敗時要執行的操作。

語法
sc [ServerName] qfailure [ServiceName] [BufferSize]

引數
ServerName
指定服務所在的遠端伺服器名稱。該名稱必須使用 UNC 格式 ("""myserver")。若要在本機上執行 SC.exe,請忽略此引數。
ServiceName
指定由 getkeyname 操作返回的服務名。
BufferSize
指定緩衝區大小(以位元組為單位)。預設值為 1024 位元組。
/?
在命令提示符顯示幫助。
註釋
qfailure 操作顯示了下面有關服務的資訊:SERVICE_NAME(服務在登錄檔中的子鍵名)、RESET_PERIOD、REBOOT_MESSAGE、COMMAND_LINE 和 FAILURE_ACTIONS。
範例
下面的範例顯示瞭如何使用 sc qfailure 命令:

sc qfailure rpcss
sc qfailure rpcss 20

sc query

獲得和顯示關於指定的服務、驅動器、服務型別或驅動器型別的資訊。

語法
sc [ServerName] query [ServiceName] [type= {driver|service|all}] [type= {own|share|interact|kernel|filesys|rec|adapt}] [state= {active|inactive|all}] [bufsize= BufferSize] [ri= ResumeIndex] [group= GroupName]

引數
ServerName
指定服務所在的遠端伺服器名稱。該名稱必須使用 UNC 格式 ("""myserver")。若要在本機上執行 SC.exe,請忽略此引數。
ServiceName
指定由 getkeyname 操作返回的服務名。此 query 引數不與其他的 query 引數結合使用(除了 ServerName)。
type= {driver|service|all}
指定需要列出的內容。預設型別為 service。 值 說明
driver 僅指定需要列舉的驅動程式。
service 僅指定需要列舉的服務。
all 指定需要列舉的驅動程式和伺服器。

type= {own|share|interact|kernel|filesys|rec|adapt}
指定需要列舉的服務型別或驅動程式。 值 說明
own 服務以其自身的程序執行。不與其它服務共享可執行檔案。這是預設設定。
share 服務作為共享程序執行。它與其它服務共享一可執行檔案。
interact 服務可以與桌面互動作用,接收使用者的輸入。互動服務必須以在 LocalSystem 帳戶下執行。
kernel 驅動程式
filesys 檔案系統驅動程式。

state= {active|inactive|all}
指定用來列舉的服務的已開始狀態。預設狀態是active。 值 說明
active 指定所有的啟用服務。
inactive 指定所有暫停或停止的服務。
all 指定所有服務。

bufsize= BufferSize
以位元組為單位指定列舉快取區的大小。預設大小為 1024 位元組。當從查詢返回的顯示結果超過 1024 個位元組時,增加列舉緩衝區的大小。
ri= ResumeIndex
指定開始或繼續列舉的索引數。預設值為 0。在查詢返回的資訊超過預設緩衝區能夠顯示的大小時,請與 bufsize= 引數結合使用這個引數。
group= GroupName
指定列舉的服務組。預設設定為所有組。
/?
在命令提示符顯示幫助。
註釋
如果引數及其值之間沒有空格,(例如,是 type= own,而不是 type=own),則操作會失敗。
query 操作顯示了以下關於服務的資訊:SERVICE_NAME (服務在登錄檔中的子鍵名)、TYPE、STATE(也是不可用的狀態)、WIN32_EXIT_B、SERVICE_EXIT_B、CHECKPOINT 和 WAIT_HINT。
在某些情況下,“type=”引數可以使用兩次。“type=”引數的第一次出現指定是否查詢服務、驅動器或所有這些。“type=”引數的第二次出現指定一個由“create”操作來進一步縮小查詢範圍的型別。
當 query 命令的顯示結果超過了列舉緩衝區的大小時,顯示類似於以下的訊息:
Enum:資料超出,在索引 79 處重新啟動需要 1822 位元組

要顯示剩餘的 query 資訊,重新執行 query,設定 bufsize= 為位元組數,設定 ri= 為指定的索引。例如,在命令列鍵入下列指令會顯示剩餘的輸出:

sc query bufsize= 1822 ri= 79

範例
下面的範例顯示瞭如何使用 sc query 命令:

sc query
sc query messenger
sc query type= driver
sc query type= service
sc query state= all
sc query bufsize= 50
sc query ri= 14
sc query type= service type= interact
sc query type= driver group= ndis

sc queryex

獲得和顯示關於服務、驅動器、服務型別或驅動器型別的擴充套件資訊。

語法
sc [ServerName] queryex [type= {driver|service|all}] [type= {own|share|interact|kernel|filesys|rec|adapt}] [state= {active|inactive|all}] [bufsize= BufferSize] [ri= ResumeIndex] [group= GroupName]

引數
ServerName
指定服務所在的遠端伺服器名稱。該名稱必須使用 UNC 格式 ("""myserver")。若要在本機上執行 SC.exe,請忽略此引數。
ServiceName
指定由 getkeyname 操作返回的服務名。此 queryex 引數不與 ServerName 之外的任何其它 queryex 引數結合使用。
type= {driver|service|all}
指定需要列出的內容。預設型別為 service。 值 說明
driver 僅指定需要列舉的驅動程式.
service 僅指定需要列舉的服務。
all 指定需要列舉的驅動程式和伺服器。

type= {own|share|interact|kernel|filesys|rec|adapt}
指定需要列舉的服務型別或驅動程式。 值 說明
own 服務以其自身的程序執行。不與其它服務共享可執行檔案。這是預設設定。
share 服務作為共享程序執行。它與其它服務共享一可執行檔案。
interact 服務可以與桌面互動作用,接收使用者的輸入。互動服務必須以在 LocalSystem 帳戶下執行。
kernel 驅動程式
filesys 檔案系統驅動程式。

state= {active|inactive|all}
指定用來列舉的服務的已開始狀態。預設狀態是 active。 值 說明
active 指定所有的啟用服務。
inactive 指定所有暫停或停止的服務。
all 指定所有服務。

bufsize= BufferSize
以位元組為單位指定列舉快取區的大小。預設大小為 1024 位元組。
ri= ResumeIndex
指定開始或繼續列舉的索引數。預設值為 0。
group= GroupName
指定列舉的服務組。預設設定為所有組。
/?
在命令提示符顯示幫助。
註釋
如果引數及其值之間沒有空格,(例如,是 type= own,而不是 type=own),則操作會失敗。
queryex 操作顯示以下有關服務的資訊:SERVICE_NAME(服務在登錄檔中的子鍵名)、TYPE、STATE(也是不可用的狀態)、WIN32_EXIT_B、SERVICE_EXIT_B、CHECKPOINT、WAIT_HINT、PID 和 FLAGS。
在某些情況下,“type=”引數可以使用兩次。“type=”引數的第一次出現指定是否查詢服務、驅動器或所有這些。“type=”引數的第二次出現指定一個由“create”操作進一步縮小查詢範圍的型別。
在 queryex 命令的顯示結果超過了列舉緩衝區大小時,顯示類似於以下的訊息:
Enum:資料超出,在索引 75 處重新啟動需要 2130 個位元組

要顯示 queryex 的剩餘資訊,重新執行 queryex,設定 bufsize= 為位元組數, ri= 為指定索引。例如,在命令列鍵入下面的指令會顯示剩餘的輸出:

sc queryex bufsize= 2130 ri= 75

範例
下面的範例顯示瞭如何使用 sc queryex 命令:

sc queryex messenger
sc queryex group= ""

sc querylock

查詢和顯示“服務控制管理器”資料庫的鎖定資訊。

語法
sc [ServerName] querylock

引數
ServerName
指定服務所在的遠端伺服器名稱。該名稱必須使用 UNC 格式 ("""myserver")。若要在本機上執行 SC.exe,請忽略此引數。
/?
在命令提示符顯示幫助。
sc sdset

使用“服務描述符定義語言” (SDDL) 來設定服務的安全描述符。

語法
sc [ServerName] sdset ServiceName ServiceSecurityDescriptor

引數
ServerName
指定服務所在的遠端伺服器名稱。該名稱必須使用 UNC 格式 ("""myserver")。若要在本機上執行 SC.exe,請忽略此引數。
ServiceName
指定由 getkeyname 操作返回的服務名。
ServiceSecurityDescriptor
在 SDDL 中指定服務描述符。
/?
在命令提示符顯示幫助。
註釋
有關 SDDL 的資訊,請參閱 MSDN 聯機知識庫中的“安全描述符定義語言”。(http://www.microsoft.com/)
sc sdshow

使用 SDDL 顯示服務的安全描述符。

語法
sc [ServerName] sdshow ServiceName

引數
ServerName
指定服務所在的遠端伺服器名稱。該名稱必須使用 UNC 格式 ("""myserver")。若要在本機上執行 SC.exe,請忽略此引數。
ServiceName
指定由 getkeyname 操作返回的服務名。
/?
在命令提示符顯示幫助。
註釋
有關 SDDL 的資訊,請參閱 MSDN 聯機知識庫 中的“安全描述符定義語言”。(http://www.microsoft.com/)
範例
sc sdshow rpcss

sc start

啟動正在執行的服務。

語法
sc [ServerName] start ServiceName [ServiceArguments]

引數
ServerName
指定服務所在的遠端伺服器名稱。該名稱必須使用 UNC 格式 ("""myserver")。若要在本機上執行 SC.exe,請忽略此引數。
ServiceName
指定由 getkeyname 操作返回的服務名。
ServiceArguments
指定傳遞給要啟動的服務的服務引數。
/?
在命令提示符顯示幫助。
範例
下面的範例顯示瞭如何使用 sc start 命令:

sc start tapisrv

sc stop

向服務傳送 STOP 控制請求。

語法
sc [ServerName] stop ServiceName

引數
ServerName
指定服務所在的遠端伺服器名稱。該名稱必須使用 UNC 格式 ("""myserver")。若要在本機上執行 SC.exe,請忽略此引數。
ServiceName
指定由 getkeyname 操作返回的服務名。
/?
在命令提示符顯示幫助。
註釋
不是所有的服務都可以被停止。
範例
下面的範例顯示瞭如何使用 sc stop 命令:

sc stop tapisrv

 

 

 

 

參考網址:

http://www.3800hk.com/news/w43/55454_4.html

http://technet.microsoft.com/zh-cn/library/cc772676.aspx