标题：CreateService
使用方法
创建服务函数　
创建一个服务对象并且把它加入到服务管理数据库中
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_WIN32_OWN_PROCESS 或 SERVICE_WIN32_SHARE_PROCESS且使用LocalSystem帐号来运行该服务程序，则还可以附加使用下面的值：
值含义SERVICE_INTERACTIVE_PROCESS 
0x00000100该服务可以与桌面程序进行交互操作。 
查询Interactive Services以获取更多消息。dwStartType 服务启动选项。此参数可以是下列值之一：
值含义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 函数创建的设备驱动程序。
只能用于驱动服务程序。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 指定名称。 有关托管的服务帐户和虚拟帐户的详细信息请参阅服务帐户的分步指南。
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示例。
使用要求
<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 ProfessionalWindows 2000 ServerWinsvc.h (include Windows.h)Advapi32.libAdvapi32.dllCreateServiceW (Unicode) and CreateServiceA (ANSI)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 
); 
其中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;