複製鏈接
請複製以下鏈接發送給好友

CreateService

鎖定
CreateService是一個創建一個服務對象,並將其添加到指定的服務控制管理器數據庫的函數。
中文名
CreateService
外文名
CreateService
功    能
創建一個服務對象
備    註
參數介紹

CreateService函數功能

創建一個服務對象,並將其添加到指定的服務控制管理器數據庫。

CreateService函數原型

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;

CreateService參數

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_WIN32_OWN_PROCESS 或 SERVICE_WIN32_SHARE_PROCESS且使用LocalSystem賬號來運行該服務程序,則還可以附加使用下面的值:
含義
SERVICE_INTERACTIVE_PROCESS
0x00000100
該服務可以與桌面程序進行交互操作。
dwStartType
服務啓動選項。此參數可以是下列值之一:
含義
SERVICE_AUTO_START
0x00000002
系統啓動時由服務控制管理器自動啓動該服務程序。
SERVICE_BOOT_START
0x00000000
用於由系統加載器創建的設備驅動程序。
只能用於驅動服務程序。
SERVICE_DEMAND_START
0x00000003
由服務控制管理器(SCM)啓動的服務。
SERVICE_DISABLED
0x00000004
表示該服務不可啓動。
SERVICE_SYSTEM_START
0x00000001
用於由IoInitSystem函數創建的設備驅動程序。
dwErrorControl
當該啓動服務失敗時產生錯誤的嚴重程度以及採取的保護措施。
此參數可以是下列值之一:
含義
SERVICE_ERROR_CRITICAL
0x00000003
服務啓動程序將把該錯誤記錄到事件日誌中。 若最後一次正確配置可用,服務啓動程序將以最後一次正確配置重新啓動;否則將退出執行。
SERVICE_ERROR_IGNORE
0x00000000
服務啓動程序將忽略該錯誤並返回繼續執行。
SERVICE_ERROR_NORMAL
0x00000001
服務啓動程序將把該錯誤記錄到事件日誌中並返回繼續執行。
SERVICE_ERROR_SEVERE
0x00000002
服務啓動程序將把該錯誤記錄到事件日誌中。若最後一次正確配置可用,服務啓動程序將以最後一次正確配置重新啓動;否則將返回繼續執行。
lpBinaryPathName
服務程序二進制文件,完全限定路徑。 如果路徑中包含空格它必須被引用,以便它正確的解析。 例如"d:\myshare\myservice.exe"應指定為""d:\myshare\myservice.exe""。該路徑也可以包含一個自動啓動服務的參數。 例如"d:\myshare\myservice.exe arg1 arg2"。 這些參數被傳遞給服務的入口點通常主要作用。
如果另一台計算機上指定一個路徑,共享必須可以訪問由本地計算機的計算機賬户,因為這是在遠程調用中使用的安全上下文。 但是,這項規定會影響本地計算機遠程計算機中允許任何潛在的漏洞。 因此,最好使用一個本地文件。
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指定名稱。 有關託管的服務賬户和虛擬賬户的詳細信息請參閲服務賬户的分步指南。
WindowsServer2008、WindowsVista、WindowsServer2003 和WindowsXP2000:Windows7 和WindowsServer2008 R2 之前不支持託管的服務賬户和虛擬賬户。
lpPassword
由lpServiceStartName參數指定的賬户名的密碼。 如果該賬户沒有密碼,或者如果在LocalService,NetworkService或LocalSystem賬户中運行該服務,請指定一個空字符串。 更多的信息請參閲服務記錄列表。
如果託管的服務賬户或虛擬賬户名稱的名稱由lpServiceStartName參數指定的賬户名稱lpPassword參數必須為NULL。
密碼將被忽略,對驅動程序服務。

CreateService返回值

如果函數成功,返回值將是該服務的句柄。
如果函數失敗,則返回值為 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注意事項

CreateService函數創建一個服務對象並將其安裝在SCM數據庫中,同時在註冊表以下位置中創建同名鍵值:[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services]
CreateServiceChangeServiceConfigChangeServiceConfig2等函數創建服務時提供的服務相關信息就存放於這個鍵值中。以下是一些鍵值的描述:
描述
DependOnGroup
lpDependencies參數指定的依賴性服務羣組,包含加載順序。
DependOnService
lpDependencies參數指定的依賴性服務。
Description
ChangeServiceConfig2函數寫入的描述信息。
DisplayName
由lpDisplayName參數指定的服務顯示名稱。
ErrorControl
dwErrorControl參數指定的糾錯方案。
FailureActions
ChangeServiceConfig2函數寫入的異常信息。
Group
lpLoadOrderGroup參數指定的服務羣組,包含加載順序。
ImagePath
lpBinaryPathName參數指定的服務程序文件位置。
ObjectName
lpServiceStartName參數指定的名稱。
Start
dwStartType參數指定的服務啓動時間。
Tag
lpdwTagId參數指定的識別信息。
Type
dwServiceType參數指定的服務類型。
服務安裝程序可以創建子鍵來提供更多額外的信息。
CreateService函數返回的句柄只能由調用它的進程使用,可以調用CloseServiceHandle函數來關掉這個句柄。若創建進程共享服務,請不要隨意調用可能影響其他進程的函數,如ExitProcess。另外,請不要卸載服務程序的動態鏈接庫(DLL文件)。

CreateService示例

搜索“如何安裝服務程序”以查詢一個示例。本頁最下方包含一個Delphi示例。

CreateService使用要求

<th>Minimum supported client </th> <th>Minimum supported server </th> <th>Header </th> <th>Library </th> <th>DLL </th> <th>Unicode and ANSI names </th>
Windows 2000 Professional
Windows 2000 Server
Winsvc.h (include Windows.h)
Advapi32.lib
Advapi32.dll
CreateServiceW(Unicode) andCreateServiceA(ANSI)
其中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;