Domanda

Come puoi ottenere l'FQDN di un computer locale in C #?

È stato utile?

Soluzione

NOTA: questa soluzione funziona solo per i framework .NET 2.0 (e più recenti).

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
}

Aggiorna

Dato che molte persone hanno commentato che Risposta di Sam è più conciso, ho deciso di aggiungere alcuni commenti al risposta.

La cosa più importante da notare è che il codice che ho fornito non è non equivalente al seguente codice:

Dns.GetHostEntry("LocalHost").HostName

Mentre nel caso generale quando la macchina è collegata in rete e fa parte di un dominio, entrambi i metodi produrranno generalmente lo stesso risultato, in altri scenari i risultati differiranno.

Uno scenario in cui l'output sarà diverso è quando la macchina non fa parte di un dominio. In questo caso, il Dns.GetHostEntry (" LocalHost "). Nomehost restituirà localhost mentre il metodo GetFQDN () sopra restituirà il Nome NETBIOS dell'host.

Questa distinzione è importante quando lo scopo di trovare l'FQDN della macchina è di registrare informazioni o generare un rapporto. Il più delle volte ho usato questo metodo nei registri o nei rapporti che vengono successivamente utilizzati per mappare le informazioni su una macchina specifica. Se le macchine non sono collegate in rete, l'identificatore localhost è inutile, mentre il nome fornisce le informazioni necessarie.

Quindi, in definitiva, spetta a ciascun utente quale metodo sia più adatto alla propria applicazione, a seconda del risultato di cui ha bisogno. Ma dire che questa risposta è sbagliata per non essere abbastanza conciso è superficiale nella migliore delle ipotesi.

Guarda un esempio in cui l'output sarà diverso: http://ideone.com/q4S4I0

Altri suggerimenti

Una leggera semplificazione del codice di Miky D

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

Questo è trattato da questo articolo . Questa tecnica è più breve della risposta accettata e probabilmente più affidabile della prossima risposta più votata. Nota che, per quanto ho capito, questo non non utilizza i nomi NetBIOS, quindi dovrebbe essere adatto per l'uso di Internet.

.NET 2.0+

Dns.GetHostEntry("LocalHost").HostName

.NET 1.0 - 1.1

Dns.GetHostByName("LocalHost").HostName

Eccolo in PowerShell, diamine:

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

E per Framework 1.1 è semplice come questo:

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

Quindi rimuovere il nome NETBIOS della macchina per recuperare solo il DomainName

Puoi provare quanto segue:

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

Questo shoud ti dà l'FQDN dell'attuale macchina locale (oppure puoi specificare qualsiasi host).

Un leggero miglioramento sulla risposta di Matt Z in modo che non venga restituito un punto finale finale se il computer non è un membro di un dominio:

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

Utilizzato come una delle mie opzioni per combinare il nome host e il nome di dominio per la creazione di un rapporto, aggiunto il testo generico da compilare quando il nome di dominio non è stato acquisito, questo era uno dei requisiti dei clienti.

Ho provato questo usando 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
} 

Costruito usando le idee della soluzione Miky Dinescu.

Abbiamo implementato i risultati suggeriti per utilizzare in questo modo:

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

Tuttavia, si è scoperto che questo non funziona correttamente quando il nome del computer è più lungo di 15 caratteri e usando il nome NetBios. Environment.MachineName restituisce solo il nome parziale e la risoluzione del nome host restituisce lo stesso nome computer.

Dopo alcune ricerche abbiamo trovato una soluzione per risolvere questo problema:

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

Ciò ha risolto tutti i problemi incluso il nome del computer.

Se vuoi riordinare e gestire le eccezioni, prova questo:

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;
        }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top