You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何用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

火山引擎 最新活动