windows域账号信息获取GetUserNameExhttps://learn.microsoft.com/zh-cn/windows/win32/api/secext/ne-secext-extended_name_formatEXTENDED_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 typeconst char kNameUnknown[] = "NameUnknown";// CN=John Doe, OU=Software, OU=Engineering, O=Widget, C=USconst char kNameFullyQualifiedDN[] = "NameFullyQualifiedDN";// Engineering\JohnDoeconst 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 Doeconst char kNameCanonical[] = "kNameCanonical";// someone@example.comconst char kNameUserPrincipal[] = "NameUserPrincipal";// Same as NameCanonical except that rightmost '/' is// replaced with '\n' - even in domain-only case.// eg: engineering.widget.com/software\nJohn Doeconst char kNameCanonicalEx[] = "NameCanonicalEx";// www/srv.engineering.com/engineering.comconst char kNameServicePrincipal[] = "NameServicePrincipal";// DNS domain name + SAM username// eg: engineering.widget.com\JohnDoeconst 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;
}