AllocateAndInitializeSid (advapi32)
Last changed: -115.108.16.247

.
Summary
Allocates and initializes a security identifier (SID) with up to eight subauthorities.

C# Signature:

[DllImport("advapi32.dll", SetLastError=true)]
static extern bool AllocateAndInitializeSid(
    ref SidIdentifierAuthority pIdentifierAuthority,
    byte nSubAuthorityCount,
    int dwSubAuthority0, int dwSubAuthority1,
    int dwSubAuthority2, int dwSubAuthority3,
    int dwSubAuthority4, int dwSubAuthority5,
    int dwSubAuthority6, int dwSubAuthority7,
    out IntPtr pSid);

VB Signature:

Declare Function AllocateAndInitializeSid Lib "advapi32.dll" ( _
   ByVal pIdentifierAuthority As IntPtr, _
   ByVal nSubAuthorityCount As Byte, _
   ByVal dwSubAuthority0 As Integer, ByVal dwSubAuthority1 As Integer, _
   ByVal dwSubAuthority2 As Integer, ByVal dwSubAuthority3 As Integer, _
   ByVal dwSubAuthority4 As Integer, ByVal dwSubAuthority5 As Integer, _
   ByVal dwSubAuthority6 As Integer, ByVal dwSubAuthority7 As Integer, _
   ByRef pSid As IntPtr) As Boolean

User-Defined Types:

None.

Notes:

The returned SID must be freed with FreeSid.

You will need to reference System.Runtime.InteropServices

Tips & Tricks:

Please add some!

C# Sample Code:

    [StructLayout(LayoutKind.Sequential)]
    public struct SidIdentifierAuthority
    {
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6, ArraySubType = UnmanagedType.I1)]
        public byte[] Value;
    }

    const int NtSecurityAuthority = 5;
    const int AuthenticatedUser = 11;
    SidIdentifierAuthority NtAuthority = new SidIdentifierAuthority();
    NtAuthority.Value = new byte[] { 0, 0, 0, 0, 0, NtSecurityAuthority };

    IntPtr AuthenticatedUsersSid = IntPtr.Zero;

    // Get the SID for the Authenticated Uses group
    Native.AllocateAndInitializeSid(ref NtAuthority, 1, AuthenticatedUser, 0, 0, 0, 0, 0, 0, 0, out AuthenticatedUsersSid);

    // Remember to free the SID when you are done
    Native.FreeSid(AuthenticatedUsersSid);

Vb.Net Sample Code:

    Structure SID_IDENTIFIER_AUTHORITY
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=6)> Dim Value() As Byte
    End Structure

    Const SECURITY_NT_AUTHORITY As Integer = 5
    Const SECURITY_BUILTIN_DOMAIN_RID As Integer = 32
    Const DOMAIN_ALIAS_RID_ADMINS As Integer = 544

    Dim AdminGroup as IntPtr
    Dim NtAuthority As SID_IDENTIFIER_AUTHORITY
    ReDim NtAuthority.Value(6)
    NtAuthority.Value(5) = SECURITY_NT_AUTHORITY

    If Not AllocateAndInitializeSid(NtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, AdminGroup) Then
        MsgBox("Yikes, couldn't create the Local Admininstrator Group's SID")
        Exit Sub
    End If

Alternative Managed API:

Do you know one? Please contribute it!

Documentation