windows GetUserNameEx api使用c++

windows域账号信息获取GetUserNameEx

https://learn.microsoft.com/zh-cn/windows/win32/api/secext/ne-secext-extended_name_format

EXTENDED_NAME_FORMAT 枚举 (secext.h)
typedef enum {
  NameUnknown = 0,
  NameFullyQualifiedDN = 1,
  NameSamCompatible = 2,
  NameDisplay = 3,
  NameUniqueId = 6,
  NameCanonical = 7,
  NameUserPrincipal = 8,
  NameCanonicalEx = 9,
  NameServicePrincipal = 10,
  NameDnsDomain = 12,
  NameGivenName = 13,
  NameSurname = 14
} EXTENDED_NAME_FORMAT, *PEXTENDED_NAME_FORMAT;

常量
 
NameUnknown
值: 0
未知的名称类型。
NameFullyQualifiedDN
值:1
完全限定的可分辨名称 (例如 CN=Jeff Smith,OU=Users,DC=Engineering,DC=Microsoft,DC=Com) 。
NameSamCompatible
值: 2
旧帐户名称 (例如 Engineering\JSmith) 。 仅限域的版本包括尾随反斜杠 (\) 。
NameDisplay
值: 3
“友好”显示名称 (例如 Jeff Smith) 。 显示名称不一定是 RDN) (定义的相对可分辨名称。
NameUniqueId
值: 6
一个 GUID 字符串,该字符串
IIDFromString 函数返回 (例如{4fa050f0-f561-11cf-bdd9-00aa003a77b6}) 。
NameCanonical
值: 7
完整的规范名称 (例如,engineering.microsoft.com/software/someone) 。 仅限域的版本包含尾随正斜杠 (/) 。
NameUserPrincipal
值: 8
用户主体名称 (例如, someone@example.com) 。
NameCanonicalEx
值: 9
与 NameCanonical 相同,只不过最右边的正斜杠 (/) 替换为新的行字符 (\n) ,即使在仅域的情况下 (,engineering.microsoft.com/software\nJSmith) 也是如此。
NameServicePrincipal
值: 10
通用化服务主体名称 (,例如 www/www.microsoft.com@microsoft.com) 。
NameDnsDomain
值: 12
DNS 域名后跟反斜杠和 SAM 用户名。
NameGivenName
值: 13
用户的名字或给定名称。 注意:此类型仅适用于 Active Directory 用户的 GetUserNameEx 调用。
NameSurname
值: 14
用户的姓氏。 注意:此类型仅适用于 Active Directory 用户的 GetUserNameEx 调用。
要求
要求	值
最低受支持的客户端	Windows 2000 Professional [仅限桌面应用]
最低受支持的服务器	Windows 2000 Server [仅限桌面应用]
标头	secext.h (包括 Security.h)


例子:

#include <iostream>
#include <tchar.h>
#include <string>
#include <stdio.h>
#include <windows.h>
#define SECURITY_WIN32 1
#include <security.h>
#undef SECURITY_WIN32
#include <wincred.h>
#pragma comment(lib, "Secur32.lib")

namespace test {

    // unknown name type
    const char kNameUnknown[] = "NameUnknown";

    // CN=John Doe, OU=Software, OU=Engineering, O=Widget, C=US
    const char kNameFullyQualifiedDN[] = "NameFullyQualifiedDN";

    // Engineering\JohnDoe
    const char kNameSamCompatible[] = "NameSamCompatible";

    // Probably "John Doe" but could be something else.  I.e. The
    // display name is not necessarily the defining RDN.
    const char kNameDisplay[] = "NameDisplay";

    // String-ized GUID as returned by IIDFromString().
    // eg: {4fa050f0-f561-11cf-bdd9-00aa003a77b6}
    const char kNameUniqueId[] = "NameUniqueId";

    // engineering.widget.com/software/John Doe
    const char kNameCanonical[] = "kNameCanonical";

    // someone@example.com
    const char kNameUserPrincipal[] = "NameUserPrincipal";

    // Same as NameCanonical except that rightmost '/' is
    // replaced with '\n' - even in domain-only case.
    // eg: engineering.widget.com/software\nJohn Doe
    const char kNameCanonicalEx[] = "NameCanonicalEx";

    // www/srv.engineering.com/engineering.com
    const char kNameServicePrincipal[] = "NameServicePrincipal";

    // DNS domain name + SAM username
    // eg: engineering.widget.com\JohnDoe
    const char kNameDnsDomain[] = "NameDnsDomain";

    std::wstring GetUserNameByIndex(_In_ EXTENDED_NAME_FORMAT NameFormat) {
        WCHAR username[CREDUI_MAX_USERNAME_LENGTH + 1] = { 0 };
        DWORD username_length = sizeof(username);

        // someone@example.com 域账号登录下有值 非域无值
        if (!::GetUserNameEx(NameFormat, username, &username_length) ||
            username_length <= 0) {
            return std::wstring();
        }

        return std::wstring(username);
    }
};

int main()
{  
    std::wcout <<test::GetUserNameByIndex(::NameFullyQualifiedDN).c_str();
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值