获取windows当前登录的用户名

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

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

(1)从控制面板访问:



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



(3)从开始菜单访问


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



说明:

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;
} 

具体代码下载路径: demo下载



  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows 服务程序中,可以通过调用 Windows API 来获取当前是否有用户登录,以及当前登录用户的用户名。以下是获取信息的示例代码: ```cpp #include <Windows.h> #include <TlHelp32.h> BOOL IsUserLoggedOn() { // 获取当前登录会话的 ID DWORD session_id = WTSGetActiveConsoleSessionId(); // 获取进程快照 HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (snapshot == INVALID_HANDLE_VALUE) { return FALSE; } // 遍历进程列表,查找 explorer.exe 进程 PROCESSENTRY32 pe; pe.dwSize = sizeof(PROCESSENTRY32); BOOL bRet = Process32First(snapshot, &pe); while (bRet) { if (_tcsicmp(pe.szExeFile, _T("explorer.exe")) == 0) { // 获取 explorer.exe 进程所属的登录会话 ID DWORD explorer_session_id; WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, pe.th32ProcessID, WTSConnectState, (LPTSTR*)&explorer_session_id, NULL); // 如果与当前登录会话 ID 相同,则表示有用户登录 if (explorer_session_id == session_id) { CloseHandle(snapshot); return TRUE; } } bRet = Process32Next(snapshot, &pe); } CloseHandle(snapshot); return FALSE; } BOOL GetLoggedOnUserName(LPTSTR szUserName, DWORD* pdwSize) { // 获取当前登录会话的 ID DWORD session_id = WTSGetActiveConsoleSessionId(); // 获取当前登录会话的用户名 WCHAR* pUserName; DWORD dwSize; if (WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, session_id, WTSUserName, &pUserName, &dwSize)) { wcsncpy_s(szUserName, *pdwSize, pUserName, dwSize); *pdwSize = dwSize; WTSFreeMemory(pUserName); return TRUE; } return FALSE; } ``` `IsUserLoggedOn()` 函数用于检查当前是否有用户登录。该函数遍历进程列表,查找 explorer.exe 进程,并获取该进程所属的登录会话 ID。如果该 ID 与当前登录会话的 ID 相同,则表示有用户登录。 `GetLoggedOnUserName()` 函数用于获取当前登录用户的用户名。该函数调用 `WTSQuerySessionInformation` API 来获取当前登录会话的用户名。如果获取成功,则将用户名复制到 `szUserName` 缓冲区中,并将缓冲区大小更新为用户名长度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值