C # /. NET에서 로컬 컴퓨터의 FQDN을 찾는 방법은 무엇입니까?


87

C #에서 로컬 컴퓨터의 FQDN을 어떻게 얻을 수 있습니까?

답변:


143

참고 :이 솔루션은 .NET 2.0 (및 최신) 프레임 워크를 대상으로하는 경우에만 작동합니다.

using System;
using System.Net;
using System.Net.NetworkInformation;
//...

public static string GetFQDN()
{
    string domainName = IPGlobalProperties.GetIPGlobalProperties().DomainName;
    string hostName = Dns.GetHostName();

    domainName = "." + domainName;
    if(!hostName.EndsWith(domainName))  // if hostname does not already include domain name
    {
        hostName += domainName;   // add the domain name part
    }

    return hostName;                    // return the fully qualified name
}

최신 정보

많은 사람들이 Sam의 답변 이 더 간결 하다고 언급했기 때문에 답변 에 몇 가지 의견을 추가하기로 결정했습니다.

주목해야 할 가장 중요한 것은 내가 제공 한 코드 가 다음 코드 와 동일하지 않다는 것입니다 .

Dns.GetHostEntry("LocalHost").HostName

머신이 네트워크에 연결되고 도메인의 일부인 일반적인 경우에는 두 방법 모두 일반적으로 동일한 결과를 생성하지만 다른 시나리오에서는 결과가 다릅니다.

출력이 다른 시나리오는 시스템이 도메인의 일부가 아닌 경우입니다. 이 경우 Dns.GetHostEntry("LocalHost").HostName는 반환 localhost되고 GetFQDN()위 의 메서드는 호스트의 NETBIOS 이름을 반환합니다.

이 구분은 시스템 FQDN을 찾는 목적이 정보를 기록하거나 보고서를 생성하는 것일 때 중요합니다. 대부분의 경우이 방법을 로그 또는 보고서에서 사용하여 나중에 특정 컴퓨터에 정보를 다시 매핑하는 데 사용했습니다. 머신이 네트워크에 연결되어 있지 않으면 localhost식별자는 쓸모가 없지만 이름은 필요한 정보를 제공합니다.

따라서 궁극적으로 필요한 결과에 따라 애플리케이션에 더 적합한 방법은 각 사용자에게 달려 있습니다. 그러나이 대답이 충분히 간결하지 않기 때문에 잘못되었다고 말하는 것은 기껏해야 피상적입니다.

출력이 다른 예를 참조하십시오. http://ideone.com/q4S4I0


2
사용 Dns.GetHostEntry("LocalHost").HostName나는 항상 주 도메인 접미사 호스트 이름 (하지의 NetBIOS)을 얻는다. 이것은 컴퓨터가 도메인의 일부인지, DNS 서버에 연결할 수 있는지 또는 네트워크가 연결되었는지 여부에 의존하지 않습니다. 아마도 나는 당신의 설명을 이해하지 못하지만 결과는 내가 기대하는 것입니다. (머신 : W2008R2; .net 4.0; netbiosname : TESTNAME-VERYLO 호스트 이름 : TESTNAME-VERYLONG)
marsh-wiggle

한 줄 위에 이미있는 객체 의 속성 을 사용하는 대신 Dns.GetHostName()for 를 사용 하는 이유는 무엇 입니까? hostNameHostNameIPGlobalProperties
Xharlie 2014

@Xharlie는 IPGlobalProperties호스트 이름 속성이 NetBIOS 이름을 Dns.GetHostName()반환하는 반면 DNS 호스트 이름을 반환 하기 때문 입니다.
Mike Dinescu 2014

2
EndsWith검사는 도메인 이름과 같은 글자 (도메인 OST의 예 myhost 호스트)와 끝, 아마되어야한다고 호스트 이름에 대한 고장EndsWith("." + domainName)
user3391859

6
domainName이 비어 있으면을 반환합니다 hostName.. 이 있어야합니다 !String.isNullorEmpty(domainName)체크
RodgerTheGreat

63

Miky D의 코드를 약간 단순화

    public static string GetLocalhostFqdn()
    {
        var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
        return string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
    }

4
Micky D의 코드와 달리 이것은 컴퓨터가 도메인의 구성원이 아닌 경우 추가 된 fullstop이있는 호스트 이름을 반환합니다.
Bosco

1
또한 이것은 DNS 호스트 이름 대신 NetBIOS 이름을 사용합니다. NetBIOS 이름은 LAN 내에서만 적합하다고 생각합니다.
Sam

아마도 .Trim(".")마지막 줄에 a 를 추가 하여. 존재한다면.
David d C e Freitas 2013

28

이것은 이 문서에서 다룹니다 . 이 기술은 허용 된 답변보다 간단하며 다음으로 가장 많이 득표 한 답변보다 더 신뢰할 수 있습니다. 내가 이해하는 한 이것은 NetBIOS 이름을 사용 하지 않으므로 인터넷 사용에 적합해야합니다.

.NET 2.0 이상

Dns.GetHostEntry("LocalHost").HostName

.NET 1.0-1.1

Dns.GetHostByName("LocalHost").HostName

@DexterLegaspi-샘의 대답은 좋은 대답이지만 (저도 직접 업 보딩했습니다) 내 대답과 동일하지도 않고 반드시 더 낫습니다. 자세한 내용은 업데이트 된 답변을 참조하십시오.
Mike Dinescu 2014

@MikeDinescu 문제는 FQDN을 얻는 방법입니다. 이는 시스템이 네트워크에 있고 도메인의 일부임을 의미합니다. 받아 들여진 대답은 일을하지만 Sam의 대답은 더 "정확하다"(더 나은 용어가 없기 때문에)
Dexter Legaspi 2014

3
이것은 정답입니다! 하지만 그렇게하는 대신 Dns.GetHostEntry("LocalHost").HostName다음과 같이 빈 문자열을 전달하는 것이 좋습니다.Dns.GetHostEntry("").HostName
paulgutten

17

여기 PowerShell에 있습니다.

$ipProperties = [System.Net.NetworkInformation.IPGlobalProperties]::GetIPGlobalProperties()
"{0}.{1}" -f $ipProperties.HostName, $ipProperties.DomainName

15

그리고 Framework 1.1의 경우 다음과 같이 간단합니다.

System.Net.Dns.GetHostByName("localhost").HostName

그런 다음 컴퓨터 NETBIOS 이름을 제거하여 domainName 만 검색합니다.


여기 2013 년 GetHostByName("localhost")에는 구식입니다. VS 2010은 GetHostEntry("localhost")대신 사용하도록 제안 했는데 제대로 작동합니다.
piedar

@piedar, .NET 1.1에 대한 부분을 놓쳤을 수 있습니다.
Sam

이 답변에 업데이트 된 정보를 추가하고 싶었습니다. 나는 아마 당신의 대답을 볼만큼 충분히 스크롤하지 않았을 것입니다.
piedar 2014

8

다음을 시도 할 수 있습니다.

return System.Net.Dns.GetHostEntry(Environment.MachineName).HostName;

이 소리는 현재 로컬 컴퓨터의 FQDN을 제공합니다 (또는 호스트를 지정할 수 있음).


5

컴퓨터가 도메인의 구성원이 아닌 경우 후행 전체 중지가 반환되지 않도록 Matt Z의 답변을 약간 개선했습니다.

public static string GetLocalhostFqdn()
{
    var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
    return string.IsNullOrWhiteSpace(ipProperties.DomainName) ? ipProperties.HostName : string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
}

NetBIOS 호스트 이름을 사용한다고 생각하므로 인터넷 사용에는 적합하지 않을 수 있습니다.
Sam

2

이것을 보고서 작성을 위해 호스트 이름과 도메인 이름을 결합하는 옵션 중 하나로 사용하고 도메인 이름이 캡처되지 않을 때 입력 할 일반 텍스트를 추가했습니다. 이것은 고객 요구 사항 중 하나였습니다.

C # 5.0, .Net 4.5.1을 사용하여 테스트했습니다.

private static string GetHostnameAndDomainName()
{
       // if No domain name return a generic string           
       string currentDomainName = IPGlobalProperties.GetIPGlobalProperties().DomainName ?? "nodomainname";
       string hostName = Dns.GetHostName();

    // check if current hostname does not contain domain name
    if (!hostName.Contains(currentDomainName))
    {
        hostName = hostName + "." + currentDomainName;
    }
    return hostName.ToLower();  // Return combined hostname and domain in lowercase
} 

Miky Dinescu 솔루션의 아이디어를 사용하여 구축되었습니다.


1

다음과 같은 방식으로 사용하기 위해 제안 된 결과를 구현했습니다.

return System.Net.Dns.GetHostEntry(Environment.MachineName).HostName;

그러나 컴퓨터 이름이 15 자 이상이고 NetBios 이름을 사용하면 제대로 작동하지 않는 것으로 나타났습니다. Environment.MachineName은 부분 이름 만 반환하고 호스트 이름을 확인하면 동일한 컴퓨터 이름이 반환됩니다.

몇 가지 조사 끝에이 문제를 해결할 해결책을 찾았습니다.

System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).HostName

이것은 컴퓨터 이름을 포함한 모든 문제를 해결했습니다.


이렇게하면 예외가 발생하며 az, 0-9, '.', '-'가 아닌 문자를 포함하는 사용자가 이름을 지정한 컴퓨터가있는 경우 제안 된 대부분의 다른 솔루션도 실패합니다. 따라서 아시아 또는 유사한 사용자가있는 경우 문제를 예상하십시오. GetHostName은 해당 문자를 '?'로 대체합니다. 그래서 실제 컴퓨터 이름을 보여주는 GetHostByName ( "localhost"). HostName을 선호합니다.
Göran

0

이 접근 방식을 사용했습니다.

private static string GetLocalhostFQDN()
{
    var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
    return $"{ipProperties.HostName}.{ipProperties.DomainName}";
}

0

내가 테스트 한 답변 중 실제로 내가 찾고 있던 DNS 접미사를 제공하지 않았습니다. 여기에 내가 생각 해낸 것이 있습니다.

public static string GetFqdn()
{
    var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
    var ipprops = networkInterfaces.First().GetIPProperties();
    var suffix = ipprops.DnsSuffix;
    return $"{IPGlobalProperties.GetIPGlobalProperties().HostName}.{suffix}";
}

-9

정리하고 예외를 처리하려면 다음을 시도하십시오.

public static string GetLocalhostFQDN()
        {
            string domainName = string.Empty;
            try
            {
                domainName = NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName;
            }
            catch
            {
            }
            string fqdn = "localhost";
            try
            {
                fqdn = System.Net.Dns.GetHostName();
                if (!string.IsNullOrEmpty(domainName))
                {
                    if (!fqdn.ToLowerInvariant().EndsWith("." + domainName.ToLowerInvariant()))
                    {
                        fqdn += "." + domainName;
                    }
                }
            }
            catch
            {
            }
            return fqdn;
        }

2
"및 예외 처리"-실패.
요르겐 Sigvardsson

U는 catch 자체가 예외를 처리한다고 생각합니다!
Saher Ahwal 2012-07-05

아니오, 예외를 처리하는 방법은 스스로 결정해야 할 사항이라고 생각합니다. 도메인 이름을 되 찾을 수 없다면 어떻게 처리 할 것을 제안 하시겠습니까?
Roger Willcocks 2012-07-07

4
오류 보고서를 기록하고 클라이언트 코드에 잘못된 정보를 제공하는 대신 문제가 발생했음을 사용자에게 경고합니다.
dahvyd
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.