2009-10-21 16 views
7

¿Alguien puede decirme cómo obtener el nombre de dominio de los servidores en asp.net? (Environment.UserDomainName devuelve la cadena "APLICACIÓN IIS")Cómo obtener el nombre de dominio del servidor

Gracias por las repeticiones, pero sobre todo son sobre el nombre DNS del servidor, lo que necesito es el nombre de dominio. Por ejemplo, cuando me conecto a través de la autenticación de Windows Me tipo de dominio \ usuario y necesito este "dominio"

+0

¿El dominio de qué inicio de sesión? ¿Tuya? ¿Siempre vas a iniciar sesión? IIS normalmente tiene su propio inicio de sesión independiente bajo el cual se ejecuta, que, como ha descubierto, se encuentra en el dominio "APLICACIÓN IIS". – Tinister

Respuesta

3

Me parece que está intentando encontrar el nombre de dominio del usuario. Dado que está solicitando Environment.UserDomainName. Dado que es probable que su sitio se ejecute con "Permitir acceso anónimo": el usuario no está pasando su información de dominio al servidor e IIS le está dando la información de la cuenta que tiene, es decir, la cuenta del grupo de aplicaciones.

1

Pruebe la clase System.Net.Dns, que tiene un montón de métodos útiles, como GetHostEntry es decir:

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

Entonces, supongo que la siguiente pregunta es ¿cómo se obtiene la IP WAN de su servidor? ¿Y qué pasa con el escenario en el que usa el alojamiento compartido y, por lo tanto, no tiene una IP dedicada a su dominio? – Tinister

+0

Debo haber entendido mal "servidor de nombres de dominio", servidores, en plural significa para mí que de alguna manera desea realizar consultas de nombres de dominio. –

9

podrás necesidad de extraerlo de la solicitud objeto:

HttpContext.Current.Request.Url.Host 
+0

+1: esta es la forma más limpia. Simplemente devuelve el nombre de dominio, filtrado de puertos, http/https, ruta de acceso, cadena de consulta, etc. –

+0

Bueno, devuelve el nombre de dominio utilizado para acceder al servidor, eso está bien, pero puede ser uno de los muchos nombres diferentes utilizados para accede al servidor. –

2

hay problema específico a su pregunta, puede haber más de un nombre de dominio para una dirección IP específica.

Como se ha indicado Tinister, puede utilizar

HttpContext.Current.Request.Url.Host 

Pero eso sólo le dirá lo que escribió en la barra de direcciones del navegador del usuario. Si el usuario agregó una entrada a su archivo de host para su sitio y luego usa ese nombre de host, eso es lo que verá. (No tengo idea de por qué lo harían).

Si tiene más de un nombre de dominio para su sitio web, puede usarlo para averiguar cuál de los nombres de dominio solicitó el usuario.

+0

Las empresas de alojamiento compartido y de revendedor típicas usan el mismo cuadro para múltiples clientes, y por lo tanto configurarán sus servidores web para elegir el sitio correcto en función del nombre de host. Si alguien cambió su archivo de host para intentar engañar al código de esta manera, es probable que el servidor web simplemente rechace la solicitud por adelantado debido al nombre de host desconocido. Aunque admito que nunca he intentado hacerlo ... – Tinister

+0

Eso es verdad; Trabajé para una empresa donde el mismo servidor IIS albergaba varios nombres de dominio de esta manera. Simplemente estoy señalando que al inspeccionar la propiedad "Anfitrión" obtienes lo que el usuario tipeó, y no hay garantías de que este sea realmente un valor correcto. – Pete

3

Si alguien aquí es en realidad buscando el nombre de dominio del servidor, aquí es un truco que he estado usando desde los inicios .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; 
    } 

En realidad se puede tomar un poco de información de ahí. Actualización: ahora funciona con 64 bits.

Thanks Duncan for the 64bit version.

0

en el web.config es necesario agregar el fragmento de código

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

    <identity impersonate="true"/> 
+2

¡Bienvenido a Stack Overflow! ¿Podría por favor [editar] su respuesta para dar una explicación de por qué este código responde la pregunta? Las respuestas de solo código son [desaconsejadas] (http://meta.stackexchange.com/questions/148272) porque no enseñan la solución. – DavidPostill

3

Un poco tarde ..Pero la respuesta que falta y lo mejor que he encontrado, después de tener exactamente el mismo problema:

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

Como se indica en el MSDN site:

valor

Este retorno es independiente de las credenciales de dominio bajo el cual la la aplicación se ejecuta. Este método recuperará el dominio de la computadora , independientemente de las credenciales de dominio de la cuenta de confianza que se ejecuta debajo.

Probado en mi pc personal (sin dominio AD) y en el trabajo (con dominio AD) en IIS (acceso anónimo).

Cuestiones relacionadas