2009-07-02 10 views
6

Se sono connesso alla LAN locale qui al lavoro, ho bisogno che la mia app acceda al nostro server tramite un IP interno, altrimenti, dovrò usare il nostro IP esterno quando sono in giro.Come faccio a controllare a livello di codice per vedere a quale dominio sono connesso?

Attualmente, provo solo a connettermi tramite l'IP locale e poi a provare l'esterno se fallisce ... ma il timeout richiede un po 'troppo tempo e mi chiedevo se c'è un modo per scoprire quale dominio è la macchina collegato a prima di provare.

Modifica: Patrick> In sostanza, l'app viene eseguita su un tablet pc connesso alla rete locale un paio di volte al giorno. È approssimativamente uguale tra il numero di volte che si connette alla rete e le volte che si connette localmente.

Tutte le macchine hanno un account di dominio quando sono collegati alla rete (e possiedono account di dominio con una convenzione di denominazione di tipo "LOCTabletx" dove x è un numero dato alla macchina quando è fantasma.

Quello che ho 'm cercando è un modo veloce per vedere se la macchina è collegata sulla nostra rete locale o Internet. Utilizzando Environment.UserDomainName mi viene LOCTabletx e non il nome di dominio.

EDIT

Se aiuta qualcuno, cerco solo di risolvere il DNS del nome di una macchina che posso garantire che sarà sulla rete (uno dei server). Funziona abbastanza bene per me.

+0

Si è connessi alla macchina con un account di dominio e non si è connessi fisicamente alla rete di lavoro? –

risposta

7

Hai provato:

Environment.UserDomainName 

Si potrebbe anche dare un'occhiata agli indirizzi IP attivi sulla macchina, e query per uno che funziona sulla rete locale ...

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

E dopo aver scoperto la rete su cui ti trovi, puoi iscriverti all'evento System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged per gestire le reti del tuo computer mentre la tua app è in esecuzione.

+0

Mi viene assegnato solo il nome della macchina nel dominio. Non il nome di dominio stesso. Ad esempio, se il mio comp è LOCProgrammer1 e il dominio è Company.Local, ottengo il primo e sto cercando quest'ultimo. –

+0

È molto strano. Ottengo il nostro nome di dominio sotto Vista e XP Pro. Forse potresti usarlo come un'indicazione che non sei loggato nel dominio? –

+0

Ricevo il nome del mio computer locale e non sono collegato a un dominio. Ha comunque senso: ti darà il sistema che ha autenticato il tuo login, o la macchina locale se usi un utente locale, o il tuo dominio se accedi a un dominio. –

5
System.Environment.UserDomainName 
+2

"Mi è mancato per tutto questo". –

2

Si desidera esaminare l'API Network Location Awareness. Disponibile su Windows Vista o versioni successive, consente di scoprire a livello di programma a quale rete si è connessi e di essere avvisati quando questo cambia.

Potrebbe esservi familiare nella forma di "È una casa/lavoro/rete pubblica?" la finestra di dialogo.

+0

Sfortunatamente le macchine eseguono WinXP Pro senza un'opzione per l'aggiornamento. Farò qualche ricerca per un equivalente per WinXP però. Grazie. –

3

altro modo, ma non so se è davvero meglio rispetto alle altre soluzioni è:

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

Questa è una stringa che restituisce "Kerberos" nella directory attiva. Non sono sicuro di cosa direbbe quando non è connesso al dominio.

0

Environment.UserDomainName ... indica il nome della macchina se non si è connessi a un dominio. Ti dà il nome di dominio se ti unisci a un dominio. Se si prende una macchina collegata a un dominio fuori dalla rete e fuori "nella natura", Environment.UserDomainName continuerà a fornire il nome di dominio anche se si riavvia e si effettua di nuovo l'accesso (al proprio account di dominio). La tua macchina memorizza nella cache le credenziali del dominio per circa 30 giorni.

Se si accede all'account della macchina, verrà visualizzato il nome della macchina.

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

Questo restituirà "NTLM" quando non connesso alla rete.

Problemi correlati