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?
Respuesta
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.
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
¿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.
Hasta donde yo sé, todas las computadoras con Windows deben tener un nombre, independientemente de si están en una red o no. –
Puede verificar la clave de registro HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon para obtener el valor de 'CachePrimaryDomain'.
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
@kgriffs No está disponible en mi máquina. –
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.
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;
}
Evite el LSA que es un método incorrecto. Debe usar DS api (2 líneas de código)
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é.
- 1. ¿Cómo encontrar si la computadora local está en un dominio?
- 2. ¿Cómo puedo saber qué computadora es el controlador de dominio en Windows mediante programación?
- 3. ¿Cómo se determina si una lista bidimensional contiene un valor?
- 4. ¿Cómo se determina si ACE o JET en una máquina con Windows usa .net?
- 5. ¿Cómo se determina si ParameterInfo es de tipo genérico?
- 6. ¿Cómo se determina si la referencia del objeto es nula?
- 7. ¿Determina si una cadena es un selector jQuery válido?
- 8. ¿Determina el uso de energía programáticamente en Windows?
- 9. ¿Cómo se determina si CKEditor está cargado?
- 10. ¿Cómo se determina cuando Windows termina de reiniciar?
- 11. ¿Cómo se determina el uso de stat() si un archivo es un enlace simbólico?
- 12. determina programáticamente si la dirección IP se asigna mediante dhcp o se establece manualmente en java
- 13. ¿Determina si una lista de Python es el 95% igual?
- 14. C# HttpWebRequest - ¿Cómo se determina si se realizó HTTP 301?
- 15. ¿Cómo registro nombres de dominio programáticamente?
- 16. ¿Cómo puedo saber si la computadora se ha reiniciado?
- 17. ¿Cómo determinar si algo es miembro de un conjunto ordenado?
- 18. ¿Cómo se determina si una dirección IP es privada en Python?
- 19. ¿Cómo sondear una computadora si es compatible con SSE2 en Delphi 32?
- 20. ¿Cómo se determina si un instalador de WiX es silencioso o interactivo?
- 21. ¿Determina si una aplicación está bloqueada/ocupada?
- 22. ¿Cómo se determina si XElement.Elements() contiene un nodo con un nombre específico?
- 23. ¿Cómo creo programáticamente un formulario de Windows?
- 24. Comprobar programáticamente si Windows 7 está activado
- 25. ¿Cómo se puede evitar programáticamente Windows desde el disco duro?
- 26. ¿Cómo puedo agregar una computadora a un dominio mediante programación (usando .NET)?
- 27. SharePoint, ¿cómo se determina programáticamente el tamaño de almacenamiento de un SPWeb?
- 28. ¿Es más rápido conectar/usar MySQL en localhost en lugar de un dominio (incluso si el dominio se resuelve en la misma computadora)?
- 29. ¿Cómo se determina si un tipo determinado (System.Type) hereda de una clase base específica (en .Net)?
- 30. ¿Es posible dar "Servicio de red" en una computadora permiso a un directorio en otra computadora?
Cualquier dominio, o dominio específico? Probablemente va a querer WMI ... –
Pregunta relacionada para [verificar un dominio en particular] (http://stackoverflow.com/q/4715512/588306) (y en [C#] (http://stackoverflow.com)/q/1290826/588306)). – Deanna