2009-10-21 16 views
7

Qualcuno può dirmi come ottenere il nome di dominio dei server in asp.net? (Environment.UserDomainName restituisce stringa "IIS APPPOOL")Come ottenere il nome di dominio del server

Grazie per i replay, ma principalmente si tratta del nome DNS del server, quello di cui ho bisogno è il nome del dominio. Per esempio quando faccio il login tramite l'autenticazione di Windows digito dominio \ utente e ho bisogno di questo "dominio"

+0

Il dominio di quale accesso? Il tuo? Hai sempre effettuato l'accesso? In genere, IIS ha il proprio accesso separato in cui viene eseguito, che, come hai scoperto, si trova nel dominio "IIS APPPOOL". – Tinister

risposta

3

Mi sembra che tu stia cercando di trovare il nome di dominio dell'utente. Dato che stai richiedendo Environment.UserDomainName. Poiché il tuo sito è probabilmente in esecuzione con "Consenti accesso anonimo" - l'utente non trasmette le informazioni sul dominio al server e IIS ti fornisce le informazioni sull'account che possiede, ovvero l'account del pool di app.

1

Prova la classe System.Net.Dns, che ha abbondanza di metodi utili come GetHostEntry cioè:

var entry = System.Net.Dns.GetHostEntry("google.com"); // or vice-versa... 
var name = System.Net.Dns.GetHostEntry("127.0.0.1"); // localhost ;) 
+1

Quindi suppongo che la prossima domanda sia come si ottiene l'IP WAN del proprio server? E lo scenario in cui utilizzi l'hosting condiviso e quindi non hai un IP dedicato al tuo dominio? – Tinister

+0

Devo aver frainteso "server nome di dominio", server, al plurale significava per me che in qualche modo si desidera eseguire query sul nome di dominio. –

9

Avrete bisogno di estrarlo dalla oggetto di richiesta:

HttpContext.Current.Request.Url.Host 
+0

+1: questo è il modo più pulito. Restituisce solo il nome di dominio, filtrando le porte, http/https, percorso, querystring, ecc. –

+0

Bene, restituisce il nome di dominio utilizzato per accedere al server, probabilmente è corretto, ma può essere uno dei tanti nomi diversi usati per accedere al server. –

2

c'è problema specifico alla tua domanda, ci possono essere più di un nome di dominio a un indirizzo IP specifico.

Come detto Tinister, è possibile utilizzare

HttpContext.Current.Request.Url.Host 

ma che sarà solo dirvi ciò che l'utente ha scritto nella barra degli indirizzi del browser. Se l'utente ha aggiunto una voce al proprio file host per il proprio sito e quindi usa quel nome host, questo è ciò che vedrai. (Non ho idea del motivo per cui lo farebbero).

Se si dispone di più di un nome di dominio per il proprio sito Web, è possibile utilizzarlo per individuare i nomi di domini che l'utente ha richiesto.

+0

Le tipiche società di hosting condivise e rivenditori utilizzano la stessa casella per più clienti e pertanto configureranno i loro server Web per scegliere il sito corretto in base al nome host. Se qualcuno ha modificato il file host per provare a ingannare il codice in questo modo, è probabile che il server Web rifiuterà la richiesta in anticipo a causa del nome host sconosciuto. Anche se ammetto che non ho mai provato a farlo ... – Tinister

+0

Questo è vero; Ho lavorato per un'azienda in cui lo stesso server IIS ospitava diversi nomi di dominio in questo modo. Sto semplicemente sottolineando che ispezionando la proprietà "Host" ottieni ciò che l'utente ha digitato e non c'è alcuna garanzia che questo sia effettivamente un valore corretto. – Pete

3

se qualcuno qui è in realtà alla ricerca del nome di dominio del server, ecco un trucco che ho usato fin dagli inizi .net:

[DllImport("netapi32.dll", CharSet = CharSet.Auto)] 
    static extern int NetWkstaGetInfo(string server, int level, out IntPtr info); 

    [DllImport("netapi32.dll")] 
    static extern int NetApiBufferFree(IntPtr pBuf); 

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] 
    class WKSTA_INFO_100 
    { 
     public int wki100_platform_id; 
     [MarshalAs(UnmanagedType.LPWStr)] 
     public string wki100_computername; 
     [MarshalAs(UnmanagedType.LPWStr)] 
     public string wki100_langroup; 
     public int wki100_ver_major; 
     public int wki100_ver_minor; 
    } 

    public static string GetMachineNetBiosDomain() 
    { 
     IntPtr pBuffer = IntPtr.Zero; 

     WKSTA_INFO_100 info; 
     int retval = NetWkstaGetInfo(null, 100, out pBuffer); 
     if (retval != 0) 
      throw new Win32Exception(retval); 

     info = (WKSTA_INFO_100)Marshal.PtrToStructure(pBuffer, typeof(WKSTA_INFO_100)); 
     string domainName = info.wki100_langroup; 
     NetApiBufferFree(pBuffer); 
     return domainName; 
    } 

Si può effettivamente prendere un po 'di informazioni da Là. Aggiornamento: ora funziona con 64 bit.

Thanks Duncan for the 64bit version.

0

nel web.config è necessario aggiungere il pezzo di codice

<authentication mode="Windows"/> 
    <authorization> 
     <deny users="?"/> 
    </authorization> 

    <identity impersonate="true"/> 
+2

Benvenuti in Stack Overflow! Potresti per favore [modificare] la tua risposta per dare una spiegazione del perché questo codice risponde alla domanda? Le risposte al solo codice sono [scoraggiate] (http://meta.stackexchange.com/questions/148272), perché non insegnano la soluzione. – DavidPostill

3

un po 'tardi ..Ma la risposta mancante e migliore che ho trovato, dopo avere esattamente lo stesso problema:

private static string getComputerDomain() 
     { 
      try 
      { 
       return Domain.GetComputerDomain().Name; 
      } 
      catch (ActiveDirectoryObjectNotFoundException) 
      { 
       return "Local (No domain)"; 
      } 
     } 

Come indicato sul MSDN site:

valore

Questo ritorno è indipendente dalle credenziali di dominio in cui la l'applicazione viene eseguita. Questo metodo recupera il dominio del computer indipendentemente dalle credenziali del dominio dell'account trusted in cui viene eseguito in.

Testato sul mio personal computer (nessun dominio AD) e sul posto di lavoro (con dominio AD) sotto IIS (accesso anonimo).

Problemi correlati