7 out of 10 rated this helpful - Rate this topic

OpenService function

Applies to: desktop apps only

Opens an existing service.

Syntax

SC_HANDLE WINAPI OpenService(
  __in  SC_HANDLE hSCManager,
  __in  LPCTSTR lpServiceName,
  __in  DWORD dwDesiredAccess
);

Parameters

hSCManager [in]

A handle to the service control manager database. The OpenSCManager function returns this handle. This handle must have the SC_MANAGER_ENUMERATE_SERVICE access right. For more information, see Service Security and Access Rights.

lpServiceName [in]

The name of the service to be opened. This is the name specified by the lpServiceName parameter of the CreateService function when the service object was created, not the service display name that is shown by user interface applications to identify the service.

The maximum string length is 256 characters. The service control manager database preserves the case of the characters, but service name comparisons are always case insensitive. Forward-slash (/) and backslash (\) are invalid service name characters.

dwDesiredAccess [in]

The access to the service. For a list of access rights, see Service Security and Access Rights.

Before granting the requested access, the system checks the access token of the calling process against the discretionary access-control list of the security descriptor associated with the service object.

Return value

If the function succeeds, the return value is a handle to the service.

If the function fails, the return value is NULL. To get extended error information, call GetLastError.

The following error codes can be set by the service control manager. Others can be set by the registry functions that are called by the service control manager.

Return codeDescription
ERROR_ACCESS_DENIED

The handle does not have access to the service.

ERROR_INVALID_HANDLE

The specified handle is invalid.

ERROR_INVALID_NAME

The specified service name is invalid.

ERROR_SERVICE_DOES_NOT_EXIST

The specified service does not exist.

 

Remarks

The returned handle is only valid for the process that called OpenService. It can be closed by calling the CloseServiceHandle function.

Examples

For an example, see Starting a Service.

Requirements

Minimum supported client

Windows XP

Minimum supported server

Windows Server 2003

Header

Winsvc.h (include Windows.h)

Library

Advapi32.lib

DLL

Advapi32.dll

Unicode and ANSI names

OpenServiceW (Unicode) and OpenServiceA (ANSI)

See also

ChangeServiceConfig
CloseServiceHandle
ControlService
CreateService
DeleteService
EnumDependentServices
OpenSCManager
QueryServiceConfig
QueryServiceObjectSecurity
QueryServiceStatusEx
SCM Handles
Service Functions
SetServiceObjectSecurity
StartService

 

 

Send comments about this topic to Microsoft

Build date: 2/7/2012

Did you find this helpful?
(1500 characters remaining)
Community Content Add
Annotations FAQ
OpenService does not honor transitive group membership
I notice a misbehavior in how OpenService authorizes the calling process: when the SCM checks the access token of the calling process against the discretionary ACL of the security descriptor associated with the service object, transitive group membership does not happen. That is, if user X is a member of group A, and group A is a member of group B, and group B has full access to the service object being opened, then a process running as user X gets an "Access denied" failure from OpenService. But if user X is a member of group B and group B has full access to the service being opened, then a process running as user X can successfully call OpenService for that service. $0$0 $0 $0Is this an expected behavior? I have found no documentation anywhere in MSDN or online that says transitive group membership is ever disabled like this. Has anyone else seen this?$0