c++ - sesion - ver que usuario usa que computadora en un dominio de active directory
¿Cómo se determina programáticamente si una computadora con Windows es miembro de un dominio? (7)
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.
¿Qué pasa con el nombre de la computadora?
editar: esta fue una ''respuesta'' de terapia desde mucho tiempo atrás. Lo que quería decir es cheching para el domain/name
forma en el domain/name
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.
Aquí hay un enfoque muerto 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á actualmente conectado a un dominio, la variable de entorno USERDNSDOMAIN estará vacía o no estará disponible. Pero hay algunas advertencias en las que debes pensar.
Pros:
- Muy fácil de implementar.
- 99% confiable.
Contras:
- Puede fallar o devolver resultados falsos si la computadora está unida al dominio, pero el usuario que ejecuta este código ha iniciado sesión en esa computadora 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 almacenadas en caché.
Directo de Microsoft:
Cómo determinar si un equipo con Windows NT / Windows 2000 es un miembro del dominio
Este enfoque utiliza la API de Windows. Del resumen del artículo:
En este artículo se describe cómo determinar si un equipo que ejecuta Windows NT 4.0 o Windows 2000 es miembro de un dominio, es miembro de un grupo de trabajo o es un equipo autónomo que utiliza las API de la Autoridad de seguridad local.
El artículo también proporciona un código de muestra 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.
El código en la muestra 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 LSA que es un método incorrecto. Debes usar DS api (2 líneas de código)
Puede verificar la clave de registro HKEY_LOCAL_MACHINE / SOFTWARE / Microsoft / Windows NT / CurrentVersion / Winlogon para obtener el valor de ''CachePrimaryDomain''.
Creo que la función NetServerEnum te ayudará en lo que quieras; SV_TYPE_DOMAIN_CTRL
los controladores de dominio principal con la constante SV_TYPE_DOMAIN_CTRL para el parámetro de tipo servertype . Si no obtienes ninguno, entonces no estás en un dominio.