在 C# 中获取当前用户的 FQDN
Getting FQDN for current user in c#
我遇到了一个看似简单的问题,但却给我带来了一些麻烦。
假设我有两个受信任的 AD 域:
DEMO.intern
和 DEMO.trust
我需要为我的应用程序中使用 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();
没有成功给我错误 "No such host is known"。那么我怎样才能获得登录用户的完整域名,例如 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);
}
}
我遇到了一个看似简单的问题,但却给我带来了一些麻烦。
假设我有两个受信任的 AD 域: DEMO.intern 和 DEMO.trust
我需要为我的应用程序中使用 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();
没有成功给我错误 "No such host is known"。那么我怎样才能获得登录用户的完整域名,例如 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);
}
}