.net读取Windows登录用户信息(downmoon)

前天,在CodeProject看到一篇文章http://www.codeproject.com/KB/system/LSAEnumUserSessions.aspx

如何读取windows 当前登录用户的状态信息。

主要代码分享如下:

一:导入dll

/**//************************************************************************/ /**//* The following Interop code should be placed in a sealed internal NativeMethod class * but has been left here to simplify the example. /************************************************************************/ [DllImport("secur32.dll", SetLastError = false)] private static extern uint LsaFreeReturnBuffer(IntPtr buffer); [DllImport("Secur32.dll", SetLastError = false)] private static extern uint LsaEnumerateLogonSessions(out UInt64 LogonSessionCount, out IntPtr LogonSessionList); [DllImport("Secur32.dll", SetLastError = false)] private static extern uint LsaGetLogonSessionData(IntPtr luid, out IntPtr ppLogonSessionData); [StructLayout(LayoutKind.Sequential)] private struct LSA_UNICODE_STRING { public UInt16 Length; public UInt16 MaximumLength; public IntPtr buffer; } [StructLayout(LayoutKind.Sequential)] private struct LUID { public UInt32 LowPart; public UInt32 HighPart; } [StructLayout(LayoutKind.Sequential)] private struct SECURITY_LOGON_SESSION_DATA { public UInt32 Size; public LUID LoginID; public LSA_UNICODE_STRING Username; public LSA_UNICODE_STRING LoginDomain; public LSA_UNICODE_STRING AuthenticationPackage; public UInt32 LogonType; public UInt32 Session; public IntPtr PSiD; public UInt64 LoginTime; public LSA_UNICODE_STRING LogonServer; public LSA_UNICODE_STRING DnsDomainName; public LSA_UNICODE_STRING Upn; } private enum SECURITY_LOGON_TYPE : uint { Interactive = 2, //The security principal is logging on interactively. Network, //The security principal is logging using a network. Batch, //The logon is for a batch process. Service, //The logon is for a service account. Proxy, //Not supported. Unlock, //The logon is an attempt to unlock a workstation. NetworkCleartext, //The logon is a network logon with cleartext credentials. NewCredentials, // Allows the caller to clone its current token and specify new credentials for outbound connections. The new logon session has the same local identity but uses different credentials for other network connections. RemoteInteractive, // A terminal server session that is both remote and interactive. CachedInteractive, // Attempt to use the cached credentials without going out across the network. CachedRemoteInteractive, // Same as RemoteInteractive, except used internally for auditing purposes. CachedUnlock // The logon is an attempt to unlock a workstation. }

二、调用方法,写入一个ListBox中


public void PopulateListbox() { System.Security.Principal.WindowsIdentity currentUser = System.Security.Principal.WindowsIdentity.GetCurrent(); DateTime systime = new DateTime(1601, 1, 1, 0, 0, 0, 0); //win32 systemdate UInt64 count; IntPtr luidPtr = IntPtr.Zero; LsaEnumerateLogonSessions(out count, out luidPtr); //gets an array of pointers to LUIDs IntPtr iter = luidPtr; //set the pointer to the start of the array for (ulong i = 0; i < count; i++) //for each pointer in the array { IntPtr sessionData; LsaGetLogonSessionData(iter, out sessionData); SECURITY_LOGON_SESSION_DATA data = (SECURITY_LOGON_SESSION_DATA)Marshal.PtrToStructure(sessionData, typeof(SECURITY_LOGON_SESSION_DATA)); //if we have a valid logon if (data.PSiD != IntPtr.Zero) { //get the security identifier for further use System.Security.Principal.SecurityIdentifier sid = new System.Security.Principal.SecurityIdentifier(data.PSiD); //extract some useful information from the session data struct string username = Marshal.PtrToStringUni(data.Username.buffer).Trim(); //get the account username string domain = Marshal.PtrToStringUni(data.LoginDomain.buffer).Trim(); //domain for this account string authpackage = Marshal.PtrToStringUni(data.AuthenticationPackage.buffer).Trim(); //authentication package SECURITY_LOGON_TYPE secType = (SECURITY_LOGON_TYPE)data.LogonType; DateTime time = systime.AddTicks((long)data.LoginTime); //get the datetime the session was logged in listBox1.Items.Add("User: " + username + " *** Domain: " + domain + " *** Login Type: (" + data.LogonType + ") " + secType.ToString() +" *** Login Time: "+time.ToLocalTime().ToString()); } iter = (IntPtr)((int)iter + Marshal.SizeOf(typeof(LUID))); //move the pointer forward LsaFreeReturnBuffer(sessionData); //free the SECURITY_LOGON_SESSION_DATA memory in the struct } LsaFreeReturnBuffer(luidPtr); //free the array of LUIDs

<!-- {cps..1}--> public void PopulateListbox()
{
System.Security.Principal.WindowsIdentitycurrentUser
= System.Security.Principal.WindowsIdentity.GetCurrent();

DateTimesystime
= new DateTime( 1601 , 1 , 1 , 0 , 0 , 0 , 0 ); // win32systemdate

UInt64count;
IntPtrluidPtr
= IntPtr.Zero;
LsaEnumerateLogonSessions(
out count, out luidPtr); // getsanarrayofpointerstoLUIDs

IntPtriter
= luidPtr; // setthepointertothestartofthearray

for ( ulong i = 0 ;i < count;i ++ ) // foreachpointerinthearray
{
IntPtrsessionData;

LsaGetLogonSessionData(iter,
out sessionData);
SECURITY_LOGON_SESSION_DATAdata
= (SECURITY_LOGON_SESSION_DATA)Marshal.PtrToStructure(sessionData, typeof (SECURITY_LOGON_SESSION_DATA));

// ifwehaveavalidlogon
if (data.PSiD != IntPtr.Zero)
{
// getthesecurityidentifierforfurtheruse
System.Security.Principal.SecurityIdentifiersid = new System.Security.Principal.SecurityIdentifier(data.PSiD);

// extractsomeusefulinformationfromthesessiondatastruct
string username = Marshal.PtrToStringUni(data.Username.buffer).Trim(); // gettheaccountusername
string domain = Marshal.PtrToStringUni(data.LoginDomain.buffer).Trim(); // domainforthisaccount
string authpackage = Marshal.PtrToStringUni(data.AuthenticationPackage.buffer).Trim(); // authenticationpackage

SECURITY_LOGON_TYPEsecType
= (SECURITY_LOGON_TYPE)data.LogonType;
DateTimetime
= systime.AddTicks(( long )data.LoginTime); // getthedatetimethesessionwasloggedin

listBox1.Items.Add(
" User: " + username + " ***Domain: " + domain + " ***LoginType:( " + data.LogonType + " ) " + secType.ToString() + " ***LoginTime: " + time.ToLocalTime().ToString());

}

iter
= (IntPtr)(( int )iter + Marshal.SizeOf( typeof (LUID))); // movethepointerforward
LsaFreeReturnBuffer(sessionData); // freetheSECURITY_LOGON_SESSION_DATAmemoryinthestruct
}

LsaFreeReturnBuffer(luidPtr);
// freethearrayofLUIDs
}

更多DirectoryEntry的信息,请查阅

http://msdn.microsoft.com/zh-cn/library/system.directoryservices.directoryentry_members.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值