OpenSCManager (advapi32)
Last changed: -95.220.199.28

.
Summary
The OpenSCManager function establishes a connection to the service control manager on the specified computer and opens the specified service control manager database.

C# Signature:

    [DllImport("advapi32.dll", EntryPoint="OpenSCManagerW", ExactSpelling=true, CharSet=CharSet.Unicode, SetLastError=true)]
    public static extern IntPtr OpenSCManager(string machineName, string databaseName, uint dwAccess);

VB Signature:

    <DllImport("advapi32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
    Private Shared Function OpenSCManager(ByVal machineName As String, ByVal databaseName As String, ByVal desiredAccess As Int32) As IntPtr
    End Function

VB .NET Signature:

    Declare Function OpenSCManager Lib "advapi32.dll" Alias "OpenSCManagerA" (ByVal lpMachineName As String, ByVal lpDatabaseName As String, ByVal dwDesiredAccess As Integer) As Integer

C# User-Defined Types:

See ACCESS_MASK definition

   [Flags]
    public enum SCM_ACCESS : uint
    {
    /// <summary>
    /// Required to connect to the service control manager.
    /// </summary>
    SC_MANAGER_CONNECT = 0x00001,

    /// <summary>
    /// Required to call the CreateService function to create a service
    /// object and add it to the database.
    /// </summary>
    SC_MANAGER_CREATE_SERVICE = 0x00002,

    /// <summary>
    /// Required to call the EnumServicesStatusEx function to list the
    /// services that are in the database.
    /// </summary>
    SC_MANAGER_ENUMERATE_SERVICE = 0x00004,

    /// <summary>
    /// Required to call the LockServiceDatabase function to acquire a
    /// lock on the database.
    /// </summary>
    SC_MANAGER_LOCK = 0x00008,

    /// <summary>
    /// Required to call the QueryServiceLockStatus function to retrieve
    /// the lock status information for the database.
    /// </summary>
    SC_MANAGER_QUERY_LOCK_STATUS = 0x00010,

    /// <summary>
    /// Required to call the NotifyBootConfigStatus function.
    /// </summary>
    SC_MANAGER_MODIFY_BOOT_CONFIG = 0x00020,

    /// <summary>
    /// Includes STANDARD_RIGHTS_REQUIRED, in addition to all access
    /// rights in this table.
    /// </summary>
    SC_MANAGER_ALL_ACCESS = ACCESS_MASK.STANDARD_RIGHTS_REQUIRED |
        SC_MANAGER_CONNECT |
        SC_MANAGER_CREATE_SERVICE |
        SC_MANAGER_ENUMERATE_SERVICE |
        SC_MANAGER_LOCK |
        SC_MANAGER_QUERY_LOCK_STATUS |
        SC_MANAGER_MODIFY_BOOT_CONFIG,

    GENERIC_READ = ACCESS_MASK.STANDARD_RIGHTS_READ |
        SC_MANAGER_ENUMERATE_SERVICE |
        SC_MANAGER_QUERY_LOCK_STATUS,

    GENERIC_WRITE = ACCESS_MASK.STANDARD_RIGHTS_WRITE |
        SC_MANAGER_CREATE_SERVICE |
        SC_MANAGER_MODIFY_BOOT_CONFIG,

    GENERIC_EXECUTE = ACCESS_MASK.STANDARD_RIGHTS_EXECUTE |
        SC_MANAGER_CONNECT | SC_MANAGER_LOCK,

    GENERIC_ALL = SC_MANAGER_ALL_ACCESS,
    }

VB User-Defined Types:

See ACCESS_MASK definition

  <Flags()> _
  Public Enum SCM_ACCESS : UInt

    ''' <summary>
    ''' Required to connect to the service control manager.
    ''' </summary>
    SC_MANAGER_CONNECT = &H1

    ''' <summary>
    ''' Required to call the CreateService function to create a service
    ''' object and add it to the database.
    ''' </summary>
    SC_MANAGER_CREATE_SERVICE = &H2

    ''' <summary>
    ''' Required to call the EnumServicesStatusEx function to list the
    ''' services that are in the database.
    ''' </summary>
    SC_MANAGER_ENUMERATE_SERVICE = &H4

    ''' <summary>
    ''' Required to call the LockServiceDatabase function to acquire a
    ''' lock on the database.
    ''' </summary>
    SC_MANAGER_LOCK = &H8

    ''' <summary>
    ''' Required to call the QueryServiceLockStatus function to retrieve
    ''' the lock status information for the database.
    ''' </summary>
    SC_MANAGER_QUERY_LOCK_STATUS = &H10

    ''' <summary>
    ''' Required to call the NotifyBootConfigStatus function.
    ''' </summary>
    SC_MANAGER_MODIFY_BOOT_CONFIG = &H20

    ''' <summary>
    ''' Includes STANDARD_RIGHTS_REQUIRED, in addition to all access
    ''' rights in this table.
    ''' </summary>
    SC_MANAGER_ALL_ACCESS = ACCESS_MASK.STANDARD_RIGHTS_REQUIRED Or _
    SC_MANAGER_CONNECT Or _
    SC_MANAGER_CREATE_SERVICE Or _
    SC_MANAGER_ENUMERATE_SERVICE Or _
    SC_MANAGER_LOCK Or _
    SC_MANAGER_QUERY_LOCK_STATUS Or _
    SC_MANAGER_MODIFY_BOOT_CONFIG

    GENERIC_READ = ACCESS_MASK.STANDARD_RIGHTS_READ Or _
    SC_MANAGER_ENUMERATE_SERVICE Or _
    SC_MANAGER_QUERY_LOCK_STATUS

    GENERIC_WRITE = ACCESS_MASK.STANDARD_RIGHTS_WRITE Or _
    SC_MANAGER_CREATE_SERVICE Or _
    SC_MANAGER_MODIFY_BOOT_CONFIG

    GENERIC_EXECUTE = ACCESS_MASK.STANDARD_RIGHTS_EXECUTE Or _
    SC_MANAGER_CONNECT Or SC_MANAGER_LOCK

    GENERIC_ALL = SC_MANAGER_ALL_ACCESS

  End Enum

Notes:

Tips & Tricks:

Pass in Null/Nothing for MachineName to use the local machine.

Pass in Null/nothing as the database name to use the default SERVICES_ACTIVE_DATABASE

Sample Code:

VB:
Const STANDARD_RIGHTS_REQUIRED As Int32 = &HF0000

    Const SC_MANAGER_CONNECT As Int32 = &H1
    Const SC_MANAGER_CREATE_SERVICE As Int32 = &H2
    Const SC_MANAGER_ENUMERATE_SERVICE As Int32 = &H4
    Const SC_MANAGER_LOCK As Int32 = &H8
    Const SC_MANAGER_QUERY_LOCK_STATUS As Int32 = &H10
    Const SC_MANAGER_MODIFY_BOOT_CONFIG As Int32 = &H20

    Const SC_MANAGER_ALL_ACCESS As Int32 = STANDARD_RIGHTS_REQUIRED Or _
                        SC_MANAGER_CONNECT Or _
                        SC_MANAGER_CREATE_SERVICE Or _
                        SC_MANAGER_ENUMERATE_SERVICE Or _
                        SC_MANAGER_LOCK Or _
                        SC_MANAGER_QUERY_LOCK_STATUS Or _
                        SC_MANAGER_MODIFY_BOOT_CONFIG

    Dim scHandle As IntPtr = OpenSCManager(Nothing, Nothing, SC_MANAGER_ALL_ACCESS )
    MsgBox(scHandle.ToString)
    CloseServiceHandle(scHandle)
C#:
    IntPtr handle = OpenSCManager( null, null, (uint)SCM_ACCESS.SC_MANAGER_ALL_ACCESS );
    if ( handle != IntPtr.Zero )
    {
        CloseServiceHandle( handle );
    }

Alternative Managed API:

Do you know one? Please contribute it!

Documentation