如何用C++获取Windows 10中Microsoft Account登录的当前用户名?
获取Windows 10微软账户登录时的在线用户名(C++实现)
刚好之前处理过类似的问题——当Windows 10用户用微软账户(Microsoft Account)登录时,常规的GetUserName函数只能拿到系统自动映射的本地短用户名(比如User~123这类格式),想要获取真实的微软账户名(比如邮箱格式的用户主体名称UPN,或者用户的显示姓名),得借助Windows的特定API来实现,下面给你两种可行的方案:
方法一:通过GetUserNameExW获取微软账户UPN(邮箱格式)
GetUserNameExW可以指定不同的名称格式,当我们传入NameUserPrincipal参数时,就能获取到用户的主体名称,而微软账户的UPN通常就是用户登录时使用的邮箱地址。
#include <windows.h> #include <iostream> #include <vector> void GetMicrosoftAccountUPN() { DWORD bufferSize = 0; // 先调用一次获取所需缓冲区的大小 if (!GetUserNameExW(NameUserPrincipal, nullptr, &bufferSize)) { if (GetLastError() == ERROR_MORE_DATA) { // 分配足够的缓冲区 std::vector<wchar_t> upnBuffer(bufferSize); if (GetUserNameExW(NameUserPrincipal, upnBuffer.data(), &bufferSize)) { std::wcout << L"微软账户登录名(UPN): " << upnBuffer.data() << std::endl; } else { std::cout << "获取UPN失败,错误码: " << GetLastError() << std::endl; } } else { std::cout << "调用GetUserNameExW失败,错误码: " << GetLastError() << std::endl; } } } int main() { GetMicrosoftAccountUPN(); return 0; }
方法二:通过NetUserGetInfo获取更多账户信息(含显示名称)
如果你不仅需要登录邮箱,还想获取用户的真实显示名称,可以用NetUserGetInfo函数,先拿到本地用户名,再查询关联的账户详情:
#include <windows.h> #include <lm.h> #include <iostream> #include <vector> #pragma comment(lib, "netapi32.lib") void GetMicrosoftAccountDetails() { wchar_t localUserName[UNLEN + 1]; DWORD userNameSize = UNLEN + 1; // 先获取本地映射的用户名 if (GetUserNameW(localUserName, &userNameSize)) { USER_INFO_2* userInfo = nullptr; // 查询用户信息,级别2包含UPN和显示名称 NET_API_STATUS status = NetUserGetInfo(nullptr, localUserName, 2, (LPBYTE*)&userInfo); if (status == NERR_Success) { std::wcout << L"微软账户显示名称: " << userInfo->usri2_full_name << std::endl; std::wcout << L"微软账户登录UPN: " << userInfo->usri2_user_principal_name << std::endl; // 记得释放API分配的内存 NetApiBufferFree(userInfo); } else { std::cout << "查询用户信息失败,错误码: " << status << std::endl; } } else { std::cout << "获取本地用户名失败,错误码: " << GetLastError() << std::endl; } } int main() { GetMicrosoftAccountDetails(); return 0; }
注意事项
- 确保你的项目使用Unicode字符集编译(Visual Studio中可在项目属性->常规->字符集里设置),因为上面的API都使用宽字符版本,避免编码乱码问题。
- 这些API的权限要求不高,普通用户权限即可调用,不需要管理员权限。
- 可以通过判断返回的UPN是否包含
@符号,来区分用户是微软账户登录还是本地账户登录(本地账户的UPN通常是机器名\用户名格式)。
内容的提问来源于stack exchange,提问作者user3365407




