Comment détecter si la machine est jointe au domaine (en C #)?

Comment est-ce que je détecte si la machine est jointe à un domaine Active Directory (par opposition au mode de groupe de travail)?

Vous pouvez appeler les API Win32 telles que NetGetDcName qui renverra une chaîne vide / vide pour une machine non jointe à un domaine.

Mieux encore, NetGetJoinInformation vous dira explicitement si une machine n’est pas jointe, dans un groupe de travail ou dans un domaine.

En utilisant NetGetJoinInformation j’ai rassemblé ceci, qui a fonctionné pour moi:

 public class Test { public static bool IsInDomain() { Win32.NetJoinStatus status = Win32.NetJoinStatus.NetSetupUnknownStatus; IntPtr pDomain = IntPtr.Zero; int result = Win32.NetGetJoinInformation(null, out pDomain, out status); if (pDomain != IntPtr.Zero) { Win32.NetApiBufferFree(pDomain); } if (result == Win32.ErrorSuccess) { return status == Win32.NetJoinStatus.NetSetupDomainName; } else { throw new Exception("Domain Info Get Failed", new Win32Exception()); } } } internal class Win32 { public const int ErrorSuccess = 0; [DllImport("Netapi32.dll", CharSet=CharSet.Unicode, SetLastError=true)] public static extern int NetGetJoinInformation(ssortingng server, out IntPtr domain, out NetJoinStatus status); [DllImport("Netapi32.dll")] public static extern int NetApiBufferFree(IntPtr Buffer); public enum NetJoinStatus { NetSetupUnknownStatus = 0, NetSetupUnjoined, NetSetupWorkgroupName, NetSetupDomainName } } 

Ne vous y trompez pas si vous n’avez pas à le faire.

Référence System.DirectoryServices, puis appelez:

 System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain() 

Lève une ActiveDirectoryObjectNotFoundException si la machine n’est pas jointe à un domaine. L’object Domain renvoyé contient la propriété Name que vous recherchez.

Peut aussi être appelé en utilisant system.net

 ssortingng domain = System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName 

Si la chaîne de domaine est vide, la machine n’est pas liée.

 ManagementObject cs; using(cs = new ManagementObject("Win32_ComputerSystem.Name='" + System.Environment.MachineName + "'" )) { cs.Get(); Console.WriteLine("{0}",cs["domain"].ToSsortingng()); } 

Cela devrait vous permettre d’obtenir le domaine. Je crois que ce sera nul ou vide si vous faites partie d’un groupe de travail et non d’un domaine.

Assurez-vous de faire référence à System.Management

Je voulais juste laisser tomber le code de Rob dans VB:

  Public Class Test Public Function IsInDomain() As Boolean Try Dim status As Win32.NetJoinStatus = Win32.NetJoinStatus.NetSetupUnknownStatus Dim pDomain As IntPtr = IntPtr.Zero Dim result As Integer = Win32.NetGetJoinInformation(Nothing, pDomain, status) If (pDomain <> IntPtr.Zero) Then Win32.NetApiBufferFree(pDomain) End If If (result = Win32.ErrorSuccess) Then If (status = Win32.NetJoinStatus.NetSetupDomainName) Then Return True Else Return False End If Else Throw New Exception("Domain Info Get Failed") End If Catch ex As Exception Return False End Try End Function End Class Public Class Win32 Public Const ErrorSuccess As Integer = 0 Declare Auto Function NetGetJoinInformation Lib "Netapi32.dll" (ByVal server As String, ByRef IntPtr As IntPtr, ByRef status As NetJoinStatus) As Integer Declare Auto Function NetApiBufferFree Lib "Netapi32.dll" (ByVal Buffer As IntPtr) As Integer Public Enum NetJoinStatus NetSetupUnknownStatus = 0 NetSetupUnjoined NetSetupWorkgroupName NetSetupDomainName End Enum End Class 

Ainsi que le code de Stephan ici:

 Dim cs As System.Management.ManagementObject Try cs = New System.Management.ManagementObject("Win32_ComputerSystem.Name='" + System.Environment.MachineName + "'") cs.Get() dim myDomain as ssortingng = = cs("domain").ToSsortingng Catch ex As Exception End Try 

Je crois que seul le deuxième code vous permettra de savoir quel domaine la machine a rejoint, même si l’utilisateur actuel N’EST PAS un membre du domaine.

Les variables d’environnement peuvent fonctionner pour vous.

 Environment.UserDomainName 

Lien MSDN pour plus de détails.

 Environment.GetEnvironmentVariable("USERDNSDOMAIN") 

Je ne suis pas sûr que cette variable d’environnement existe sans être dans un domaine.

Corrigez-moi si je me trompe Geeks de Windows Admin – Je pense qu’un ordinateur peut être dans plusieurs domaines, il est donc plus important de savoir quel domaine, le cas échéant, vous êtes au lieu de le faire dans un domaine.

Vous pouvez vérifier la propriété PartOfDomain de la classe WMI Win32_ComputerSystem. Le MSDN dit:

PartOfDomain

Type de données: booléen

Type d’access: Lecture seule

Si la valeur est True, l’ordinateur fait partie d’un domaine. Si la valeur est NULL, l’ordinateur n’est pas dans un domaine ou son statut est inconnu. Si vous déconnectez l’ordinateur d’un domaine, la valeur devient fausse.

 ///  /// Determines whether the local machine is a member of a domain. ///  /// A boolean value that indicated whether the local machine is a member of a domain. /// http://msdn.microsoft.com/en-us/library/windows/desktop/aa394102%28v=vs.85%29.aspx public bool IsDomainMember() { ManagementObject ComputerSystem; using (ComputerSystem = new ManagementObject(Ssortingng.Format("Win32_ComputerSystem.Name='{0}'", Environment.MachineName))) { ComputerSystem.Get(); object Result = ComputerSystem["PartOfDomain"]; return (Result != null && (bool)Result); } } 

Voici mes méthodes avec le traitement des exceptions / commentaires que j’ai développés en fonction de plusieurs réponses dans cet article.

  1. Vous permet d’accéder au domaine auquel l’ordinateur est connecté.
  2. Renvoie uniquement le nom de domaine si l’utilisateur est effectivement connecté à un compte de domaine.

     ///  /// Returns the domain of the logged in user. /// Therefore, if computer is joined to a domain but user is logged in on local account. Ssortingng.Empty will be returned. /// Relavant StackOverflow Post: http://stackoverflow.com/questions/926227/how-to-detect-if-machine-is-joined-to-domain-in-c ///  ///  /// Domain name if user is connected to a domain, Ssortingng.Empty if not. static ssortingng GetUserDomainName() { ssortingng domain = Ssortingng.Empty; try { domain = Environment.UserDomainName; ssortingng machineName = Environment.MachineName; if (machineName.Equals(domain,SsortingngComparison.OrdinalIgnoreCase)) { domain = Ssortingng.Empty; } } catch { // Handle exception if desired, otherwise returns null } return domain; } ///  /// Returns the Domain which the computer is joined to. Note: if user is logged in as local account the domain of computer is still returned! ///  ///  /// A ssortingng with the domain name if it's joined. Ssortingng.Empty if it isn't. static ssortingng GetComputerDomainName() { ssortingng domain = Ssortingng.Empty; try { domain = System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain().Name; } catch { // Handle exception here if desired. } return domain; } 

Si les performances sont importantes, utilisez la fonction GetComputerNameEx :

  bool IsComputerInDomain() { uint domainNameCapacity = 512; var domainName = new SsortingngBuilder((int)domainNameCapacity); GetComputerNameEx(COMPUTER_NAME_FORMAT.ComputerNameDnsDomain, domainName, ref domainNameCapacity); return domainName.Length > 0; } [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)] static extern bool GetComputerNameEx( COMPUTER_NAME_FORMAT NameType, SsortingngBuilder lpBuffer, ref uint lpnSize); enum COMPUTER_NAME_FORMAT { ComputerNameNetBIOS, ComputerNameDnsHostname, ComputerNameDnsDomain, ComputerNameDnsFullyQualified, ComputerNamePhysicalNetBIOS, ComputerNamePhysicalDnsHostname, ComputerNamePhysicalDnsDomain, ComputerNamePhysicalDnsFullyQualified } 

Vous voudrez peut-être essayer d’utiliser le champ DomainRole WMI. Les valeurs 0 et 2 indiquent respectivement le poste de travail autonome et le serveur autonome.

Nous l’utilisons pour XIA Configuration, notre logiciel d’audit de réseau. J’ai donc choisi la méthode ici …

 ///  /// Determines whether the local machine is a member of a domain. ///  /// A boolean value that indicated whether the local machine is a member of a domain. /// http://msdn.microsoft.com/en-gb/library/windows/desktop/aa394102(v=vs.85).aspx public bool IsDomainMember() { ManagementObject ComputerSystem; using (ComputerSystem = new ManagementObject(Ssortingng.Format("Win32_ComputerSystem.Name='{0}'", Environment.MachineName))) { ComputerSystem.Get(); UInt16 DomainRole = (UInt16)ComputerSystem["DomainRole"]; return (DomainRole != 0 & DomainRole != 2); } } 

Vous pouvez vérifier en utilisant WMI :

 private bool PartOfDomain() { ManagementObject manObject = new ManagementObject(ssortingng.Format("Win32_ComputerSystem.Name='{0}'", Environment.MachineName)); return (bool)manObject["PartOfDomain"]; } 

La solution proposée ci-dessus renvoie false sur un ordinateur de domaine si un utilisateur local est connecté.

La méthode la plus fiable que j’ai trouvée est via WMI:

http://msdn.microsoft.com/en-us/library/aa394102(v=vs.85).aspx (voir domainrole)