¿Cómo puedo detectar si el equipo está unido a un dominio de Active Directory (en comparación con en el modo de Grupo de trabajo)?

InformationsquelleAutor DSO | 2009-05-29

12 Comentarios

  1. 28

    Puede PInvoke a la API de Win32 como NetGetDcName que va a devolver un valor null o cadena vacía para las que no sean del dominio de la máquina.

    Aún mejor es NetGetJoinInformation que le dirá explícitamente si una máquina está separadas, en un grupo de trabajo o en un dominio.

    Utilizando NetGetJoinInformation armé este, que trabajó para mí:

    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(string 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
        }
    
    }
    • Fresco. Pero, ¿no hay una pérdida de memoria en su función, la pDomain datos devueltos por NetGetJoinInformation?
    • (no es que una fuga importa demasiado… como voy a estar llamando a esto una vez y se almacena en la memoria caché)
    • Ahh – el código de ejemplo he hackeado este arriba en el PInvoke sitio estaba llamando NetApiBufferFree – he añadido que para la muestra =)
    • Es importante tener en cuenta que NetGetJoinInformation devuelve el legado nombre de dominio NetBIOS, más que el nombre de dominio (de ahí el Red en NetGetJoinInformation)
    • En lugar de throw new Exception("Domain Info Get Failed"); que debe hacer throw new Exception("Domain Info Get Failed", new Win32Exception()); insetad. El interior de la Win32Exception se llama internamente a Marshal.GetLastWin32Error() y establecer el código de error y el mensaje de error para que el código en el interior de la excepción. Es por eso que usted SetLastError=true en el p/invoke firma, por lo que Marshal.GetLastWin32Error() de trabajo.
  2. 91

    No engañarse con pinvoke si usted no tiene a.

    Sistema De Referencia.DirectoryServices, a continuación, llame al:

    System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain()

    Produce una ActiveDirectoryObjectNotFoundException si la máquina no está unido a un dominio.
    El objeto de Dominio que se devuelve contiene el Nombre de la propiedad que usted está buscando.

    • Siempre me encanta encontrar que existe una versión administrada de casi cualquier cosa.
    • Nota a los demás.. asegúrese de usar GetComputerDomain() (como se sugirió anteriormente) y no GetCurrentDomain(). GetCurrentDomain() se bloquea por edades si no está unido a un dominio.
    • Hay un problema con esta llamada como se tarda unos 2 minutos en muchas configuraciones.
    • Sólo tardó 30 segundos para ejecutar esto en un decentemente grandes empresas bosque de AD. :-/ Parece un poco raro…
    • Seguimiento a mi, yo estaba usando LINQPad y con Dump() en el objeto de Dominio, que es lo que estaba tomando tanto tiempo! El acceso a la propiedad de Nombre de Dominio devuelto instancia es realmente rápido. 🙂
    • Alguien ha intentado esto en un read-only domain controller medio ambiente? Estas agradable útil .net métodos tienen la mala costumbre de resistencia cuando todo lo que vemos es un RODC.
    • NOTA: Este método devolverá el dominio, incluso en el caso de que un usuario se registra en una cuenta local. Como resultado, el código que se utiliza para recuperar la configuración para un usuario tiene un bonito agujero de seguridad en el que un usuario puede crear una cuenta de usuario local para suplantar la identidad de otra persona. (Creo que la solución a esto es el medio Ambiente.UserDomainName)
    • Esta solución no funciona si usted necesita para saber si el equipo está unido a un dominio, incluso cuando no está conectado a la red. En ese caso se producirá una ActiveDirectoryObjectNotFoundException.
    • He probado este método en mi máquina virtual azules y es muy lento. tiene que usar el método pinvoke.
    • este método de acceso DC de su dominio
    • Este método puede ser extremadamente lenta. En algunos entornos puede tardar más de 30 segundos.

  3. 19

    También puede ser llamado por el uso de system.net

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

    Si el dominio de la cadena es vacía la máquina no está atado.

    Documentación sobre la propiedad devuelta https://docs.microsoft.com/en-us/dotnet/api/system.net.networkinformation.ipglobalproperties.domainname?view=netframework-4.7.2#System_Net_NetworkInformation_IPGlobalProperties_DomainName

    • Esta es la mejor respuesta ya que es una solución administrada y el más rápido.
    • Esto devuelve el sufijo DNS principal para el equipo que no es necesariamente una indicación de que en la EA. Si se agrega un sufijo DNS para un PC que en un grupo de trabajo devuelve que el sufijo del nombre, no es una cadena vacía.
    • De acuerdo a la documentación «Una instancia de String que contiene el equipo del nombre de dominio. Si el equipo no pertenece a un dominio, devuelve un Vacío.» docs.microsoft.com/en-us/dotnet/api/…
    • Vi la documentación. Lamentablemente no hay ambigüedad entre dominios DNS y dominios de AD. Este código parece estar dirigiéndose a la antigua.
  4. 7
    ManagementObject cs;
            using(cs = new ManagementObject("Win32_ComputerSystem.Name='" + System.Environment.MachineName + "'" ))
            {
                cs.Get();
                Console.WriteLine("{0}",cs["domain"].ToString());
            }

    Que debe permitir obtener el dominio. Creo que va a ser nulo o vacío si usted es parte de un grupo de trabajo y no de un dominio.

    Asegúrese de Sistema de referencia.Gestión de

    • Devuelve «GRUPO de trabajo» si no en el dominio. Esto va a funcionar (a menos que usted está en un dominio denominado «GRUPO de trabajo»!), pero voy a esperar un poco para ver si hay un no-WMI enfoque basado en antes de elegirlo como la respuesta correcta.
    • Gracias por dejarme saber. Yo sólo tengo mi máquina de trabajo a prueba y yo no puedo exactamente lo quita del dominio de la prueba.
    • Pensándolo bien no creo que esto va a funcionar. Resulta que el nombre del grupo de trabajo para mi caja de prueba es en realidad un GRUPO de trabajo. Creo que su regreso el nombre de grupo de trabajo, no un valor fijo, que a partir de un API de la perspectiva hace más sentido, pero no significa que usted no puede usar esto para determinar si su dominio.
    • +1 para el método es rápido, no es necesario que el usuario que ha iniciado sesión, o incluso solicitar el acceso a la DC para obtener el nombre de
  5. 5

    Sólo quería dejar de Rob Código en VB:

    Así como Stephan el código aquí:


    Yo creo que sólo el segundo código le permitirá saber qué dominio de la máquina unido, incluso si el usuario actual NO ES un miembro del dominio.

  6. 4

    Las variables de Entorno puede trabajar para usted.

    Enlace de MSDN para más detalles.

    No estoy seguro de que esta variable de entorno existe sin estar dentro de un dominio.

    Me corrija si estoy equivocado Windows Admin geeks-creo que un equipo puede estar en varios dominios, por lo que puede ser más importante saber qué dominio, si lo hubiera, que usted en lugar de que sea en cualquier de dominio.

    • Tan lejos como soy consciente de que un equipo sólo puede unirse a un de dominio – pero usted puede ser capaz de acceder a un PC utilizando las credenciales de más de un dominio en el bosque, o de varios de los bosques si no se confía en configurar. Se pone un poco demasiado complicado ahí =)
    • Medio ambiente.UserDomainName devuelve el nombre del equipo si el equipo no está unido a un dominio. Supongo que puedo comparar con el medio Ambiente.MachineName para determinar si su dominio, pero no estoy seguro de si esto va a ser correcto en todas las situaciones.
    • Sé que me estoy metiendo en la tarde aquí, pero sólo en caso de que alguien se topa con este hilo sólo quería mencionar que incluso en un dominio de la máquina si la cuenta de usuario que el proceso se ejecuta bajo una cuenta local o una cuenta de sistema, usted no puede confiar en UserDomainName != MachineName.
    • va a ser. Los dominios y los equipos comparten un espacio de nombres.
    • ¿Por qué no puedes confiar en UserDomainName != MachineName en el caso donde el equipo está unido a un dominio, pero la corriente de usuario que se ejecuta como una cuenta local?
    • Debido a un proceso que se ejecuta como un usuario local en un equipo unido al dominio devolverá el nombre de la máquina, no el nombre de dominio, el mismo, como si no fuera de dominio. La sugerencia es usar esto como una indicación de dominio o no.
    • Me acaba de publicar una nueva respuesta. Si estoy malentendido, por favor hágamelo saber.
    • Joe Clancy también publicó que el método que debe de funcionar bien (aunque yo todavía creo que es mejor P/Invoke en lugar de hacer referencia a un gigante de la asamblea para una llamada a un método.)

  7. 4

    Puede comprobar el PartOfDomain propiedad de Win32_ComputerSystem clase WMI.
    El MSDN dice :

    PartOfDomain

    Tipo de datos: boolean

    Access type: Read-only

    Si es True, el equipo es parte de un dominio. Si el valor es NULL, el equipo no está en un dominio o en el estado es desconocido. Si
    unjoin el equipo de un dominio, el valor se convierte en falsa.

    • A diferencia de algunas otras respuestas aquí, este no parecen ofrecer una solución para determinar si el equipo está unido a un dominio de AD.
  8. 3

    He aquí mis métodos con manejo de excepciones /comentarios que he desarrollado basado en varias de las respuestas en este post.

    1. Consigue el dominio que el equipo está conectado.
    2. Sólo devuelve el nombre de dominio si el usuario se registra en una cuenta de dominio.

  9. 1

    Es posible que desee probar el uso de la DomainRole WMI campo. Los valores de 0 y 2 muestran independiente de la estación de trabajo y servidor independiente, respectivamente.

    Estamos usando esto para XIA Configuración de nuestra red de software de auditoría por lo que me he cribbed el método aquí…

Dejar respuesta

Please enter your comment!
Please enter your name here