2009-07-02 13 views
6

Si estoy conectado a la LAN local aquí en el trabajo, necesito que mi aplicación acceda a nuestro servidor a través de una IP interna; de lo contrario, tendré que usar nuestra IP externa cuando esté en libertad.¿Cómo compruebo programáticamente para ver a qué dominio estoy conectado?

Actualmente, intento conectarme a través de la IP local y luego probar con la externa si falla ... pero el tiempo de espera demora demasiado y me pregunto si hay una forma de averiguar qué dominio tiene la máquina conectado a antes de intentarlo

Edit: Patrick> Básicamente, la aplicación se ejecuta en una tableta que está conectada a la red local un par de veces al día. Es aproximadamente igual entre la cantidad de veces que se conecta a través de la red y las veces que se conecta localmente.

Todas las máquinas tienen una cuenta de dominio cuando están conectados a la red (y tienen cuentas de dominio con el nombre convencional de como "LOCTabletx" donde x es un número dado a la máquina cuando se acaba.

Lo que estoy buscando es una forma rápida de ver si la máquina está conectada en nuestra red local o de Internet. Usando Environment.UserDomainName me pone LOCTabletx y no el nombre de dominio.

EDITAR

Si ayuda a alguien, intento DNS Resolver el nombre de una máquina que puedo garantizar estará en la red (uno de los servidores). Funciona lo suficientemente bien para mí.

+0

¿Ha iniciado sesión en la máquina con una cuenta de dominio y simplemente no está físicamente conectado a su red de trabajo? –

Respuesta

7

Ha intentado:

Environment.UserDomainName 

También puede echar un vistazo a las direcciones IP activas en la máquina, y la consulta de uno que funcione en su red local ...

var x = NetworkInterface.GetAllNetworkInterfaces() 
    .Where(ni => ni.OperationalStatus == OperationalStatus.Up) 
    .SelectMany(ni => ni.GetIPProperties().UnicastAddresses); 

// do something with the collection here to determine if you're on the right network. 
// just looping & printing here for example. 
foreach (var item in x) 
{   
    Console.WriteLine(item.Address); 
} 

Y una vez que haya descubierto la red en la que se encuentra, puede suscribirse al evento System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged para manejar las redes de salto de su computadora mientras se ejecuta su aplicación.

+0

Eso solo me da el nombre de mi máquina en el dominio. No es el nombre de dominio en sí. Por ejemplo, si mi comp es LOCProgrammer1 y el dominio es Company.Local obtengo el primero, y estoy buscando el último. –

+0

Eso es muy extraño. Obtengo nuestro nombre de dominio tanto en Vista como en XP Pro. Tal vez podrías usar eso como una indicación de que no has iniciado sesión en el dominio. –

+0

Obtengo el nombre de mi máquina local y no estoy conectado a un dominio. Sin embargo, tiene sentido: le proporcionará el sistema que haya autenticado su inicio de sesión, ya sea la máquina local si usa un usuario local o su dominio si inicia sesión en un dominio. –

5
System.Environment.UserDomainName 
+2

"Lo perdí por _ eso_ mucho". –

2

Quiere ver la API Network Location Awareness. Disponible en Windows Vista o posterior, le permite descubrir de manera programática a qué red está conectado y recibir notificaciones cuando cambie.

Podría ser familiar para usted en la forma de "¿Es esta una red doméstica/laboral/pública?" caja de diálogo.

+0

Lamentablemente, las máquinas ejecutan WinXP Pro sin opción de actualización. Aunque buscaré un equivalente para WinXP. Gracias. –

3

Otra forma, pero no sé si es realmente mejor que las otras soluciones es:

System.Security.Principal.WindowsIdentity.GetCurrent().AuthenticationType 

Ésta es una cadena que devuelve "Kerberos" en el directorio activo. Sin embargo, no estoy seguro de lo que diría cuando no esté conectado al dominio.

0

Environment.UserDomainName ... le da el nombre de la máquina si no está unido a un dominio. Le proporciona el nombre de dominio si está unido a un dominio. Si toma una máquina que está unida a un dominio fuera de la red y sale "en la naturaleza", Environment.UserDomainName continuará proporcionando el nombre de dominio incluso si reinicia y vuelve a iniciar sesión (a su cuenta de dominio). Su máquina almacena en caché las credenciales de dominio durante aproximadamente 30 días.

Si inicia sesión en la cuenta de su máquina, obtendrá el nombre de la máquina.

4
System.Security.Principal.WindowsIdentity.GetCurrent().AuthenticationType 

Esto devolverá "NTLM" cuando no esté conectado a la red.

Cuestiones relacionadas