2009-07-02 5 views
6

Wenn ich hier bei der Arbeit mit dem lokalen LAN verbunden bin, muss meine App über eine interne IP auf unseren Server zugreifen, sonst muss ich unsere externe IP verwenden, wenn sie in der freien Natur ist.Wie programmiere ich programmgesteuert, um festzustellen, mit welcher Domäne ich verbunden bin?

Momentan versuche ich einfach, mich über die lokale IP zu verbinden und versuche dann das externe, wenn es fehlschlägt ... aber die Zeitüberschreitung dauert etwas zu lange und ich frage mich, ob es eine Möglichkeit gibt, herauszufinden, welche Domäne die Maschine ist verbunden mit vor dem Versuch.

Bearbeiten: Patrick> Im Wesentlichen läuft die App auf einem Tablet PC, der ein paar Mal am Tag mit dem lokalen Netzwerk verbunden ist. Es ist in etwa gleich zwischen der Anzahl der Verbindungen über das Netzwerk und den Zeiten, die es lokal verbindet.

Alle Maschinen verfügen über ein Domänenkonto, wenn sie mit dem Netzwerk verbunden sind (und haben Domäne mit einer Namenskonvention wie „LOCTabletx“ Konten wobei x eine Zahl an der Maschine gegeben ist, wenn es geisterhaft ist.

Was ich ‚für suche ist eine schnelle Möglichkeit, um zu sehen, ob die Maschine auf unserem lokalen Netzwerk oder dem Internet verbunden ist. Mit Environment.UserDomainName wird mir LOCTabletx und nicht den Domain-Namen.

EDIT

Wenn es jemandem hilft, versuche ich einfach DNS zu lösen. Löse den Namen eines Rechners, von dem ich garantieren kann, dass er im Netzwerk (einer der Server) sein wird. Es funktioniert ausreichend gut für mich.

+0

Sind Sie auf dem Computer mit einem Domänenkonto angemeldet und nur nicht physisch mit Ihrem Netzwerk verbunden? –

Antwort

7

Haben Sie versucht:

Environment.UserDomainName 

Sie auch einen Blick auf die aktiven IP-Adressen auf dem Computer, und Abfrage für eine, die auf Ihrem lokalen Netzwerk funktioniert nehmen könnte ...

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); 
} 

Und nachdem Sie das Netzwerk, in dem Sie sich befinden, herausgefunden haben, können Sie das Ereignis System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged abonnieren, um mit Ihren springenden Computernetzen umzugehen, während Ihre App läuft.

+0

Das bringt mir nur meinen Rechnernamen auf der Domain. Nicht der Domain-Name selbst. Zum Beispiel, wenn meine comp ist LOCProgrammer1 und die Domäne ist Company.Local Ich bekomme ersteres, und ich suche nach letzterem. –

+0

Das ist sehr merkwürdig. Ich erhalte unseren Domainnamen sowohl unter Vista als auch unter XP Pro. Vielleicht könnten Sie das als Hinweis darauf verwenden, dass Sie nicht bei der Domain angemeldet sind? –

+0

Ich bekomme meinen lokalen Rechnernamen - und bin nicht bei einer Domain angemeldet. Sinnvoll ist es jedoch - es gibt Ihnen das System, das Ihre Anmeldung authentifiziert hat, entweder den lokalen Computer, wenn Sie einen lokalen Benutzer verwenden, oder Ihre Domäne, wenn Sie sich bei einer Domäne anmelden. –

5
System.Environment.UserDomainName 
+2

"Verpasst es von _that_ viel." –

2

Sie möchten sich die API Network Location Awareness ansehen. Verfügbar unter Windows Vista oder neuer, ermöglicht es Ihnen, programmgesteuert zu ermitteln, mit welchem ​​Netzwerk Sie verbunden sind, und benachrichtigt zu werden, wenn sich dies ändert.

Es könnte Ihnen vertraut sein in Form von "Ist das ein Heim/Arbeit/öffentliches Netzwerk?" Dialogbox.

+0

Leider läuft auf den Maschinen WinXP Pro ohne eine Option zum Upgrade. Ich werde ein wenig nach WinXP suchen. Vielen Dank. –

3

Ein anderer Weg, aber ich weiß nicht, ob es wirklich besser als die anderen Lösungen ist:

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

ist dies eine Zeichenfolge, die „Kerberos“ unter Active Directory zurückgibt. Nicht sicher, was es sagen würde, wenn es nicht mit der Domäne verbunden ist.

0

Environment.UserDomainName ... gibt Ihnen den Computernamen, wenn Sie keiner Domäne angehören. Sie erhalten den Domain-Namen, wenn Sie mit einer Domain verbunden sind. Wenn Sie einen Computer verwenden, der mit einer Domäne außerhalb des Netzwerks verbunden ist und sich "in die freie Wildbahn" befindet, wird Environment.UserDomainName weiterhin den Domänennamen angeben, selbst wenn Sie den Computer neu starten und sich erneut anmelden (zu Ihrem Domänenkonto). Ihr Computer speichert die Anmeldeinformationen für die Domäne für ungefähr 30 Tage.

Wenn Sie sich bei Ihrem Computerkonto anmelden, erhalten Sie den Computernamen.

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

Dies wird "NTLM" zurückgeben, wenn es nicht mit dem Netzwerk verbunden ist.

Verwandte Themen