1.系统用户名的简单说明

系统的用户名包括自身的用户名和用户名的全名,常见几种可以查看具体信息的方法如下:

(1)从控制面板访问:

如何查看windows python 如何查看Windows用户名_#include


(2)右键计算机的“管理”处访问

如何查看windows python 如何查看Windows用户名_开始菜单_02


(3)从开始菜单访问

如何查看windows python 如何查看Windows用户名_开始菜单_03

(4)从任务管理器查看explorer的进程访问

如何查看windows python 如何查看Windows用户名_开始菜单_04


说明:

1)开始菜单及桌面上的用户的文件夹图标所显示的名字遵循这样的原则:

当用户名的全名为空时,显示的是用户名,但是当用户名的全名不为空时,则显示用户名的全名(通过修改全名即可验证),而且有的电脑表面上修改了用户名,

实际上修改的只是全名,这一点可以通过管理的地方进入查看,或者注销重新登录后,查看进程的用户名

2)修改用户名和全名后,必须重新注销系统,开始菜单上的名字才会生效


2.如何准确的获取系统登录的用户名

从理论上讲获取系统的用户名即可,但是实际上对于有的电脑,从控制面板更改的用户名,其实并不是用户名,而是全名,这样更改后,给人感觉用户名已经改了,而且注销后重新登录开始菜单上显示的也是改之后的名字,从而造成误解,所以,程序中需要根据全名来决定具体显示什么名字,即:当用户名的全名为空时,显示的是用户名,但是当用户名的全名不为空时,则显示用户名的全名


法1:利用GetUserName获取用户名,利用NetUserGetInfo获取全名

#include "lm.h"
#pragma comment(lib,"netapi32.lib")



void Get_LogUser(CString &strName)
{
	WCHAR abyUserName[MAX_PATH] = {0};
	DWORD dwSize=MAX_PATH; 
	::GetUserName(abyUserName, &dwSize);

	LPUSER_INFO_3 bufptr=NULL;
	NET_API_STATUS t3;
	t3=NetUserGetInfo(0,abyUserName,3,(LPBYTE*)&bufptr);
	if ( t3 != NERR_Success )
	{
		return;
	}

	//全名不为空,就使用用户名的全名,为空就使用用户名
	CString strFullName = bufptr->usri3_full_name;
	if (strFullName.IsEmpty())
	{
		strName = bufptr->usri3_name;
	}
	else
	{
		strName = bufptr->usri3_full_name;
	}

	NetApiBufferFree(bufptr);
	bufptr = NULL;
}



法2:获取explorer.exe的用户名,利用NetUserGetInfo获取全名

#include "tlhelp32.h"

#include "lm.h"
#pragma comment(lib,"netapi32.lib")



BOOL FindProcessPid(CString ProcessName, DWORD& dwPid)
{
	HANDLE hProcessSnap;
	PROCESSENTRY32 pe32;

	// Take a snapshot of all processes in the system.
	hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	if (hProcessSnap == INVALID_HANDLE_VALUE)
	{
		return(FALSE);
	}

	pe32.dwSize = sizeof(PROCESSENTRY32);

	if (!Process32First(hProcessSnap, &pe32))
	{
		CloseHandle(hProcessSnap);          // clean the snapshot object
		return(FALSE);
	}

	BOOL    bRet = FALSE;
	do
	{
		if (!lstrcmp(ProcessName, pe32.szExeFile))
		{
			dwPid = pe32.th32ProcessID;
			bRet = TRUE;
			break;
		}

	} while (Process32Next(hProcessSnap, &pe32));

	CloseHandle(hProcessSnap);
	return bRet;
}



void Get_LogUser(CString &strName)
{
	DWORD dwProcessID = 0;
	if (!FindProcessPid(_T("explorer.exe"), dwProcessID))
	{
		return;
	}

	BOOL fResult = FALSE;
	HANDLE hProc = NULL;
	HANDLE hToken = NULL;
	TOKEN_USER *pTokenUser = NULL;

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

	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)
		{
			return;
		}
	}
	else
	{
		return;
	}

	SID_NAME_USE sn;
	TCHAR szDomainName[MAX_PATH];
	DWORD dwDmLen = MAX_PATH;

	WCHAR wstrName[MAX_PATH] = {};
	DWORD nNameLen = MAX_PATH;
	fResult = LookupAccountSid(NULL, pTokenUser->User.Sid, wstrName, &nNameLen,
		szDomainName, &dwDmLen, &sn);

	if (hProc)
		::CloseHandle(hProc);
	if (hToken)
		::CloseHandle(hToken);
	if (pTokenUser)
		delete[] (char*)pTokenUser;

	LPUSER_INFO_3 bufptr=NULL;
	NET_API_STATUS t3;
	t3=NetUserGetInfo(0,wstrName,3,(LPBYTE*)&bufptr);
	if ( t3 != NERR_Success )
	{
		return;
	}

	//全名不为空,就使用用户名的全名,为空就使用用户名
	CString strFullName = bufptr->usri3_full_name;
	if (strFullName.IsEmpty())
	{
		strName = bufptr->usri3_name;
	}
	else
	{
		strName = bufptr->usri3_full_name;
	}

	NetApiBufferFree(bufptr);
	bufptr = NULL;
}