Hi,
Does anyone know how call Win32 native API GetTokenInformation() by using
C#? Any sample code would be helpful. Thanks!
Vincent 7 29264
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: ryjfgjl |
last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
|
by: BarryA |
last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
|
by: nemocccc |
last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
|
by: Sonnysonu |
last post by:
This is the data of csv file
1 2 3
1 2 3
1 2 3
1 2 3
2 3
2 3
3
the lengths should be different i have to store the data by column-wise with in the specific length.
suppose the i have to...
|
by: Hystou |
last post by:
There are some requirements for setting up RAID:
1. The motherboard and BIOS support RAID configuration.
2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
|
by: marktang |
last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
|
by: Hystou |
last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
|
by: Oralloy |
last post by:
Hello folks,
I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>".
The problem is that using the GNU compilers,...
|
by: jinu1996 |
last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
| |