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

如何获取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即可;否则,需要采用后面的两种方法,当然,在使用前需要判断一下操作系统的类型。
时间: 2024-10-07 20:56:47

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

如何运用百度问答平台简单快捷的挖取长尾关键词

对于那些竞争激烈的关键词,一般都是被一些大型的站点抓在手中.作为中小型站点来说长尾关键词是流量的一大来源.而且相关与其他的关键词,长尾关键词可以获得更加精准的目标关键词.虽然大部分的站长都了解,但是很少人会去深入的攫取.大部分的人都通过使用搜索下拉框,搜索结果的相关搜索,而这些大部分人使用的方法是不可能找到最新最好的长尾关键词的. 那么还有其他的可用方式吗?其实只要你够细心,你会发现有很多地方可以找到我们想要的目标长尾关键词的,笔者今天要说的就是通过百度问答平台,百度知道,大家都应该了解到百度知

如何突破百度问答的瓶颈 增加有效外链

对网站进行优化的时候,外链的发布是必不可少的一项工作,为了增加高质量的外链,SEOer都会利用百度问答来提升外链的数量.因为百度问答审核非常严密,因此SEOer在发布问答的时候,就会遇到带链接的回答无法被审核,百度问答账号被删除等各种瓶颈现象的产生.那么对于SEOer来讲,该如何突破这些瓶颈现象,留住SEOer的辛勤劳动呢? 首先,做好百度问答账号的培养 我们都知道百度问答账号越高,在问题回答中留下链接的几率就越高,因此对于新手SEOer来讲,我们一旦注册好新账号时不要急于带链接回答.SEOer

百度理财计划不符合相关法律法规的要求

针对今日证监会发布的" 百度理财计划不符合相关法律法规的要求,下一步将对该业务合规性予以核查 "微博公告,百度公司下午发表公开声明,称百度金融中心在参与互联网金融创新的过程中,始终与各监管机构和政府部门保持积极主动的沟通,并严格遵守监管部门的规定,确保业务在合法合规的前提下良好运行. 百度公告全文: 近期,百度金融中心即将发布的"百发"计划, 得到了社会各界和广大网民的关注与支持,我们在此深表感谢.百度金融中心在参与互联网金融创新的过程中,始终与各监管机构和政府部门

证监会发布的 百度理财计划不符合相关法律法规的要求

10月23日下午消息,针对今日证监会发布的" 百度理财计划不符合相关法律法规的要求,下一步将对该业务合规性予以核查 "微博公告,百度公司下午发表公开声明,称百度金融中心在参与互联网金融创新的过程中,始终与各监管机构和政府部门保持积极主动的沟通,并严格遵守监管部门的规定,确保业务在合法合规的前提下良好运行. 百度公告全文: 近期,百度金融中心即将发布的"百发"计划, 得到了社会各界和广大网民的关注与支持,我们在此深表感谢.百度金融中心在参与互联网金融创新的过程中,始终

疯狂的百度下拉框-百度下拉和相关营销方案

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 什么是百度下拉 百度下拉的官方正式叫法是百度推荐词(Baidu Suggest Word),民间又称之为百度联想词或百度下拉菜单.是百度为了方便广大网民搜索,提高输入效率而推出的一项服务. 百度下拉的实现原理 百度从每天数以亿计的用户搜索词中,分析提炼出搜索量巨大的词条,生成百度推荐词数据库.之后,当用户在搜索框输入文字的过程中,百度动态就从

简单分析做天涯问答与百度问答的利弊与方法

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 话说网上有很多关于外链建设的文章,对于如何增加外链我也有自己的心得和看法.如何做高质量的外链达到网络推广,大家一定对于自己网站如何推广常感到苦恼.推广也就是SEO的一部分,前提是要先把自己的网站的关键词定位好.然后就想办法如何增加外链.今天我就来分析下天涯问答和百度问答这两大问答的好坏,属个人意见以及个人经验,欢迎给为站长指正. 问答类的网站

淘宝客如何应对百度K站的相关问题

摘要: 淘宝客站应对百度K站的解决方法 很多的淘宝客站长都发现了网站被百度又K了,从去年的618到809到今年的1月6号,一共三次的K站,到底是真是如坊间传闻针对淘宝的吗?那么有哪些现象可 淘宝客站应对百度K站的解决方法 很多的淘宝客站长都发现了网站被百度又K了,从去年的618到809到今年的1月6号,一共三次的K站,到底是真是如坊间传闻针对淘宝的吗?那么有哪些现象可以定义为被K了呢?被K站后的共性有哪些呢?下面来介绍一下淘宝客如何应对百度K站的相关问题. 一,百度K站是针对淘宝客的吗? 对于这

获取所有系统属性值的java代码段

获取所有系统属性值的java代码段: Java代码 Properties pros = System.getProperties(); Enumeration<?> names = pros.propertyNames(); while (names.hasMoreElements()) { String name = (String) names.nextElement(); System.out.println(name + "=" + System.getProper

轻松入门Android直播相关技术 从0搭建直播系统

本文讲的是轻松入门Android直播相关技术 从0搭建直播系统,我立马实践了下,所以首先给大家分享下整个搭建的流程: 本人的操作系统为mac,其他系统的同学可以根据提示,自行安装软件. 一个简易的直播系统,大致可以由三部分组成: 搭建一个rtmp媒体服务器 推流端 拉流端 现在目标是快速搭建起来,所以当然是借助开源项目和一些软件: rtmp媒体服务器:这里使用srs 推流端:这里使用obs 拉流端:这里使用播放器vlc rtmp媒体服务器的搭建 这里使用srs,srs的链接为: https://