[DllImport("advapi32.dll", SetLastError=true)]
static extern bool GetTokenInformation(
IntPtr TokenHandle,
TOKEN_INFORMATION_CLASS TokenInformationClass,
IntPtr TokenInformation,
uint TokenInformationLength,
out uint ReturnLength);
[DllImport("advapi32.dll", SetLastError=true)]
static extern bool GetTokenInformation(
IntPtr TokenHandle,
uint TokenInformationClass,
IntPtr TokenInformation,
uint TokenInformationLength,
out uint ReturnLength);
Public Declare Function GetTokenInformation Lib "advapi32.dll" ( _
ByVal TokenHandle As IntPtr, ByVal TokenInformationClass As TOKEN_INFORMATION_CLASS, _
ByVal TokenInformation As IntPtr, ByVal TokenInformationLength As System.UInt32, _
ByRef ReturnLength As System.UInt32) As Boolean
Call once with zero for the third and fourth parameters to obtain the required size, then allocate the buffer and call again supplying these parameters.
Please add some!
// Prints out sid of current user
using System;
using System.Runtime.InteropServices;
using System.Security.Principal;
using System.Text;
namespace test
{
class clsLookupAccountName
{
enum TOKEN_INFORMATION_CLASS
{
TokenUser = 1,
TokenGroups,
TokenPrivileges,
TokenOwner,
TokenPrimaryGroup,
TokenDefaultDacl,
TokenSource,
TokenType,
TokenImpersonationLevel,
TokenStatistics,
TokenRestrictedSids,
TokenSessionId,
TokenGroupsAndPrivileges,
TokenSessionReference,
TokenSandBoxInert,
TokenAuditPolicy,
TokenOrigin
}
public struct TOKEN_USER
{
public SID_AND_ATTRIBUTES User ;
}
[StructLayout(LayoutKind.Sequential)]
public struct SID_AND_ATTRIBUTES
{
public IntPtr Sid ;
public int Attributes ;
}
// Using IntPtr for pSID insted of Byte[]
[DllImport("advapi32", CharSet=CharSet.Auto, SetLastError=true)]
static extern bool ConvertSidToStringSid(
IntPtr pSID,
out IntPtr ptrSid);
[DllImport("kernel32.dll")]
static extern IntPtr LocalFree(IntPtr hMem);
[DllImport("advapi32.dll", SetLastError=true)]
static extern bool GetTokenInformation(
IntPtr TokenHandle,
TOKEN_INFORMATION_CLASS TokenInformationClass,
IntPtr TokenInformation,
int TokenInformationLength,
out int ReturnLength);
[STAThread]
static void Main(string[] args)
{
int TokenInfLength = 0 ;
bool Result ;
// first call gets lenght of TokenInformation
Result = GetTokenInformation( WindowsIdentity.GetCurrent().Token , TOKEN_INFORMATION_CLASS.TokenUser , IntPtr.Zero , TokenInfLength , out TokenInfLength );
IntPtr TokenInformation = Marshal.AllocHGlobal( TokenInfLength ) ;
Result = GetTokenInformation( WindowsIdentity.GetCurrent().Token , TOKEN_INFORMATION_CLASS.TokenUser , TokenInformation , TokenInfLength , out TokenInfLength ) ;
if( Result )
{
TOKEN_USER TokenUser = ( TOKEN_USER )Marshal.PtrToStructure( TokenInformation , typeof( TOKEN_USER ) ) ;
IntPtr pstr = IntPtr.Zero;
Boolean ok = ConvertSidToStringSid( TokenUser.User.Sid , out pstr );
string sidstr = Marshal.PtrToStringAuto( pstr );
LocalFree(pstr);
Console.WriteLine(@"Found sid {0}",sidstr);
}
Marshal.FreeHGlobal( TokenInformation );
Console.ReadLine();
}
}
}
There's a sample based on this at http://stackoverflow.com/questions/2146153/how-to-get-the-logon-sid-in-c/2146418#2146418 that gets the LogonSID instead.
Do you know one? Please contribute it!