在 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?

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

经过一些研究,这完成了工作:

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);
    }
}