C# 获取系统当前登录用户(管理员身份运行同样有效)
2024-10-16 15:42:34
今天学习下怎么用.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;
}
三、参考文档
最新文章
- jquery mobile 输入框无边框
- 同域名下PC与移动端自动识别跳转
- NSQ:分布式的实时消息平台
- oracle操作语句
- 制作 alipay-sdk-java包到本地仓库
- mybatis-配置文件mybatis-config.xml
- 一份详细的asyncio入门教程
- 运维shell全部语法进阶
- 12.QT4.7.4-解决WIN平台和Linux平台中文乱码,QLineEdit右击菜单中文显示
- php 验证身份证号
- ASP.NET Core MVC之ViewComponents(视图组件)知多少?
- 根据ip地址获得国家和城市(C#)
- recovery 差分升级包制作超时
- C# 动态方法和静态方法的区别
- Java 读取 .properties 配置文件
- Centos 安装ImageMagick 与 imagick for php步骤详解
- 2018-2019-2 网络对抗技术 20165324 Exp5:MSF基础应用
- Ubuntu 制作离线安装包
- PHP文档
- linux常用解压命令总结