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

摘要:
前天,我在CodeProject上看到了一篇文章http://www.codeproject.com/KB/system/LSAEnumUserSessions.aspx如何读取Windows当前登录用户的状态信息。主要代码共享如下:1.导入dllCode/**//**********************************************************************

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

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

主要代码分享如下:

一:导入dll

.net读取Windows登录用户信息(downmoon)第1张.net读取Windows登录用户信息(downmoon)第2张Code
.net读取Windows登录用户信息(downmoon)第3张.net读取Windows登录用户信息(downmoon)第4张 /**//************************************************************************/
.net读取Windows登录用户信息(downmoon)第3张.net读取Windows登录用户信息(downmoon)第4张        
/**//* The following Interop code should be placed in a sealed internal NativeMethod class
.net读取Windows登录用户信息(downmoon)第7张         * but has been left here to simplify the example.
.net读取Windows登录用户信息(downmoon)第8张        /***********************************************************************
*/

.net读取Windows登录用户信息(downmoon)第9张
.net读取Windows登录用户信息(downmoon)第9张        [DllImport(
"secur32.dll", SetLastError = false)]
.net读取Windows登录用户信息(downmoon)第9张        
private static extern uint LsaFreeReturnBuffer(IntPtr buffer);
.net读取Windows登录用户信息(downmoon)第9张
.net读取Windows登录用户信息(downmoon)第9张        [DllImport(
"Secur32.dll", SetLastError = false)]
.net读取Windows登录用户信息(downmoon)第9张        
private static extern uint LsaEnumerateLogonSessions(out UInt64 LogonSessionCount, out IntPtr LogonSessionList);
.net读取Windows登录用户信息(downmoon)第9张
.net读取Windows登录用户信息(downmoon)第9张        [DllImport(
"Secur32.dll", SetLastError = false)]
.net读取Windows登录用户信息(downmoon)第9张        
private static extern uint LsaGetLogonSessionData(IntPtr luid, out IntPtr ppLogonSessionData);
.net读取Windows登录用户信息(downmoon)第9张
.net读取Windows登录用户信息(downmoon)第9张        [StructLayout(LayoutKind.Sequential)]
.net读取Windows登录用户信息(downmoon)第9张        
private struct LSA_UNICODE_STRING
.net读取Windows登录用户信息(downmoon)第3张.net读取Windows登录用户信息(downmoon)第4张        
.net读取Windows登录用户信息(downmoon)第23张{
.net读取Windows登录用户信息(downmoon)第7张            
public UInt16 Length;
.net读取Windows登录用户信息(downmoon)第7张            
public UInt16 MaximumLength;
.net读取Windows登录用户信息(downmoon)第7张            
public IntPtr buffer;
.net读取Windows登录用户信息(downmoon)第8张        }

.net读取Windows登录用户信息(downmoon)第9张
.net读取Windows登录用户信息(downmoon)第9张        [StructLayout(LayoutKind.Sequential)]
.net读取Windows登录用户信息(downmoon)第9张        
private struct LUID
.net读取Windows登录用户信息(downmoon)第3张.net读取Windows登录用户信息(downmoon)第4张        
.net读取Windows登录用户信息(downmoon)第23张{
.net读取Windows登录用户信息(downmoon)第7张            
public UInt32 LowPart;
.net读取Windows登录用户信息(downmoon)第7张            
public UInt32 HighPart;
.net读取Windows登录用户信息(downmoon)第8张        }

.net读取Windows登录用户信息(downmoon)第9张
.net读取Windows登录用户信息(downmoon)第9张        [StructLayout(LayoutKind.Sequential)]
.net读取Windows登录用户信息(downmoon)第9张        
private struct SECURITY_LOGON_SESSION_DATA
.net读取Windows登录用户信息(downmoon)第3张.net读取Windows登录用户信息(downmoon)第4张        
.net读取Windows登录用户信息(downmoon)第23张{
.net读取Windows登录用户信息(downmoon)第7张            
public UInt32 Size;
.net读取Windows登录用户信息(downmoon)第7张            
public LUID LoginID;
.net读取Windows登录用户信息(downmoon)第7张            
public LSA_UNICODE_STRING Username;
.net读取Windows登录用户信息(downmoon)第7张            
public LSA_UNICODE_STRING LoginDomain;
.net读取Windows登录用户信息(downmoon)第7张            
public LSA_UNICODE_STRING AuthenticationPackage;
.net读取Windows登录用户信息(downmoon)第7张            
public UInt32 LogonType;
.net读取Windows登录用户信息(downmoon)第7张            
public UInt32 Session;
.net读取Windows登录用户信息(downmoon)第7张            
public IntPtr PSiD;
.net读取Windows登录用户信息(downmoon)第7张            
public UInt64 LoginTime;
.net读取Windows登录用户信息(downmoon)第7张            
public LSA_UNICODE_STRING LogonServer;
.net读取Windows登录用户信息(downmoon)第7张            
public LSA_UNICODE_STRING DnsDomainName;
.net读取Windows登录用户信息(downmoon)第7张            
public LSA_UNICODE_STRING Upn;
.net读取Windows登录用户信息(downmoon)第8张        }

.net读取Windows登录用户信息(downmoon)第9张
.net读取Windows登录用户信息(downmoon)第9张        
private enum SECURITY_LOGON_TYPE : uint
.net读取Windows登录用户信息(downmoon)第3张.net读取Windows登录用户信息(downmoon)第4张        
.net读取Windows登录用户信息(downmoon)第23张{
.net读取Windows登录用户信息(downmoon)第7张            Interactive 
= 2,    //The security principal is logging on interactively. 
.net读取Windows登录用户信息(downmoon)第7张
            Network,            //The security principal is logging using a network. 
.net读取Windows登录用户信息(downmoon)第7张
            Batch,              //The logon is for a batch process. 
.net读取Windows登录用户信息(downmoon)第7张
            Service,            //The logon is for a service account. 
.net读取Windows登录用户信息(downmoon)第7张
            Proxy,              //Not supported. 
.net读取Windows登录用户信息(downmoon)第7张
            Unlock,             //The logon is an attempt to unlock a workstation.
.net读取Windows登录用户信息(downmoon)第7张
            NetworkCleartext,   //The logon is a network logon with cleartext credentials.
.net读取Windows登录用户信息(downmoon)第7张
            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.
.net读取Windows登录用户信息(downmoon)第7张
            RemoteInteractive,  // A terminal server session that is both remote and interactive.
.net读取Windows登录用户信息(downmoon)第7张
            CachedInteractive, // Attempt to use the cached credentials without going out across the network.
.net读取Windows登录用户信息(downmoon)第7张
            CachedRemoteInteractive, // Same as RemoteInteractive, except used internally for auditing purposes.
.net读取Windows登录用户信息(downmoon)第7张
            CachedUnlock          // The logon is an attempt to unlock a workstation.
.net读取Windows登录用户信息(downmoon)第8张
        }

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

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

.net读取Windows登录用户信息(downmoon)第75张.net读取Windows登录用户信息(downmoon)第76张Code
.net读取Windows登录用户信息(downmoon)第9张 public void PopulateListbox()
.net读取Windows登录用户信息(downmoon)第3张.net读取Windows登录用户信息(downmoon)第4张        
.net读取Windows登录用户信息(downmoon)第23张{
.net读取Windows登录用户信息(downmoon)第7张            System.Security.Principal.WindowsIdentity currentUser 
= System.Security.Principal.WindowsIdentity.GetCurrent();
.net读取Windows登录用户信息(downmoon)第7张
.net读取Windows登录用户信息(downmoon)第7张            DateTime systime 
= new DateTime(1601110000); //win32 systemdate
.net读取Windows登录用户信息(downmoon)第7张

.net读取Windows登录用户信息(downmoon)第7张            UInt64 count;
.net读取Windows登录用户信息(downmoon)第7张            IntPtr luidPtr 
= IntPtr.Zero;
.net读取Windows登录用户信息(downmoon)第7张            LsaEnumerateLogonSessions(
out count, out luidPtr);  //gets an array of pointers to LUIDs
.net读取Windows登录用户信息(downmoon)第7张

.net读取Windows登录用户信息(downmoon)第7张            IntPtr iter 
= luidPtr;      //set the pointer to the start of the array
.net读取Windows登录用户信息(downmoon)第7张

.net读取Windows登录用户信息(downmoon)第7张            
for (ulong i = 0; i < count; i++)   //for each pointer in the array
.net读取Windows登录用户信息(downmoon)第92张.net读取Windows登录用户信息(downmoon)第93张
            .net读取Windows登录用户信息(downmoon)第23张{
.net读取Windows登录用户信息(downmoon)第7张                IntPtr sessionData;
.net读取Windows登录用户信息(downmoon)第7张
.net读取Windows登录用户信息(downmoon)第7张                LsaGetLogonSessionData(iter, 
out sessionData);
.net读取Windows登录用户信息(downmoon)第7张                SECURITY_LOGON_SESSION_DATA data 
= (SECURITY_LOGON_SESSION_DATA)Marshal.PtrToStructure(sessionData, typeof(SECURITY_LOGON_SESSION_DATA));
.net读取Windows登录用户信息(downmoon)第7张
.net读取Windows登录用户信息(downmoon)第7张                
//if we have a valid logon
.net读取Windows登录用户信息(downmoon)第7张
                if (data.PSiD != IntPtr.Zero)
.net读取Windows登录用户信息(downmoon)第92张.net读取Windows登录用户信息(downmoon)第93张                
.net读取Windows登录用户信息(downmoon)第23张{
.net读取Windows登录用户信息(downmoon)第7张                    
//get the security identifier for further use
.net读取Windows登录用户信息(downmoon)第7张
                    System.Security.Principal.SecurityIdentifier sid = new System.Security.Principal.SecurityIdentifier(data.PSiD);
.net读取Windows登录用户信息(downmoon)第7张               
.net读取Windows登录用户信息(downmoon)第7张                    
//extract some useful information from the session data struct
.net读取Windows登录用户信息(downmoon)第7张
                    string username = Marshal.PtrToStringUni(data.Username.buffer).Trim();          //get the account username
.net读取Windows登录用户信息(downmoon)第7张
                    string domain =  Marshal.PtrToStringUni(data.LoginDomain.buffer).Trim();        //domain for this account  
.net读取Windows登录用户信息(downmoon)第7张
                    string authpackage = Marshal.PtrToStringUni(data.AuthenticationPackage.buffer).Trim();    //authentication package
.net读取Windows登录用户信息(downmoon)第7张
                
.net读取Windows登录用户信息(downmoon)第7张                    SECURITY_LOGON_TYPE secType 
= (SECURITY_LOGON_TYPE)data.LogonType;
.net读取Windows登录用户信息(downmoon)第7张                    DateTime time 
= systime.AddTicks((long)data.LoginTime);                              //get the datetime the session was logged in
.net读取Windows登录用户信息(downmoon)第7张

.net读取Windows登录用户信息(downmoon)第7张                    listBox1.Items.Add(
"User: " + username + " *** Domain: " + domain + " *** Login Type: (" + data.LogonType + "" + secType.ToString() +" *** Login Time: "+time.ToLocalTime().ToString());
.net读取Windows登录用户信息(downmoon)第7张   
.net读取Windows登录用户信息(downmoon)第118张                }

.net读取Windows登录用户信息(downmoon)第7张                iter 
= (IntPtr)((int)iter + Marshal.SizeOf(typeof(LUID)));  //move the pointer forward
.net读取Windows登录用户信息(downmoon)第7张
                LsaFreeReturnBuffer(sessionData);   //free the SECURITY_LOGON_SESSION_DATA memory in the struct
.net读取Windows登录用户信息(downmoon)第118张
            }

.net读取Windows登录用户信息(downmoon)第7张            LsaFreeReturnBuffer(luidPtr);   
//free the array of LUIDs
.net读取Windows登录用户信息(downmoon)第8张
        }

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

 更多DirectoryEntry的信息,请查阅

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

免责声明:文章转载自《.net读取Windows登录用户信息(downmoon)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C#如何使用SqlCacheDependencypython多线程下载网页图片并保存至特定目录下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

EasyExcel调试记录

一.pom.xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.6</version>...

Echarts自动刷新数据

1.Echarts自动刷新数据 1.Echarts柱状图的正常配置 注:声明了 myChart、test这两个都有用 官方示例中myChart是声明在 function(ec)里面的 <script src="http://cdn.staticfile.org/jquery/2.1.1-rc2/jquery.min.js"></scri...

【解决方法】EasyUI DataGrid不显示滚动条时,没有数据的问题

解决方法 于dataGrid例如,下面的代码被添加到的定义:  JavaScript Code  1 2 3 4 5 6 7 8 9 10 onLoadSuccess : function (data) {     if (data.total == 0) {         $('#dg').datagrid('insertRow', {  ...

cookie详解

背景 在HTTP协议的定义中,采用了一种机制来记录客户端和服务器端交互的信息,这种机制被称为cookie,cookie规范定义了服务器和客户端交互信息的格式、生存期、使用范围、安全性。 在JavaScript中可以通过 document.cookie 来读取或设置这些信息。由于 cookie 多用在客户端和服务端之间进行通信,所以除了JavaScript以...

ActiveMQ教程(消息发送和接受)

一 环境的搭建   version为你的版本号   如果你是普通的项目的话,创建一个lib文件夹,导入相应的jar包到你的lib中,jar包为:activemq-all-{version}.jar、log4j-{version}.jar、slf4j-log4j12-{version}.jar,并且bulidpath,将jar加载到你的项目中就可以使用了。...

SpringBoot中前后端数据交互 json 格式

//前端使用jquery封装的ajax技术把封装好的json数据传输给后端 //而在springboot项目中后端自动配置使用了google的jackson把传递给前端的数据自动转换为json格式,当然我们也可以不用默认,自定义设置 $.ajax( { url:"http://www.microsoft.com", //请求的url地址...