C #에서 로컬 컴퓨터의 FQDN을 어떻게 얻을 수 있습니까?
답변:
참고 :이 솔루션은 .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
Dns.GetHostName()
for 를 사용 하는 이유는 무엇 입니까? hostName
HostName
IPGlobalProperties
IPGlobalProperties
호스트 이름 속성이 NetBIOS 이름을 Dns.GetHostName()
반환하는 반면 DNS 호스트 이름을 반환 하기 때문 입니다.
EndsWith
검사는 도메인 이름과 같은 글자 (도메인 OST의 예 myhost 호스트)와 끝, 아마되어야한다고 호스트 이름에 대한 고장EndsWith("." + domainName)
hostName.
. 이 있어야합니다 !String.isNullorEmpty(domainName)
체크
Miky D의 코드를 약간 단순화
public static string GetLocalhostFqdn()
{
var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
return string.Format("{0}.{1}", ipProperties.HostName, ipProperties.DomainName);
}
.Trim(".")
마지막 줄에 a 를 추가 하여. 존재한다면.
이것은 이 문서에서 다룹니다 . 이 기술은 허용 된 답변보다 간단하며 다음으로 가장 많이 득표 한 답변보다 더 신뢰할 수 있습니다. 내가 이해하는 한 이것은 NetBIOS 이름을 사용 하지 않으므로 인터넷 사용에 적합해야합니다.
Dns.GetHostEntry("LocalHost").HostName
Dns.GetHostByName("LocalHost").HostName
Dns.GetHostEntry("LocalHost").HostName
다음과 같이 빈 문자열을 전달하는 것이 좋습니다.Dns.GetHostEntry("").HostName
그리고 Framework 1.1의 경우 다음과 같이 간단합니다.
System.Net.Dns.GetHostByName("localhost").HostName
그런 다음 컴퓨터 NETBIOS 이름을 제거하여 domainName 만 검색합니다.
GetHostByName("localhost")
에는 구식입니다. VS 2010은 GetHostEntry("localhost")
대신 사용하도록 제안 했는데 제대로 작동합니다.
컴퓨터가 도메인의 구성원이 아닌 경우 후행 전체 중지가 반환되지 않도록 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);
}
이것을 보고서 작성을 위해 호스트 이름과 도메인 이름을 결합하는 옵션 중 하나로 사용하고 도메인 이름이 캡처되지 않을 때 입력 할 일반 텍스트를 추가했습니다. 이것은 고객 요구 사항 중 하나였습니다.
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 솔루션의 아이디어를 사용하여 구축되었습니다.
다음과 같은 방식으로 사용하기 위해 제안 된 결과를 구현했습니다.
return System.Net.Dns.GetHostEntry(Environment.MachineName).HostName;
그러나 컴퓨터 이름이 15 자 이상이고 NetBios 이름을 사용하면 제대로 작동하지 않는 것으로 나타났습니다. Environment.MachineName은 부분 이름 만 반환하고 호스트 이름을 확인하면 동일한 컴퓨터 이름이 반환됩니다.
몇 가지 조사 끝에이 문제를 해결할 해결책을 찾았습니다.
System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).HostName
이것은 컴퓨터 이름을 포함한 모든 문제를 해결했습니다.
내가 테스트 한 답변 중 실제로 내가 찾고 있던 DNS 접미사를 제공하지 않았습니다. 여기에 내가 생각 해낸 것이 있습니다.
public static string GetFqdn()
{
var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
var ipprops = networkInterfaces.First().GetIPProperties();
var suffix = ipprops.DnsSuffix;
return $"{IPGlobalProperties.GetIPGlobalProperties().HostName}.{suffix}";
}
정리하고 예외를 처리하려면 다음을 시도하십시오.
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;
}
Dns.GetHostEntry("LocalHost").HostName
나는 항상 주 도메인 접미사 호스트 이름 (하지의 NetBIOS)을 얻는다. 이것은 컴퓨터가 도메인의 일부인지, DNS 서버에 연결할 수 있는지 또는 네트워크가 연결되었는지 여부에 의존하지 않습니다. 아마도 나는 당신의 설명을 이해하지 못하지만 결과는 내가 기대하는 것입니다. (머신 : W2008R2; .net 4.0; netbiosname : TESTNAME-VERYLO 호스트 이름 : TESTNAME-VERYLONG)