在 C# 中获取当前用户的 FQDN

Getting FQDN for current user in c#

我遇到了一个看似简单的问题,但却给我带来了一些麻烦。

假设我有两个受信任的 AD 域: DEMO.internDEMO.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);
    }
}