新闻资讯
看你所看,想你所想

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
);

参数

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。
密码将被忽略,对驱动程式服务。

返回值

如果函式成功,返回值将是该服务的句柄。
如果函式失败,则返回值为 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]
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档案)。

示例

搜寻“如何安装服务程式”以查询一个示例。本页最下方包含一个Delphi示例。

使用要求

<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;

相关推荐

声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:yongganaa@126.com