isvalidsid (advapi32)
Last changed: -83.218.236.94

.
Summary
TODO - a short description

C# Signature:

[DllImport("advapi32.dll", SetLastError=true)]
static extern bool IsValidSid([MarshalAs(UnmanagedType.LPArray)] byte[] pSid);

VB Signature:

Declare Function IsValidSid Lib "advapi32.dll" (TODO) As TODO

User-Defined Types:

None.

Alternative Managed API:

Do you know one? Please contribute it!

Notes:

None.

Tips & Tricks:

Please add some!

Sample Code:

    class Program {
    const int NO_ERROR = 0;
    const int ERROR_INSUFFICIENT_BUFFER = 122;
    const int ERROR_INVALID_FLAGS = 1004; // On Windows Server 2003 this error is/can be returned, but processing can still continue

    enum SID_NAME_USE {
        SidTypeUser = 1,
        SidTypeGroup,
        SidTypeDomain,
        SidTypeAlias,
        SidTypeWellKnownGroup,
        SidTypeDeletedAccount,
        SidTypeInvalid,
        SidTypeUnknown,
        SidTypeComputer
    }

    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    static extern bool LookupAccountName(
        string lpSystemName,
        string lpAccountName,
        [MarshalAs(UnmanagedType.LPArray)] byte[] Sid,
        ref uint cbSid,
        StringBuilder ReferencedDomainName,
        ref uint cchReferencedDomainName,
        out SID_NAME_USE peUse);

    [DllImport("advapi32", CharSet = CharSet.Auto, SetLastError = true)]
    static extern bool ConvertSidToStringSid(
        [MarshalAs(UnmanagedType.LPArray)] byte[] pSID,
        out IntPtr ptrSid);

    [DllImport("kernel32.dll")]
    static extern IntPtr LocalFree(IntPtr hMem);

    [DllImport("advapi32.dll", SetLastError = true)]
    static extern bool IsValidSid([MarshalAs(UnmanagedType.LPArray)] byte[] pSid);

    static void Main(string[] args) {
        string accountName = "user1";
        byte [] Sid = null;
        uint cbSid = 0;
        StringBuilder referencedDomainName = new StringBuilder();
        uint cchReferencedDomainName = (uint)referencedDomainName.Capacity;
        SID_NAME_USE sidUse;

        int err = NO_ERROR;
        if (!LookupAccountName(null,accountName,Sid,ref cbSid,referencedDomainName,ref cchReferencedDomainName,out sidUse))
        {
        err = Marshal.GetLastWin32Error();
        if (err == ERROR_INSUFFICIENT_BUFFER || err == ERROR_INVALID_FLAGS)
        {
            Sid = new byte[cbSid];
            referencedDomainName.EnsureCapacity((int)cchReferencedDomainName);
            err = NO_ERROR;
            if (!LookupAccountName(null,accountName,Sid,ref cbSid,referencedDomainName,ref cchReferencedDomainName,out sidUse))
            err = Marshal.GetLastWin32Error();
        }
        }
        else
        {
        // Consider throwing an exception since no result was found
        }
        if (err == 0)
        {
        if (IsValidSid(Sid)) {
            Console.WriteLine("SID is a valid SID..");
        } else {
            Console.WriteLine("SID  is an unvalid SID..");
        }
        IntPtr ptrSid;
        if (!ConvertSidToStringSid(Sid,out ptrSid))
        {
            err = Marshal.GetLastWin32Error();
            Console.WriteLine(@"Could not convert sid to string. Error : {0}",err);
        }
        else
        {
            string sidString = Marshal.PtrToStringAuto(ptrSid);
            LocalFree(ptrSid);
            Console.WriteLine(@"Found sid {0} : {1}",sidUse,sidString);
        }
        }
        else
        Console.WriteLine(@"Error : {0}",err);
    }
    }

Documentation
IsValidSid on MSDN