How to detect if machine is joined to domain?

后端 未结 12 1843
梦毁少年i
梦毁少年i 2020-11-28 08:59

How do I detect whether the machine is joined to an Active Directory domain (versus in Workgroup mode)?

相关标签:
12条回答
  • 2020-11-28 09:45

    The Environment variables could work for you.

    Environment.UserDomainName
    

    MSDN Link for some more details.

    Environment.GetEnvironmentVariable("USERDNSDOMAIN")
    

    I'm not sure this environment variable exists without being in a domain.

    Correct me if I'm wrong Windows Admin geeks -- I believe a computer can be in several domains so it may be more important to know what domain, if any, you are in instead of it being in any domain.

    0 讨论(0)
  • 2020-11-28 09:48

    The proposed solution above returns false on a domain machine if a local user is logged in.

    The most reliable method i have found is via WMI:

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

    0 讨论(0)
  • 2020-11-28 09:48

    You might want to try using the DomainRole WMI field. Values of 0 and 2 show standalone workstation and standalone server respectively.

    We are using this for XIA Configuration our network audit software so I've cribbed the method here...

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

    Here's my methods with exception handling / comments which I developed based on several of the answers in this post.

    1. Gets you the domain the computer is connected to.
    2. Only returns the domain name if the user is actually logged in on a domain account.

      /// <summary>
      /// Returns the domain of the logged in user.  
      /// Therefore, if computer is joined to a domain but user is logged in on local account.  String.Empty will be returned.
      /// Relavant StackOverflow Post: http://stackoverflow.com/questions/926227/how-to-detect-if-machine-is-joined-to-domain-in-c
      /// </summary>
      /// <seealso cref="GetComputerDomainName"/>
      /// <returns>Domain name if user is connected to a domain, String.Empty if not.</returns>
      static string GetUserDomainName()
      {
          string domain = String.Empty;
          try
          {
              domain = Environment.UserDomainName;
              string machineName = Environment.MachineName;
      
              if (machineName.Equals(domain,StringComparison.OrdinalIgnoreCase))
              {
                  domain = String.Empty;
              }
          }
          catch
          {
              // Handle exception if desired, otherwise returns null
          }
          return domain;
      }
      
      /// <summary>
      /// 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!
      /// </summary>
      /// <seealso cref="GetUserDomainName"/>
      /// <returns>A string with the domain name if it's joined.  String.Empty if it isn't.</returns>
      static string GetComputerDomainName()
      {
          string domain = String.Empty;
          try
          {
              domain = System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain().Name;
          }
          catch
          {
              // Handle exception here if desired.
          }
          return domain;
      }
      
    0 讨论(0)
  • 2020-11-28 09:51

    Don't fool with pinvoke if you don't have to.

    Reference System.DirectoryServices, then call:

    System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain()
    

    Throws an ActiveDirectoryObjectNotFoundException if the machine is not domain-joined. The Domain object that's returned contains the Name property you're looking for.

    0 讨论(0)
  • 2020-11-28 09:51

    Just wanted to drop Rob's Code in 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
    

    As Well as Stephan's code here:

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


    I believe that only the second code will allow you to know what domain the machine joined, even if the current user IS NOT a domain member.

    0 讨论(0)
提交回复
热议问题