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", SetLastError=true, CharSet=CharSet.Auto)]
    public static extern IntPtr OpenSCManager(string machineName, string databaseName, SC_MANAGER_ACCESS dwAccess);

VB Signature:

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

User-Defined Types:

[Flags]
public enum SC_MANAGER_ACCESS : uint
{
    CONNECT         = 0x0001,
    CREATE_SERVICE      = 0x0002,
    ENUMERATE_SERVICE   = 0x0004,
    LOCK        = 0x0008,
    QUERY_LOCK_STATUS   = 0x0010,
    MODIFY_BOOT_CONFIG  = 0x0020,

    ALL_ACCESS      =    // STANDARD_RIGHTS_REQUIRED      |
                CONNECT        |
                CREATE_SERVICE     |
                ENUMERATE_SERVICE  |
                LOCK           |
                QUERY_LOCK_STATUS  |
                MODIFY_BOOT_CONFIG
}

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#:

        const int SC_MANAGER_CONNECT            = 0x01;
        const int SC_MANAGER_CREATE_SERVICE        = 0x02;
        const int SC_MANAGER_ENUMERATE_SERVICE    = 0x04;
        const int SC_MANAGER_LOCK                = 0x08;
        const int SC_MANAGER_QUERY_LOCK_STATUS    = 0x10;
        const int SC_MANAGER_MODIFY_BOOT_CONFIG    = 0x20;
        const int SC_MANAGER_ALL_ACCESS            = 0x3f;
        public const uint GENERIC_READ          = 0x80000000;
        public const uint GENERIC_WRITE         = 0x40000000;
        public const uint GENERIC_EXECUTE           = 0x20000000;
        public const uint GENERIC_ALL           = 0x10000000;

    IntPtr handle = OpenSCManager( null, null, SCM_ACCESS.SC_MANAGER_ALL_ACCESS );
    if ( handle != IntPtr.Zero )
    {
        CloseServiceHandle( handle );
    }


Alternative Managed API:

Do you know one? Please contribute it!

Documentation