2009-02-03 8 views
23

Il doit y avoir un moyen facile de le faire, je ne peux pas croire qu'il n'y en a pas. J'ai scanné à travers net et trouvé, comme, 20 méthodes différentes pour trouver dans quel domaine l'utilisateur actuel est, mais aucun pour obtenir le domaine (ou groupe de travail) de la machine actuelle.Nom de domaine de la machine dans .NET?

Dans C++ non géré cela est récupéré par:

WKSTA_INFO_100 *buf; 
NetWkstaGetInfo(NULL, 100, (LPBYTE*)buf); 
domain_name = pBuf->wki100_langroup; 

quelqu'un peut me aider, s'il y a un moyen d'obtenir même information managé C# natif?

EDIT1: Les gens, s'il vous plaît lisez la question. Je ne cherche pas de nom de domaine utilisateur.

+0

Astuce: .NET de base n'a pas de façon évidente d'obtenir ce encore. J'ai fini par P/Invoke NetWkstaGetInfo (que cette question a rendu facile à trouver). – Joshua

Répondre

33

Pour obtenir le domaine actuel du système sur lequel votre progamme est en cours d'exécution, vous pouvez utiliser System.DirectoryServices.ActiveDirectory.Domain.

Domain domain = Domain.GetComputerDomain(); 
Console.WriteLine(domain.Name); 
+0

Oh, bien! Merci, c'est exactement ce que je cherchais! – galets

+0

Si une machine n'est pas dans le domaine, nous aurons une exception. – Shrike

+0

@shrike - oui, vous voudrez peut-être vérifier si domain est null avant de référencer la propriété. Un peu d'encombrement la réponse, cependant. – tvanfosson

4

System.Environment.UserDomainName

+0

Je cours une application. Net en utilisant IIS et cela a fonctionné pour moi. –

+4

Ce n'est pas correct. Le nom de domaine de l'utilisateur n'est pas nécessairement le même que le nom de la machine. Dans mon lieu de travail, les machines de développement sont situées dans un sous-domaine. –

+0

Cela n'est pas non plus correct si la machine qui exécute votre site fait partie d'une batterie de serveurs derrière un proxy inverse. –

2

Si vous ne voulez pas ajouter une dépendance à System.DirectoryServices, vous pouvez également appeler l'API NetGetJoinInformation directement.

+2

'NetGetJoinInformation' renvoie le nom NetBIOS hérité du domaine. –

7

L'utilisation GetCurrentDomain est le même que Environment.UserDomainName, qui ne fonctionne pas correctement si votre programme est en cours d'exécution sur un ordinateur de domaine en tant qu'utilisateur non domaine. J'ai utilisé le code suivant:

try 
{ 
    return System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain().Name; 
} 
catch (Exception) 
{ 
    return Environment.UserDomainName; 
} 
10

Je travaille sur un projet où les utilisateurs peuvent être n'importe où; les utilisateurs non-domaine sur une machine de domaine, les utilisateurs sur une machine non-domaine, pas directement connecté au domaine sur un réseau tiers, etc. donc en fonction de AD est déjà un non-démarreur.

System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties(). Le nom de domaine est beaucoup plus fiable dans toutes ces conditions.

http://blogs.msdn.com/b/trobbins/archive/2006/01/04/509347.aspx

https://msdn.microsoft.com/en-us/library/system.net.networkinformation.ipglobalproperties.domainname(v=vs.110).aspx?cs-save-lang=1&cs-lang=cpp#code-snippet-2

Imports System.DirectoryServices 
Imports System.Net.NetworkInformation 

Public Class Form1 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     Try 
      MsgBox("Domain: " & ActiveDirectory.Domain.GetComputerDomain.Name) 
     Catch ex As Exception 
      MsgBox(ex.GetType.ToString & ": " & ex.Message) 
     End Try 
    End Sub 

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 
     Try 
      MsgBox("Domain: " & IPGlobalProperties.GetIPGlobalProperties().DomainName) 
     Catch ex As Exception 
      MsgBox(ex.GetType.ToString & ": " & ex.Message) 
     End Try 
    End Sub 

End Class 
+0

Vous venez de sauver ma peau. Merci :-) +18 si je le pouvais. – InteXX

+1

IPGlobalProperties.GetIPGlobalProperties(). DomainName échoue si la machine a été supprimée du domaine. Il retournera alors l'ancienne valeur. – AnthonyVO

Questions connexes