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;
}
windows GetUserNameEx api使用c++
于 2024-09-25 21:06:46 首次发布