在 c# 中获取当前用户的 FQDN
本文关键字:用户 FQDN 获取 | 更新日期: 2023-09-27 17:56:54
我遇到了一个看似简单的问题,但它给我带来了一些麻烦。
假设我有两个受信任的 AD 域: 演示实习生和演示信任
我需要在使用 Windows 身份验证的应用中获取当前用户的 FQDN。 两个域中的用户都可以使用它。我需要知道哪个用户来自哪个域。
明显地
Environment.UserDomainName
或
System.Security.Principal.WindowsIdentity.GetCurrent().Name
在这两种情况下都无法返回 DEMO。
我知道那件事:
System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName
为我提供了本地计算机的完整域名,但是对于当前登录的用户,如何实现此域名?
我也试过:
var host = Dns.GetHostEntry(Environment.UserDomainName);
host.HostName.Dump();
没有成功给我错误"不知道这样的主机"。那么,我如何获取登录用户的完整域名,例如DEMO.intern而不仅仅是DEMO?
经过一些研究,这完成了工作:
public static class GetUserNameExUtil
{
#region Interop Definitions
public enum EXTENDED_NAME_FORMAT
{
NameUnknown = 0,
NameFullyQualifiedDN = 1,
NameSamCompatible = 2,
NameDisplay = 3,
NameUniqueId = 6,
NameCanonical = 7,
NameUserPrincipal = 8,
NameCanonicalEx = 9,
NameServicePrincipal = 10,
NameDnsDomain = 12,
}
[System.Runtime.InteropServices.DllImport("secur32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
public static extern int GetUserNameEx(int nameFormat, StringBuilder userName, ref int userNameSize);
#endregion
public static string GetUserName(EXTENDED_NAME_FORMAT nameFormat)
{
if (Environment.OSVersion.Platform != PlatformID.Win32NT)
{
return null;
}
StringBuilder userName = new StringBuilder(1024);
int userNameSize = userName.Capacity;
if (GetUserNameEx((int)nameFormat, userName, ref userNameSize) != 0)
{
string[] nameParts = userName.ToString().Split('''');
return nameParts[0];
}
return null;
}
public static string GetUserFullName()
{
return GetUserName(EXTENDED_NAME_FORMAT.NameDnsDomain);
}
}