使用方法
創建服務函式創建一個服務對象並且把它加入到服務管理資料庫中
VB
C#
C++
F#
JScript
Copy
SC_HANDLE CreateService(
SC_HANDLE hSCManager, //服務控制管理程式維護的登記資料庫的句柄,由系統函式OpenSCManager 返回
LPCTSTR lpServiceName, //以NULL 結尾的服務名,用於創建登記資料庫中的關鍵字
LPCTSTR lpDisplayName, //以NULL 結尾的服務名,用於用戶界面標識服務
DWORD dwDesiredAccess, //指定服務返回類型
DWORD dwServiceType, //指定服務類型
DWORD dwStartType, //指定何時啟動服務
DWORD dwErrorControl, //指定服務啟動失敗的嚴重程度
LPCTSTR lpBinaryPathName, //指定服務程式二進制檔案的路徑
LPCTSTR lpLoadOrderGroup, //指定順序裝入的服務組名
LPDWORD lpdwTagId, //忽略,NULL
LPCTSTR lpDependencies, //指定啟動該服務前必須先啟動的服務或服務組
LPCTSTR lpServiceStartName, //以NULL 結尾的字元串,指定服務帳號。如是NULL,則表示使用LocalSystem 帳號
LPCTSTR lpPassword //以NULL 結尾的字元串,指定對應的口令。為NULL表示無口令。但使用LocalSystem時填NULL
);
參數
hSCManager 服務控制管理器資料庫的句柄。 此句柄由 OpenSCManager 函式返回,並且必須 具有 SC_MANAGER_CREATE_SERVICE 的訪問許可權。 有關更多的信息請參閱 Service 安全和訪問許可權。
lpServiceName 要安裝該服務的名稱。 最大字元串長度為 256 個字元。 服務控制管理器資料庫將保留在的字元的大小寫,但是服務名稱比較總是區分大小寫。 正斜槓和一個反斜線不是有效的服務名稱字元。
lpDisplayName[可選] 對被用戶界面程式用來識別服務的顯示名稱。 此字元串具有最大長度為 256 個字元。 服務控制管理器中的情況下保留名稱。 顯示名稱比較總是不區分大小寫。
dwDesiredAccess 對服務的訪問。 請求的訪問之前,系統將檢查調用進程的訪問令牌。 一個值列表請參閱服務安全和訪問許可權。
dwServiceType 服務類型。 此參數可以是下列值之一:
值 | 作用 |
SERVICE_ADAPTER 0x00000004 | 保留 |
SERVICE_FILE_SYSTEM_DRIVER 0x00000002 | 檔案系統驅動服務程式 |
SERVICE_KERNEL_DRIVER 0x00000001 | 驅動服務程式 |
SERVICE_RECOGNIZER_DRIVER 0x00000008 | 保留 |
SERVICE_WIN32_OWN_PROCESS 0x00000010 | 運行於獨立進程的服務程式 |
SERVICE_WIN32_SHARE_PROCESS 0x00000020 | 被多個進程共享的服務程式。查詢Service Programs以獲取更多信息。 |
值 | 含義 |
SERVICE_INTERACTIVE_PROCESS 0x00000100 | 該服務可以與桌面程式進行互動操作。 查詢Interactive Services以獲取更多訊息。 |
值 | 含義 |
SERVICE_AUTO_START 0x00000002 | 系統啟動時由服務控制管理器自動啟動該服務程式。 查詢Automatically Starting Services以獲取更多信息。 |
SERVICE_BOOT_START 0x00000000 | 用於由系統載入器創建的設備驅動程式。 只能用於驅動服務程式。 |
SERVICE_DEMAND_START 0x00000003 | 用於當有進程調用StartService 函式時由服務控制管理器(SCM)啟動的服務。 查詢Starting Services on Demand以獲取更多信息。 |
SERVICE_DISABLED 0x00000004 | 表示該服務不可啟動。 嘗試啟動該服務將產生一個ERROR_SERVICE_DISABLED錯誤。 |
SERVICE_SYSTEM_START 0x00000001 | 用於由IoInitSystem 函式創建的設備驅動程式。 只能用於驅動服務程式。 |
值 | 含義 |
SERVICE_ERROR_CRITICAL 0x00000003 | 服務啟動程式將把該錯誤記錄到事件日誌中。 若最後一次正確配置可用,服務啟動程式將以最後一次正確配置重新啟動; 否則將退出執行。 |
SERVICE_ERROR_IGNORE 0x00000000 | 服務啟動程式將忽略該錯誤並返回繼續執行。 |
SERVICE_ERROR_NORMAL 0x00000001 | 服務啟動程式將把該錯誤記錄到事件日誌中並返回繼續執行。 |
SERVICE_ERROR_SEVERE 0x00000002 | 服務啟動程式將把該錯誤記錄到事件日誌中。 若最後一次正確配置可用,服務啟動程式將以最後一次正確配置重新啟動; 否則將返回繼續執行。 |
如果另一台計算機上指定一個路徑,共享必須可以訪問由本地計算機的計算機帳戶,因為這是在遠程調用中使用的安全上下文。 但是,這項規定會影響本地計算機遠程計算機中允許任何潛在的漏洞。 因此,最好使用一個本地檔案。
lpLoadOrderGroup [可選] 在載入順序此服務所屬的組的名稱。 指定 NULL 或空字元串,如果該服務不屬於組。 啟動程式使用載入順序組載入服務相對於其他組的指定順序組。 載入順序組列表包含在下面的註冊表值:[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\ServiceGroupOrder]
lpdwTagId[可選] 指向接收 lpLoadOrderGroup 參數中指定的組中唯一的標記值的變數。 如果不更改現有的標籤,請指定 NULL。訂購服務啟動一個載入順序通過在以下註冊表值中指定標記順序矢量的組中,您可以使用的標記:[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\GroupOrderList]。標記只能用於具有 SERVICE_BOOT_START 或啟動類型的 SERVICE_SYSTEM_START 驅動程式服務。
lpDependencies [可選] 空分隔名稱的服務或載入順序組系統必須在這個服務開始之前的雙空終止數組的指針。 如果服務沒有任何依賴關係,請指定為 NULL 或空字元串。 一組依賴意味著如果至少一個組的成員運行後試圖啟動組的所有成員,可以運行此服務。當需要區分各服務由於服務和服務組共享相同的命名空間前綴與 SC_GROUP_IDENTIFIER 的組名時必須加上此參數。
lpServiceStartName [可選] 該服務應在其下運行的帳戶的名稱。 如果SERVICE_WIN32_OWN_PROCESS 服務類型 DomainNameUserName窗體中使用一個帳戶名。 服務進程將被作為此用戶登錄。 如果該帳戶屬於內置域,您可以指定.UserName。
如果為 NULL 此參數 CreateService 使用 LocalSystem 帳戶。 如果服務類型指定 SERVICE_INTERACTIVE_PROCESS,該服務必須運行在 LocalSystem 帳戶。
如果 NTAUTHORITYLocalService 此參數 CreateService 使用 LocalService 帳戶。 如果 NTAUTHORITYNetworkService 參數 CreateService 使用 NetworkService 帳戶。
共享的處理可以運行於任何用戶。
如果服務類型 SERVICE_KERNEL_DRIVER 或 SERVICE_FILE_SYSTEM_DRIVER 名稱是系統用來載入設備驅動程式的驅動程式對象名稱。 如果該驅動程式將使用由 IO 系統創建的默認對象名稱,請指定 NULL。
可以將服務配置為使用一個託管的帳戶或虛擬帳戶。 如果該服務被配置為使用一個託管的服務帳戶,名稱是託管的服務帳戶名稱。 如果該服務被配置為使用一個虛擬帳戶,作為 NTSERVICEServiceName 指定名稱。 有關託管的服務帳戶和虛擬帳戶的詳細信息請參閱服務帳戶的分步指南。
WindowsServer 2008、 WindowsVista、 WindowsServer 2003 和 Windows XP2000: Windows 7 和 WindowsServer 2008 R2 之前不支持託管的服務帳戶和虛擬帳戶。
lpPassword [in, optional] 由 lpServiceStartName 參數指定的帳戶名的密碼。 如果該帳戶沒有密碼,或者如果在 LocalService,NetworkService 或 LocalSystem 帳戶中運行該服務,請指定一個空字元串。 更多的信息請參閱服務記錄列表。
如果託管的服務帳戶或虛擬帳戶名稱的名稱由 lpServiceStartName 參數指定的帳戶名稱 lpPassword 參數必須為 NULL。
密碼將被忽略,對驅動程式服務。
返回值
如果函式成功,返回值將是該服務的句柄。
如果函式失敗,則返回值為 NULL。 若要擴展的錯誤了解調用 GetLastError。
下面的錯誤代碼可以由服務控制管理器設定。 其他錯誤代碼可以設定的由服務控制管理器調用註冊表函式。
返回值 | 描述 |
ERROR_ACCESS_DENIED | 提供的hSCManager參數沒有SC_MANAGER_CREATE_SERVICE許可權。 |
ERROR_CIRCULAR_DEPENDENCY | 存在循環嵌套的服務依賴關係。 |
ERROR_DUPLICATE_SERVICE_NAME | 顯示名稱已在SCM中被其他服務註冊為服務名稱或顯示名稱。 |
ERROR_INVALID_HANDLE | 提供的hSCManager參數無效。 |
ERROR_INVALID_NAME | 提供的服務名稱無效。 |
ERROR_INVALID_PARAMETER | 其他參數無效。 |
ERROR_INVALID_SERVICE_ACCOUNT | 由lpServiceStartName參數指定的用戶名不存在。 |
ERROR_SERVICE_EXISTS | 已存在完全相同的服務。 |
注意事項
CreateService函式創建一個服務對象並將其安裝在SCM資料庫中,同時在註冊表以下位置中創建同名鍵值:[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services]由CreateService、ChangeServiceConfig 和 ChangeServiceConfig2 等函式創建服務時提供的服務相關信息就存放於這個鍵值中。以下是一些鍵值的描述:
值 | 描述 |
DependOnGroup | 由lpDependencies參數指定的依賴性服務群組,包含載入順序。 |
DependOnService | 由lpDependencies參數指定的依賴性服務。 |
Description | 由ChangeServiceConfig2函式寫入的描述信息。 |
DisplayName | 由lpDisplayName參數指定的服務顯示名稱。 |
ErrorControl | 由dwErrorControl參數指定的糾錯方案。 |
FailureActions | 由ChangeServiceConfig2函式寫入的異常信息。 |
Group | 由lpLoadOrderGroup參數指定的服務群組,包含載入順序。 (設定該值將有可能覆蓋DependOnService的值。) |
ImagePath | 由lpBinaryPathName參數指定的服務程式檔案位置。 |
ObjectName | 由lpServiceStartName參數指定的名稱。 |
Start | 由dwStartType參數指定的服務啟動時間。 |
Tag | 由lpdwTagId參數指定的識別信息。 |
Type | 由dwServiceType參數指定的服務類型。 |
CreateService函式返回的句柄只能由調用它的進程使用,可以調用CloseServiceHandle函式來關掉這個句柄。若創建進程共享服務,請不要隨意調用可能影響其他進程的函式,如ExitProcess。另外,請不要卸載服務程式的動態程式庫(DLL檔案)。
示例
搜尋“如何安裝服務程式”以查詢一個示例。本頁最下方包含一個Delphi示例。使用要求
Minimum supported client Minimum supported server Header Library DLL Unicode and ANSI namesWindows 2000 Professional |
Windows 2000 Server |
Winsvc.h (include Windows.h) |
Advapi32.lib |
Advapi32.dll |
CreateServiceW (Unicode) and CreateServiceA (ANSI) |
SC_HANDLE hSCManager, //服務控制管理程式維護的登記資料庫的句柄,由系統函式OpenSCManager 返回
LPCTSTR lpServiceName, //以NULL 結尾的服務名,用於創建登記資料庫中的關鍵字
LPCTSTR lpDisplayName, //以NULL 結尾的服務名,用於用戶界面標識服務
DWORD dwDesiredAccess, //指定服務返回類型
DWORD dwServiceType, //指定服務類型
DWORD dwStartType, //指定何時啟動服務
DWORD dwErrorControl, //指定服務啟動失敗的嚴重程度
LPCTSTR lpBinaryPathName, //指定服務程式二進制檔案的路徑
LPCTSTR lpLoadOrderGroup, //指定順序裝入的服務組名
LPDWORD lpdwTagId, //忽略,NULL
LPCTSTR lpDependencies, //指定啟動該服務前必須先啟動的服務或服務組
LPCTSTR lpServiceStartName, //以NULL 結尾的字元串,指定服務帳號。如是NULL,則表示使用LocalSystem 帳號
LPCTSTR lpPassword //以NULL 結尾的字元串,指定對應的口令。為NULL表示無口令。但使用LocalSystem時填NULL
);
其中dwStartType取值類型如下:
共有五種啟動類型。前三種類型是:SERVICE_AUTO_START、SERVICE_DISABLED 和 SERVICE_DEMAND_START。對應的標準啟動類型:自動、禁用和手動,通常使用“計算機管理”管理工具中的“服務”進行配置。後兩種類型是:SERVICE_BOOT_START 和 SERVICE_SYSTEM_START,通常用於配置載入設備驅動程式的方式。例如,在啟動計算機時或啟動 Windows 2000 時載入。
Delphi sample:
Procedure InstallSelfToSvr();
var
hscm,hsvr:THandle;
PCPathName:PAnsiChar;
begin
try
hscm := OpenSCManager(nil,nil,SM_MANAGER_ALL_ACCESS);
if hscm = 0 then exit;
PCPathName := pchar(paramstr(0));
hsvr := CreateService(hscm,'MyService','MyService Display Name',SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS,SERVICE_AUTO_START,SERVICE_ERROR_NORMAL,PCPathName,nil,nil,nil,nil,nil);
CloseServiceHandle(hsvr);
CloseServiceHandle(hscm);
except
end;
end;