[DllImport("advapi32.dll")]
static extern IntPtr FreeSid(IntPtr pSid);
- or -
[DllImport("advapi32")]
public static extern void FreeSid(IntPtr pSid);
(since FreeSid returns a PVOID)
Declare Function FreeSid Lib "advapi32.dll" (ByVal pSid As IntPtr) As IntPtr
None.
None.
Please add some!
using System;
using System.Runtime.InteropServices;
using System.Text;
class Test
{
static void Main() {
string strSid = GetSIDForAccount("Administrator");
Console.WriteLine( strSid );
}
public static string GetSIDForAccount(string Account) {
long winErrorCode = 0; //contains the last error
//pointer and size for the SID
IntPtr pSid = IntPtr.Zero;
int iSidSize = 0;
//StringBuilder for Domain
StringBuilder sbDomain = new StringBuilder();
int iDomainSize = 0;
//account-type variable for lookup
int iAccountType = 0;
//get required buffer size (iSidSize=0 causes this...)
LookupAccountName(String.Empty, Account, pSid, ref iSidSize,
sbDomain, ref iDomainSize, ref iAccountType);
//allocate buffers
sbDomain = new StringBuilder(iDomainSize);
pSid = Marshal.AllocHGlobal(iSidSize);
//lookup the SID for the account
bool bResult = LookupAccountName(String.Empty,
Account,
pSid,
ref iSidSize,
sbDomain,
ref iDomainSize,
ref iAccountType);
if (!bResult) {
winErrorCode = GetLastError();
Console.WriteLine("LookupAccountName failed: "+ winErrorCode);
FreeSid(pSid);
throw new ApplicationException("Could not read SID");
}
string strSID = "";
if ( ConvertSidToStringSid( pSid, ref strSID)) {
FreeSid(pSid);
return strSID;
} else {
throw new ApplicationException("Could not convert SID");
}
}
[DllImport("kernel32.dll")]
private static extern int GetLastError();
[DllImport( "advapi32.dll", CharSet=CharSet.Auto, SetLastError=true, PreserveSig=true)]
private static extern bool LookupAccountName(
string lpSystemName,
string lpAccountName,
IntPtr psid,
ref int cbsid,
StringBuilder domainName, //StringBuilder or string?
ref int cbdomainLength,
ref int use );
[DllImport("advapi32.dll", CharSet=CharSet.Auto)]
private static extern bool ConvertSidToStringSid(
IntPtr pSID,
[In,Out,MarshalAs(UnmanagedType.LPTStr)] ref string strSID);
[DllImport("advapi32")]
private static extern void FreeSid(IntPtr pSid);
}
Do you know one? Please contribute it!