C# 获取系统当前登录用户(管理员身份运行同样有效)
2019-06-13 15:34
1986 查看
今天学习下怎么用.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 }View Code
3. 获取当前登录用户方法的具体实现
/// <summary> /// 获取当前登录用户(可用于管理员身份运行) /// </summary> /// <returns></returns> public static string GetCurrentUser() { IntPtr buffer; uint strLen; int cur_session = -1; var username = "SYSTEM"; // assume SYSTEM as this will return "\0" below if (WTSQuerySessionInformation(IntPtr.Zero, cur_session, WTSInfoClass.WTSUserName, out buffer, out strLen) && strLen > 1) { 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 > 1) { username = Marshal.PtrToStringAnsi(buffer) + "\\" + username; // prepend domain name WTSFreeMemory(buffer); } } return username; }View Code
三、参考文档
相关文章推荐
- C#中判断当前登录的用户是否是系统管理员的方法
- XXX 不是当前用户的有效责任,请联系您的系统管理员
- Integrated SOA Gateway 不是当前用户的有效责任。请联系您的系统管理员。
- win7中以管理员身份运行bat脚本时,获取当前文件所在目录
- Integrated SOA Gateway 不是当前用户的有效责任。请联系您的系统管理员。
- win7中以管理员身份运行bat脚本时,获取当前文件所在目录
- 该帐户当前被锁定,所以用户sa登录失败。系统管理员无法将该帐户解锁
- 一些获取当前登录Windows系统用户信息的命令
- win7/10中以管理员身份运行bat脚本时,获取当前文件所在目录
- win7中以管理员身份运行bat脚本时,获取当前文件所在目录
- 该帐户当前被锁定,所以用户 'sa' 登录失败。系统管理员无法将该帐户解锁。
- win7/10中以管理员身份运行bat脚本时,获取当前文件所在目录
- 该帐户当前被锁定,所以用户 'sa' 登录失败。系统管理员无法将该帐户解锁。(Microsoft SQL Server,错误: 18486)
- 帐户当前被锁定,所以用户 'sa' 登录失败。系统管理员无法将该帐户解锁。
- 获取当前系统用户是管理员权限还是普通用户权限
- XXX 不是当前用户的有效责任,请联系您的系统管理员
- 帐户当前被锁定,所以用户 sa 登录失败。系统管理员无法将该帐户解锁 解决方法
- 该帐户当前被锁定,所以用户 'sa' 登录失败。系统管理员无法将该帐户解锁
- 该帐户当前被锁定,所以用户 'service' 登录失败。系统管理员无法将该帐户解锁。
- 帐户当前被锁定,所以用户 sa 登录失败。系统管理员无法将该帐户解锁 解决方法