Hi,
Does anyone know how call Win32 native API GetTokenInformation() by using
C#? Any sample code would be helpful. Thanks!
Vincent 7 29227
Vincent, Does anyone know how call Win32 native API GetTokenInformation() by using C#? Any sample code would be helpful. Thanks!
What kind of information are you going to retrieve with it, i.e which
TOKEN_INFORMATION_CLASS value are you going to pass in?
Mattias
--
Mattias Sjögren [MVP] mattias @ mvps.org http://www.msjogren.net/dotnet/
Please reply only to the newsgroup.
I want to retrieve the access tokens for a user, and I want to pass in the
TOKEN_GROUPS. Thanks for the reply!
"Mattias Sjögren" <ma********************@mvps.org> wrote in message
news:OO**************@tk2msftngp13.phx.gbl... Vincent,
Does anyone know how call Win32 native API GetTokenInformation() by using C#? Any sample code would be helpful. Thanks!
What kind of information are you going to retrieve with it, i.e which TOKEN_INFORMATION_CLASS value are you going to pass in? Mattias
-- Mattias Sjögren [MVP] mattias @ mvps.org http://www.msjogren.net/dotnet/ Please reply only to the newsgroup.
Vincent Nguyen wrote:
|| I don't know much about VB.NET. Do you have any C# sample code for
|| this? Thanks!
Is this of any help?
// Begin of code sample
using System;
using System.Text;
using System.Runtime.InteropServices;
using System.Security.Permissions;
using System.Security.Principal;
using System.Diagnostics;
// Forward declarations
using LUID = System.Int64;
using HANDLE = System.IntPtr;
class Tester {
public const int TOKEN_QUERY = 0X00000008;
const int ERROR_NO_MORE_ITEMS = 259;
enum TOKEN_INFORMATION_CLASS
{
TokenUser = 1,
TokenGroups,
TokenPrivileges,
TokenOwner,
TokenPrimaryGroup,
TokenDefaultDacl,
TokenSource,
TokenType,
TokenImpersonationLevel,
TokenStatistics,
TokenRestrictedSids,
TokenSessionId
}
[StructLayout(LayoutKind.Sequential)]
struct TOKEN_USER
{
public _SID_AND_ATTRIBUTES User;
}
[StructLayout(LayoutKind.Sequential)]
public struct _SID_AND_ATTRIBUTES
{
public IntPtr Sid;
public int Attributes;
}
[DllImport("advapi32")]
static extern bool OpenProcessToken(
HANDLE ProcessHandle, // handle to process
int DesiredAccess, // desired access to process
ref IntPtr TokenHandle // handle to open access token
);
[DllImport("kernel32")]
static extern HANDLE GetCurrentProcess();
[DllImport("advapi32", CharSet=CharSet.Auto)]
static extern bool GetTokenInformation(
HANDLE hToken,
TOKEN_INFORMATION_CLASS tokenInfoClass,
IntPtr TokenInformation,
int tokeInfoLength,
ref int reqLength);
[DllImport("kernel32")]
static extern bool CloseHandle(HANDLE handle);
[DllImport("advapi32", CharSet=CharSet.Auto)]
static extern bool LookupAccountSid
(
[In,MarshalAs(UnmanagedType.LPTStr)] string lpSystemName, // name of local or remote computer
IntPtr pSid, // security identifier
StringBuilder Account, // account name buffer
ref int cbName, // size of account name buffer
StringBuilder DomainName, // domain name
ref int cbDomainName, // size of domain name buffer
ref int peUse // SID type
// ref _SID_NAME_USE peUse // SID type
);
[DllImport("advapi32", CharSet=CharSet.Auto)]
static extern bool ConvertSidToStringSid(
IntPtr pSID,
[In,Out,MarshalAs(UnmanagedType.LPTStr)] ref string pStringSid);
public static void Main() {
string processName = Process.GetCurrentProcess().ProcessName;
Process[] myProcesses = Process.GetProcessesByName(processName);
if(myProcesses.Length == 0)
Console.WriteLine("Could not find notepad processes on remote machine");
foreach(Process myProcess in myProcesses)
{
Console.Write("Process Name : " + myProcess.ProcessName + " Process ID : "
+ myProcess.Id + " MachineName : " + myProcess.MachineName + "\n");
DumpUserInfo(myProcess.Handle);
}
}
static void DumpUserInfo(HANDLE pToken)
{
int Access = TOKEN_QUERY;
StringBuilder sb = new StringBuilder();
sb.AppendFormat("\nToken dump performed on {0}\n\n", DateTime.Now);
HANDLE procToken = IntPtr.Zero;
if ( OpenProcessToken( pToken, Access, ref procToken ) )
{
sb.Append("Process Token:\n");
sb.Append(PerformDump(procToken));
CloseHandle(procToken);
}
Console.WriteLine(sb.ToString());
}
static StringBuilder PerformDump(HANDLE token)
{
StringBuilder sb = new StringBuilder();
TOKEN_USER tokUser;
const int bufLength = 256;
IntPtr tu = Marshal.AllocHGlobal( bufLength );
int cb = bufLength;
GetTokenInformation( token, TOKEN_INFORMATION_CLASS.TokenUser, tu, cb, ref cb );
tokUser = (TOKEN_USER) Marshal.PtrToStructure(tu, typeof(TOKEN_USER) );
sb.Append(DumpAccountSid(tokUser.User.Sid));
Marshal.FreeHGlobal( tu );
return sb;
}
static string DumpAccountSid(IntPtr SID)
{
int cchAccount = 0;
int cchDomain = 0;
int snu = 0 ;
StringBuilder sb = new StringBuilder();
// Caller allocated buffer
StringBuilder Account= null;
StringBuilder Domain = null;
bool ret = LookupAccountSid(null, SID, Account, ref cchAccount, Domain, ref cchDomain, ref snu);
if ( ret == true )
if ( Marshal.GetLastWin32Error() == ERROR_NO_MORE_ITEMS )
return "Error";
try
{
Account = new StringBuilder( cchAccount );
Domain = new StringBuilder( cchDomain );
ret = LookupAccountSid(null, SID, Account, ref cchAccount, Domain, ref cchDomain, ref snu);
if (ret)
{
sb.Append(Domain);
sb.Append(@"\\");
sb.Append(Account);
}
else
Console.WriteLine("logon account (no name) ");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
}
string SidString = null;
ConvertSidToStringSid(SID, ref SidString);
sb.Append("\nSID: ");
sb.Append(SidString);
return sb.ToString();
}
}
// End of code sample
Willy.
Willy,
Thank you very much! The sample code is helped a lot! I really appriciate
your helps!
Vincent
"Willy Denoyette [MVP]" <wi*************@skynet.be> wrote in message
news:uc**************@TK2MSFTNGP09.phx.gbl... Vincent Nguyen wrote: || I don't know much about VB.NET. Do you have any C# sample code for || this? Thanks!
Is this of any help?
// Begin of code sample using System; using System.Text; using System.Runtime.InteropServices; using System.Security.Permissions; using System.Security.Principal; using System.Diagnostics;
// Forward declarations using LUID = System.Int64; using HANDLE = System.IntPtr; class Tester { public const int TOKEN_QUERY = 0X00000008;
const int ERROR_NO_MORE_ITEMS = 259;
enum TOKEN_INFORMATION_CLASS { TokenUser = 1, TokenGroups, TokenPrivileges, TokenOwner, TokenPrimaryGroup, TokenDefaultDacl, TokenSource, TokenType, TokenImpersonationLevel, TokenStatistics, TokenRestrictedSids, TokenSessionId }
[StructLayout(LayoutKind.Sequential)] struct TOKEN_USER { public _SID_AND_ATTRIBUTES User; }
[StructLayout(LayoutKind.Sequential)] public struct _SID_AND_ATTRIBUTES { public IntPtr Sid; public int Attributes; } [DllImport("advapi32")] static extern bool OpenProcessToken( HANDLE ProcessHandle, // handle to process int DesiredAccess, // desired access to process ref IntPtr TokenHandle // handle to open access token );
[DllImport("kernel32")] static extern HANDLE GetCurrentProcess();
[DllImport("advapi32", CharSet=CharSet.Auto)] static extern bool GetTokenInformation( HANDLE hToken, TOKEN_INFORMATION_CLASS tokenInfoClass, IntPtr TokenInformation, int tokeInfoLength, ref int reqLength);
[DllImport("kernel32")] static extern bool CloseHandle(HANDLE handle);
[DllImport("advapi32", CharSet=CharSet.Auto)] static extern bool LookupAccountSid ( [In,MarshalAs(UnmanagedType.LPTStr)] string lpSystemName, // name of
local or remote computer IntPtr pSid, // security identifier StringBuilder Account, // account name buffer ref int cbName, // size of account name buffer StringBuilder DomainName, // domain name ref int cbDomainName, // size of domain name buffer ref int peUse // SID type // ref _SID_NAME_USE peUse // SID type );
[DllImport("advapi32", CharSet=CharSet.Auto)] static extern bool ConvertSidToStringSid( IntPtr pSID, [In,Out,MarshalAs(UnmanagedType.LPTStr)] ref string pStringSid);
public static void Main() { string processName = Process.GetCurrentProcess().ProcessName; Process[] myProcesses = Process.GetProcessesByName(processName); if(myProcesses.Length == 0) Console.WriteLine("Could not find notepad processes on remote
machine"); foreach(Process myProcess in myProcesses) { Console.Write("Process Name : " + myProcess.ProcessName + "
Process ID : " + myProcess.Id + " MachineName : " + myProcess.MachineName + "\n"); DumpUserInfo(myProcess.Handle); } }
static void DumpUserInfo(HANDLE pToken) { int Access = TOKEN_QUERY; StringBuilder sb = new StringBuilder(); sb.AppendFormat("\nToken dump performed on {0}\n\n", DateTime.Now); HANDLE procToken = IntPtr.Zero; if ( OpenProcessToken( pToken, Access, ref procToken ) ) { sb.Append("Process Token:\n"); sb.Append(PerformDump(procToken)); CloseHandle(procToken); } Console.WriteLine(sb.ToString()); } static StringBuilder PerformDump(HANDLE token) { StringBuilder sb = new StringBuilder(); TOKEN_USER tokUser; const int bufLength = 256; IntPtr tu = Marshal.AllocHGlobal( bufLength ); int cb = bufLength; GetTokenInformation( token, TOKEN_INFORMATION_CLASS.TokenUser, tu, cb,
ref cb ); tokUser = (TOKEN_USER) Marshal.PtrToStructure(tu, typeof(TOKEN_USER) ); sb.Append(DumpAccountSid(tokUser.User.Sid)); Marshal.FreeHGlobal( tu ); return sb; }
static string DumpAccountSid(IntPtr SID) { int cchAccount = 0; int cchDomain = 0; int snu = 0 ; StringBuilder sb = new StringBuilder();
// Caller allocated buffer StringBuilder Account= null; StringBuilder Domain = null; bool ret = LookupAccountSid(null, SID, Account, ref cchAccount, Domain,
ref cchDomain, ref snu); if ( ret == true ) if ( Marshal.GetLastWin32Error() == ERROR_NO_MORE_ITEMS ) return "Error"; try { Account = new StringBuilder( cchAccount ); Domain = new StringBuilder( cchDomain ); ret = LookupAccountSid(null, SID, Account, ref cchAccount, Domain,
ref cchDomain, ref snu); if (ret) { sb.Append(Domain); sb.Append(@"\\"); sb.Append(Account); } else Console.WriteLine("logon account (no name) "); } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { } string SidString = null; ConvertSidToStringSid(SID, ref SidString); sb.Append("\nSID: "); sb.Append(SidString); return sb.ToString(); } } // End of code sample
Willy.
Vincent, I don't know much about VB.NET. Do you have any C# sample code for this?
I don't, but try something like this (using most of the defs from
Willy's post):
int cb = 0;
// First call to get buffer size needed
GetTokenInformation( token, TOKEN_INFORMATION_CLASS.TokenGroups,
IntPtr.Zero, 0, ref cb );
IntPtr tg = Marshal.AllocHGlobal( cb );
// Second call to actually retrieve data
GetTokenInformation( token, TOKEN_INFORMATION_CLASS.TokenGroups, tg,
cb, ref cb );
// Read TOKEN_GROUPS.GroupCount
int groupCount = Marshal.ReadInt32( tg );
// Read each SID_AND_ATTRIBUTES from TOKEN_GROUPS.Groups
int pSaa = (int)tg + 4;
for ( int i = 0; i < groupCount; i++ ) {
_SID_AND_ATTRIBUTES saa = (_SID_AND_ATTRIBUTES)
Marshal.PtrToStructure((IntPtr)pSaa, typeof(_SID_AND_ATTRIBUTES));
// do stuff with _SID_AND_ATTRIBUTES here
pSaa += Marshal.SizeOf( typeof(_SID_AND_ATTRIBUTES) );
}
....
Marshal.FreeHGlobal( tg );
Mattias
--
Mattias Sjögren [MVP] mattias @ mvps.org http://www.msjogren.net/dotnet/
Please reply only to the newsgroup.
Mattias,
The sample code worked perfect! Thank you very much for your helps!
Vincent
"Mattias Sjögren" <ma********************@mvps.org> wrote in message
news:eP**************@TK2MSFTNGP12.phx.gbl... Vincent,
I don't know much about VB.NET. Do you have any C# sample code for this?
I don't, but try something like this (using most of the defs from Willy's post):
int cb = 0; // First call to get buffer size needed GetTokenInformation( token, TOKEN_INFORMATION_CLASS.TokenGroups, IntPtr.Zero, 0, ref cb ); IntPtr tg = Marshal.AllocHGlobal( cb ); // Second call to actually retrieve data GetTokenInformation( token, TOKEN_INFORMATION_CLASS.TokenGroups, tg, cb, ref cb ); // Read TOKEN_GROUPS.GroupCount int groupCount = Marshal.ReadInt32( tg ); // Read each SID_AND_ATTRIBUTES from TOKEN_GROUPS.Groups int pSaa = (int)tg + 4; for ( int i = 0; i < groupCount; i++ ) { _SID_AND_ATTRIBUTES saa = (_SID_AND_ATTRIBUTES) Marshal.PtrToStructure((IntPtr)pSaa, typeof(_SID_AND_ATTRIBUTES)); // do stuff with _SID_AND_ATTRIBUTES here pSaa += Marshal.SizeOf( typeof(_SID_AND_ATTRIBUTES) ); } ... Marshal.FreeHGlobal( tg ); Mattias
-- Mattias Sjögren [MVP] mattias @ mvps.org http://www.msjogren.net/dotnet/ Please reply only to the newsgroup. This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
by: sunil s via DotNetMonster.com |
last post by:
Hi,
I've got a native C++ app which calls a 3rd parth .NET DLL using the
LoadLibrary/GetProcAddress functions. This works fine when the DLL is
located in the app directory, but if I move it out...
|
by: Marek Lewczuk |
last post by:
I'm looking at "TODO list for PostgreSQL" and "Fix upper()/lower() to
work for multibyte encodings" has no dash (-) -- so it won't be made in
7.5 ?
Another question is about WIN32 native release...
|
by: Chi Tang |
last post by:
Hi,
Does anybody know how to call a unmanaged win32 dll function from a .NET C#
managed application? Do I need to write a managed C++ dll or a COM dll
which become a server of .net C# app or I...
|
by: John Lee |
last post by:
Hi,
I have two web services and they are setup as "Integrated Windows
Authentication" only and they are both assigned to application pool with
Domain Account.
I can use ws.Credentials =...
|
by: bb |
last post by:
I have a windows network device driver written in c++ and a user
interface im porting to c#, my problem is i dont seem to be getting
notified of the event calls from the driver to the c# app
im...
|
by: dolphin |
last post by:
Hi All!
I have a question that how to call a function just using a string.
For example
There is a .cpp file named a.cpp.There are some functions::fun1()
fun2() fun3().
I have another fucntion...
|
by: Timothy Madden |
last post by:
Hello
I would like to use php-cli as a sort of shell scripting language or
generic scripting language.
I have php 5.2 on WindowsXP and I would like to call Win32 API functions
like...
|
by: tess1243 |
last post by:
How to call a web service using its url from a Windows application using C#? Any Sample code please??
|
by: Naga Prakash |
last post by:
Hello All,
I'm very much new to PERL scripting. I'm the admin for an online tool which has some Perl scripts. And i have a problem executing one of the script. I'm just writing a problematic code in...
|
by: isladogs |
last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM).
In this month's session, we are pleased to welcome back...
|
by: isladogs |
last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM).
In this month's session, we are pleased to welcome back...
|
by: PapaRatzi |
last post by:
Hello,
I am teaching myself MS Access forms design and Visual Basic. I've created a table to capture a list of Top 30 singles and forms to capture new entries. The final step is a form (unbound)...
|
by: CloudSolutions |
last post by:
Introduction:
For many beginners and individual users, requiring a credit card and email registration may pose a barrier when starting to use cloud servers. However, some cloud server providers now...
|
by: Defcon1945 |
last post by:
I'm trying to learn Python using Pycharm but import shutil doesn't work
|
by: Shællîpôpï 09 |
last post by:
If u are using a keypad phone, how do u turn on JavaScript, to access features like WhatsApp, Facebook, Instagram....
|
by: af34tf |
last post by:
Hi Guys, I have a domain whose name is BytesLimited.com, and I want to sell it. Does anyone know about platforms that allow me to list my domain in auction for free. Thank you
|
by: Faith0G |
last post by:
I am starting a new it consulting business and it's been a while since I setup a new website. Is wordpress still the best web based software for hosting a 5 page website? The webpages will be...
|
by: isladogs |
last post by:
The next Access Europe User Group meeting will be on Wednesday 3 Apr 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM).
In this session, we are pleased to welcome former...
| |