2009-07-02 6 views
6

Si je suis connecté au réseau local ici au travail, mon application doit pouvoir accéder à notre serveur via une adresse IP interne. Dans le cas contraire, je devrai utiliser notre adresse IP externe.Comment vérifier par programme pour voir à quel domaine je suis connecté?

Actuellement, j'essaie simplement de me connecter via l'IP locale puis d'essayer l'externe en cas d'échec ... mais le timeout prend un peu trop de temps et je me demandais s'il y avait un moyen de savoir quel domaine est la machine connecté à avant d'essayer.

Éditer: Patrick> L'application fonctionne essentiellement sur une tablette connectée plusieurs fois par jour au réseau local. Il est à peu près égal entre le nombre de fois qu'il se connecte sur le réseau et les fois qu'il se connecte localement.

Toutes les machines ont un compte de domaine quand ils sont connectés au réseau (et ont des comptes domaine avec une convention de nommage comme « LOCTabletx » où x est un nombre donné à la machine quand il ghosted.

Ce que je suis à la recherche d'un moyen rapide pour voir si la machine est connectée sur notre réseau local ou sur Internet. en utilisant Environment.UserDomainName me fait LOCTabletx et non le nom de domaine.

EDIT

Si cela aide quelqu'un, j'essaie juste de résoudre DNS Le nom d'une machine que je peux garantir sera sur le réseau (un des serveurs). Cela fonctionne suffisamment bien pour moi.

+0

Etes-vous connecté à la machine avec un compte de domaine, mais pas connecté physiquement à votre réseau de travail? –

Répondre

7

Avez-vous essayé:

Environment.UserDomainName 

Vous pouvez aussi jeter un oeil sur les adresses IP actives sur la machine, et requête pour un qui fonctionne sur votre réseau 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); 
} 

Et une fois que vous avez identifié le réseau sur lequel vous êtes, vous pouvez vous abonner à l'événement System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged pour gérer vos réseaux de saut d'ordinateur pendant que votre application est en cours d'exécution.

+0

Cela me donne seulement mon nom de machine sur le domaine. Pas le nom de domaine lui-même. Par exemple, si mon ordi est LOCProgrammer1 et le domaine est Company.Local je reçois le premier, et je cherche le dernier. –

+0

C'est très étrange. Je reçois notre nom de domaine sous Vista et XP Pro. Peut-être pourriez-vous utiliser cela comme une indication que vous n'êtes pas connecté au domaine? –

+0

Je reçois le nom de mon ordinateur local - et je ne suis pas connecté à un domaine. C'est logique - cela vous donnera n'importe quel système authentifié votre connexion, soit la machine locale si vous utilisez un utilisateur local, soit votre domaine si vous vous connectez à un domaine. –

5
System.Environment.UserDomainName 
+2

"Je l'ai manqué par beaucoup." –

2

Vous souhaitez consulter l'API Network Location Awareness. Disponible sur Windows Vista ou version ultérieure, il vous permet de découvrir par programme le réseau auquel vous êtes connecté et d'être averti lorsque cela change.

Cela vous est peut-être familier sous la forme de "Est-ce un réseau domestique/professionnel/public?" boite de dialogue.

+0

Malheureusement, les machines exécutent WinXP Pro sans option de mise à niveau. Je vais faire quelques recherches pour un équivalent pour WinXP. Je vous remercie. –

3

Une autre façon, mais je ne sais pas si elle est en fait mieux que les autres solutions est:

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

ceci est une chaîne qui retourne « Kerberos » sous le répertoire actif. Je ne sais pas ce qu'il dirait quand il n'est pas connecté au domaine.

0

Environment.UserDomainName ... vous donne le nom de la machine si vous n'êtes pas membre d'un domaine. Il vous donne le nom de domaine si vous êtes joint à un domaine. Si vous prenez une machine qui est jointe à un domaine hors du réseau et «dans la nature», Environment.UserDomainName continuera à fournir le nom de domaine même si vous redémarrez et vous reconnectez (à votre compte de domaine). Votre ordinateur met en cache les informations d'identification du domaine pendant environ 30 jours.

Si vous vous connectez à votre compte d'ordinateur, vous obtiendrez le nom de l'ordinateur.

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

Cela renverra "NTLM" lorsqu'il n'est pas connecté au réseau.

Questions connexes