2008-10-15 15 views
10

Necesito una forma de determinar si la computadora que ejecuta mi programa está unida a cualquier dominio. No importa de qué dominio específico sea parte, solo si está conectado a algo. Estoy codificando en vC++ contra la API de Win32.¿Cómo se determina programáticamente si una computadora con Windows es miembro de un dominio?

+0

Cualquier dominio, o dominio específico? Probablemente va a querer WMI ... –

+0

Pregunta relacionada para [verificar un dominio en particular] (http://stackoverflow.com/q/4715512/588306) (y en [C#] (http://stackoverflow.com)/q/1290826/588306)). – Deanna

Respuesta

11

Directamente de Microsoft:

How To Determine If a Windows NT/Windows 2000 Computer Is a Domain Member

Este enfoque utiliza la API de Windows. Desde el resumen del artículo:

En este artículo se describe cómo determinar si un equipo que es que ejecuta Windows NT 4.0 o Windows 2000 es un miembro de un dominio, es un miembro de de un grupo de trabajo o es una equipo independiente que utiliza las API de la autoridad local .

El artículo también proporciona código de ejemplo para un pequeño programa que genera si la computadora en la que se ejecuta el programa es parte de un dominio, parte de un grupo de trabajo o una computadora independiente.

+0

Tenga en cuenta que no necesita el permiso GENERIC_READ si solo va a verificar si la máquina está unida al dominio (y también obtener el nombre de dominio). GENERIC_READ requiere elevación, mientras que usar solo POLICY_VIEW_LOCAL_INFORMATION no lo hace. – TripShock

0

¿qué tal desde el nombre de la computadora?

editar: esto fue una 'respuesta' de crapy desde mucho tiempo atrás. Lo que quería decir es cheching para el formulario domain\name en el nombre de la computadora. Eso, por supuesto, implica que si conoce el nombre del dominio, no resuelve el problema de simplemente saber si la computadora está en algún dominio.

+0

Hasta donde yo sé, todas las computadoras con Windows deben tener un nombre, independientemente de si están en una red o no. –

1

Puede verificar la clave de registro HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon para obtener el valor de 'CachePrimaryDomain'.

+1

MSDN dice que esta clave ya no está en uso a partir de Windows 2000, pero se mantuvo para compatibilidad hacia atrás. Esto me hace preguntarme si es seguro de usar. – kgriffs

+0

@kgriffs No está disponible en mi máquina. –

3

Creo que la función NetServerEnum le ayudará en lo que quiera; Pediría los controladores de dominio principal con la constante SV_TYPE_DOMAIN_CTRL para el parámetro servertype. Si no obtienes ninguno, entonces no estás en un dominio.

1

El código en el ejemplo de MSDN está un poco desactualizado. Esta es la función que se me ocurrió que funciona.

bool ComputerBelongsToDomain() 
{ 
    bool ret = false; 

    LSA_OBJECT_ATTRIBUTES objectAttributes; 
    LSA_HANDLE policyHandle; 
    NTSTATUS status; 
    PPOLICY_PRIMARY_DOMAIN_INFO info; 

    // Object attributes are reserved, so initialize to zeros. 
    ZeroMemory(&objectAttributes, sizeof(objectAttributes)); 

    status = LsaOpenPolicy(NULL, &objectAttributes, GENERIC_READ | POLICY_VIEW_LOCAL_INFORMATION, &policyHandle); 
    if (!status) 
    { 
     status = LsaQueryInformationPolicy(policyHandle, PolicyPrimaryDomainInformation, (LPVOID*)&info); 
     if (!status) 
     { 
      if (info->Sid) 
       ret = true; 

      LsaFreeMemory(info); 
     } 

     LsaClose(policyHandle); 
    } 

    return ret; 
} 
0

Evite el LSA que es un método incorrecto. Debe usar DS api (2 líneas de código)

+2

¿tiene un enlace a la página de MSDN para esa API? – TripShock

+0

Supongo que se está refiriendo al uso de [DSBind] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms675931 (v = vs.85) .aspx). Tenga en cuenta que solo funciona en Vista/2008 y más reciente. – DougN

1

Aquí hay un enfoque simple que no veo mencionado.

TCHAR UserDnsDomain[128] = { 0 }; 
DWORD Result = 0; 

Result = GetEnvironmentVariable("USERDNSDOMAIN", UserDnsDomain, sizeof(UserDnsDomain)); 

if (Result == 0 || Result >= sizeof(UserDnsDomain) || GetLastError() == ERROR_ENVVAR_NOT_FOUND) 
{ 
    return(FALSE); // Not logged in to a domain 
} 

Esto se basa en la idea de que si el usuario que ejecuta este código no está conectado en ese momento a un dominio, entonces la variable de entorno USERDNSDOMAIN estará vacío o no está disponible. Pero hay algunas advertencias en las que debes pensar.

Pros:

  • muy fácil de implementar.
  • 99% confiable.

Contras:

  • puede fallar o devolver resultados erróneos si el equipo es de dominio se unió, pero el usuario que ejecuta este código se registra en ese equipo con una cuenta local.
  • Puede fallar o devolver resultados falsos si la computadora está unida al dominio, pero la conectividad de red a un controlador de dominio no estaba disponible en el momento del inicio de sesión/usuario conectado con las credenciales en caché.
Cuestiones relacionadas