今天学习下怎么用.Net获取系统当前登陆用户名,因为目前网上基本只有最简单的方式,但以管理员身份运行的话就会获取不到,所以特整理一下作为分享,最后附带参考文档,方便深究的童鞋继续学习。

==========  原创作品    作者:Yokeqi    出处:博客园  ==========

一、知识点简单介绍

相信很多人第一直觉是使用.net的环境变量。

Environment.UserName

但是可能很多人找我这篇文章是因为这个环境变量其实会受到管理员身份运行的影响,获取到的是管理员的身份,而不是真实的当前登录用户。

这里的思路是利用WindowsApi进行获取,经过各种查资料得到一个Api函数

[DllImport("Wtsapi32.dll")]
protected static extern bool WTSQuerySessionInformation(IntPtr hServer, int sessionId, WTSInfoClass wtsInfoClass, out IntPtr ppBuffer, out uint pBytesReturned);

二、具体实例演示如何实现

1. 引入API接口

[DllImport("Wtsapi32.dll")]
protected static extern void WTSFreeMemory(IntPtr pointer); [DllImport("Wtsapi32.dll")]
protected static extern bool WTSQuerySessionInformation(IntPtr hServer, int sessionId, WTSInfoClass wtsInfoClass, out IntPtr ppBuffer, out uint pBytesReturned);

这里引入 WTSFreeMemory 方法主要用于对非托管资源的释放。

2. WTSInfoClass类定义

public enum WTSInfoClass
{
WTSInitialProgram,
WTSApplicationName,
WTSWorkingDirectory,
WTSOEMId,
WTSSessionId,
WTSUserName,
WTSWinStationName,
WTSDomainName,
WTSConnectState,
WTSClientBuildNumber,
WTSClientName,
WTSClientDirectory,
WTSClientProductId,
WTSClientHardwareId,
WTSClientAddress,
WTSClientDisplay,
WTSClientProtocolType,
WTSIdleTime,
WTSLogonTime,
WTSIncomingBytes,
WTSOutgoingBytes,
WTSIncomingFrames,
WTSOutgoingFrames,
WTSClientInfo,
WTSSessionInfo
}

3. 获取当前登录用户方法的具体实现

/// <summary>
/// 获取当前登录用户(可用于管理员身份运行)
/// </summary>
/// <returns></returns>
public static string GetCurrentUser()
{
IntPtr buffer;
uint strLen;
int cur_session = -;
var username = "SYSTEM"; // assume SYSTEM as this will return "\0" below
if (WTSQuerySessionInformation(IntPtr.Zero, cur_session, WTSInfoClass.WTSUserName, out buffer, out strLen) && strLen > )
{
username = Marshal.PtrToStringAnsi(buffer); // don't need length as these are null terminated strings
WTSFreeMemory(buffer);
if (WTSQuerySessionInformation(IntPtr.Zero, cur_session, WTSInfoClass.WTSDomainName, out buffer, out strLen) && strLen > )
{
username = Marshal.PtrToStringAnsi(buffer) + "\\" + username; // prepend domain name
WTSFreeMemory(buffer);
}
}
return username;
}

三、参考文档

最新文章

  1. jquery mobile 输入框无边框
  2. 同域名下PC与移动端自动识别跳转
  3. NSQ:分布式的实时消息平台
  4. oracle操作语句
  5. 制作 alipay-sdk-java包到本地仓库
  6. mybatis-配置文件mybatis-config.xml
  7. 一份详细的asyncio入门教程
  8. 运维shell全部语法进阶
  9. 12.QT4.7.4-解决WIN平台和Linux平台中文乱码,QLineEdit右击菜单中文显示
  10. php 验证身份证号
  11. ASP.NET Core MVC之ViewComponents(视图组件)知多少?
  12. 根据ip地址获得国家和城市(C#)
  13. recovery 差分升级包制作超时
  14. C# 动态方法和静态方法的区别
  15. Java 读取 .properties 配置文件
  16. Centos 安装ImageMagick 与 imagick for php步骤详解
  17. 2018-2019-2 网络对抗技术 20165324 Exp5:MSF基础应用
  18. Ubuntu 制作离线安装包
  19. PHP文档
  20. linux常用解压命令总结

热门文章

  1. 算法学习之剑指offer(四)
  2. 帝国CMS 6.5功能解密:网站安全防火墙使用说明
  3. C# 结合 Golang 开发
  4. JetBrains系列软件激活码
  5. vue内使用echarts
  6. odoo联调补充
  7. 为什么阿里巴巴Java开发手册中强制要求整型包装类对象值用 equals 方法比较?
  8. 轻量级CNN模型之squeezenet
  9. InitializingBean,spring 初始化bean
  10. [UWP]使用GetAlphaMask和ContainerVisual制作长阴影(Long Shadow)