如何获取Windows系统登陆用户名

http://zhidao.baidu.com/link?url=Hva9PkVwYZv8KSEWftSqTWe8fqM1dhoq59BurnfADmcOvFjFgJUONb2kQ4KrJUF5KjOTXjCf5SQKYNLhcU_dBMzGGBxFxJCRfxCmamIjUji

=======================

一般用 GetUserName(或 GetUserNameEx )函数可得到当前登陆登陆用户名(但不总会得到,下面会分析),此系统函数在Win95、WinNT 及以后所有操作系统中都可用。代码如下:BOOL CSecurityTool::GetCurrProcessUser(CString& strName){		BOOL bRet(TRUE);	strName = _T("");

	DWORD dwSize = MAX_PATH;	TCHAR *pszName = new TCHAR[dwSize];	if (!GetUserName(pszName, &dwSize))	{		delete[] pszName;		pszName = new TCHAR[dwSize];		bRet = GetUserName(pszName, &dwSize);	}

	strName = pszName;	delete[] pszName;			return bRet;}        此函数目的准确来说是获取当前线程的用户名(MSDN语:retrieves the user name of the current thread)。如果是NT service(NT服务程序)将此进程启动,得到的结果是NT Service进程的用户名,即“SYSTEM”,而不是登陆用户名;同理,如果此进程是通过CreateProcessAsUser创建的,GetUserName获取的用户将是“AsUser”的用户名。另外,如果当前线程正impersonate其他用户环境(用函数ImpersonateLoggedOnUser可达到此目的),它获取的将是其他用户名。因此,此函数只能在特定环境中才可以获取登陆用户名。   那如何不因进程本身运行环境的不同,而准确地获取登陆用户名呢?   我们首先看看Windows XP操作系统,它提供了WTSQuerySessionInformation函数,这个函数可以获取会话(session)相关信息,其中一个用途是获取会话的登陆用户。代码如下:BOOL CSecurityTool::GetLogUserXP(CString& strName){	BOOL bRet = FALSE;	strName = _T("");

	//for xp or above	TCHAR *szLogName = NULL;	DWORD dwSize = 0;	if (WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE,	                               WTS_CURRENT_SESSION,	                               WTSUserName,	                               &szLogName,	                               &dwSize))	{					strName = szLogName;		WTSFreeMemory(szLogName);		bRet = TRUE;	}

	return bRet;}        如果用户还没有登陆,获取的用户名将为空(譬如在NT service程序中)。虽然MSDN中指明WTSQuerySessionInformation可以在win2000 pro 中使用,但由于安装win2000 professional时,terminal service是没有安装的(除非用特殊方法如第三方工具可以安装terminal service),所以调用此函数会失败,需要寻找其他方法。   再看Win2000:查阅了许多资料,未能发现在Win2000中直接获取登陆用户名的系统函数,看来只有曲线救国了。由于Explorer.exe进程的用户肯定是当前登陆用户,所以获取到它的用户名就等于获取到登陆用户名。具体实现:首先枚举系统所有进程,找到Explorer.exe进程ID,然后通过ID获取此进程的令牌(Token),再获取令牌的用户信息,即为登陆用户名。代码如下://获取win2000登陆用户      BOOL CSecurityTool::GetLogUser2K(CString& strName){	BOOL bRet = FALSE;	HANDLE hSnapshot = NULL;	strName = _T("");

    __try	{		// Get a snapshot of the processes in the system        hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);        if (hSnapshot == NULL)		{            			__leave;		}

        PROCESSENTRY32 pe32;        pe32.dwSize = sizeof(pe32);

        // Find the "System" process        BOOL fProcess = Process32First(hSnapshot, &pe32);        while (fProcess)		{			if (lstrcmpi(pe32.szExeFile, TEXT("explorer.exe")) == 0)			{					TCHAR szUserName[MAX_PATH];				if (GetProcessUser(pe32.th32ProcessID, szUserName, MAX_PATH))				{					bRet = TRUE;					strName = szUserName;				}

				break;			}			fProcess = Process32Next(hSnapshot, &pe32);		}        if (!fProcess)		{			            __leave;    // Didn''t find "System" process		}	}    __finally	{		// Cleanup the snapshot       if (hSnapshot != NULL)		   CloseHandle(hSnapshot);    }

	return bRet;	}

//获取进程的用户名BOOL CSecurityTool::GetProcessUser(DWORD dwProcessID, TCHAR *szUserName, DWORD nNameLen){	BOOL fResult  = FALSE;    HANDLE hProc  = NULL;	HANDLE hToken = NULL;	TOKEN_USER *pTokenUser = NULL;

	__try	{        // Open the process with PROCESS_QUERY_INFORMATION access        hProc = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, dwProcessID);        if (hProc == NULL)		{			__leave;		}        fResult = OpenProcessToken(hProc, TOKEN_QUERY, &hToken);        if(!fResult)  		{			__leave;		}

		DWORD dwNeedLen = 0;				fResult = GetTokenInformation(hToken,TokenUser, NULL, 0, &dwNeedLen);		if (dwNeedLen > 0)		{			pTokenUser = (TOKEN_USER*)new BYTE[dwNeedLen];			fResult = GetTokenInformation(hToken,			                              TokenUser,			                              pTokenUser,			                              dwNeedLen,			                              &dwNeedLen);			if (!fResult)			{				__leave;			}		}		else		{			__leave;		}

		SID_NAME_USE sn;		TCHAR szDomainName[MAX_PATH];		DWORD dwDmLen = MAX_PATH;		fResult = LookupAccountSid(NULL,		                           pTokenUser->User.Sid,		                           szUserName,		                           &nNameLen,                                   szDomainName,                                   &dwDmLen,                                   &sn);	}	__finally	{		if (hProc)			::CloseHandle(hProc);		if (hToken)			::CloseHandle(hToken);		if (pTokenUser)			delete[] (char*)pTokenUser;

		return fResult;	}}        熟悉win2000系统的同仁肯定会发现此方法存在缺陷:explorer.exe进程可能不存在(被用户kill掉或自己中断了),这时候这个方法就获取不到登陆用户名。但在没有更好方法前,只能将就。 

总结  因此,软件中如果需要获取登陆用户名,要根据具体情况选择不同的方法。如果确信自己的进程一定在登陆用户环境下启动,则GetUserName即可;否则,需要采用后面的两种方法,当然,在使用前需要判断一下操作系统的类型。

这段百度问答,对我相关有对啊!!!----如何获取Windows系统登陆用户名的更多相关文章

  1. Python使用wmi获取Windows相关信息

    在使用Python获取Windows系统上的相关的信息可以使用WMI接口来获取, 什么是wmi? WMI是一项核心的Windows管理技术,WMI作为一种规范和基础结构,通过它可以访问.配置.管理和监 ...

  2. 获取Java系统相关信息

    package com.test; import java.util.Properties; import java.util.Map.Entry; import org.junit.Test; pu ...

  3. 请问,如何在windows系统下面同时使用中文和英文的cmd?_百度知道

    请问,如何在windows系统下面同时使用中文和英文的cmd?_百度知道 在批处理开始加一行chcp 437就是英文的cmdchcp 936就是中文的cmd

  4. 【百度地图API】如何用圆形搜索获取中心点周围100米内全部关键点?如天安门附近所有的餐厅、加油站、宾馆、大厦等

    原文:[百度地图API]如何用圆形搜索获取中心点周围100米内全部关键点?如天安门附近所有的餐厅.加油站.宾馆.大厦等 摘要: 在LBS上有这样一个常用的功能,查找附近所有的关键点(POI点,比如标志 ...

  5. JAVA如何利用Swiger获取Linux系统电脑配置相关信息

    最近开发java应用程序,涉及到获取Linux服务器相关配置的问题,特地网上搜寻了下,采用Swiger包可以直接获取,再次小结一下,以便于以后能方便使用,也便于其他童鞋们学习. 推荐大家参考链接:ht ...

  6. 前端工程师面试问题归纳(二、问答类JQ相关)

    其他随笔 前端工程师面试问题归纳(一.问答类html/css/js基础) 前端工程师面试问题归纳(三.代码类) 1. jQuery 库中的 $() 是什么? $() 函数是 jQuery() 函数的别 ...

  7. [图片问答]lodop注册相关

    相关博文:LODOP和C-LODOP注册与角色等简短问答[增强版]由于其他博文要么图片太花哨(PS做的所以太花哨),要么文字太啰嗦,所以做了简短问答的图片,更简洁直观方便.1.该购买哪种LODOP注册 ...

  8. 关于easyui的问答(来自百度问答)

    求教大神,jquery easyui中$('#table').datagrid('options').queryParams是什么意思 https://zhidao.baidu.com/questio ...

  9. 【Linux】通过top语句可以查看压力测试的实时服务器状态。(可以通过百度Linux top查看相关内容)

    Linux实时查看服务器状态的两个语句 1.显示基本服务器监控状态语句如下:linux top 在这里输入 主要先看服务器负载高不高,高了后能否降下来,再看网络,io,数据库状态. 是有一个工具可以监 ...

随机推荐

  1. Hadoop的数据采集框架

    问题导读: Hadoop数据采集框架都有哪些? Hadoop数据采集框架异同及适用场景? Hadoop提供了一个高度容错的分布式存储系统,帮助我们实现集中式的数据分析和数据共享.在日常应用中我们比如要 ...

  2. MVC学习-用EF做增删改查

    在做增删改查先,先介绍几个知识点: 1.代理类 在将对象方法EF数据上下文时,EF会为该对象封装 一个代理类对象, 同时为该对象的每一个属性添加一个标志:unchanged, 当对该对象某个属性进行操 ...

  3. CF861B Which floor?

    思路: 暴力枚举. 实现: #include <bits/stdc++.h> using namespace std; int n, m, x, y; bool check(int x, ...

  4. Activity随笔

    Activity的生命周期 1.正常情况下的生命周期 onCreate:  Activity正在被创建,生命周期中的第一个方法,常在此方法中做一些初始化工作,比如调用setContentView方法, ...

  5. 微信关于网页授权access_token和普通access_token的区别

    微信官网网址:https://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html#.E9.99.84.EF.BC.9A.E6. ...

  6. 阿里云机器学习tensorflow实践

    1,前言 伴随人工智能和深度学习的应用越来越普及,越来越多的开发人员开始投入到智能算法的编程中.由于算法成熟且公开,软件编码这一块不存在难度:但模型训练和预测所需的时间与硬件设备的配置有极大关系,很多 ...

  7. Xcode 动态库及Framework 安装路径设置

    使用Xcode开发动态库及Framework时,需要为其设置Install path.在设置Install path时,可能会使用到以下几个路径: 1)绝对路径:               绝对路径 ...

  8. 扩增子分析解读5物种注释 OTU表操作

    本节课程,需要先完成<扩增子分析解读>系列之前的操作 1质控 实验设计 双端序列合并 2提取barcode 质控及样品拆分 切除扩增引物 3格式转换 去冗余 聚类 4去嵌合体 非细菌序列 ...

  9. PHP 优秀资源汇集(照搬)

    文章目录 原文地址: https://shockerli.net/post/php-awesome/ GitHub: https://github.com/shockerli/php-awesome ...

  10. PHP图像函数

    (1)常见的验证码哪些?   图像类型.语音类型.视频类型.短信类型等 (2)使用验证码的好处在哪里? ①防止恶意的破解密码如一些黑客为了获取到用户信息,通过不同的手段向服务器发送数据,验证猜测用户信 ...