diff --git a/Windows API/IsDomainController.cpp b/Windows API/IsDomainController.cpp new file mode 100644 index 0000000..4cdd16d --- /dev/null +++ b/Windows API/IsDomainController.cpp @@ -0,0 +1,67 @@ +DWORD IsDomainController(PBOOL IsDomainController) +{ + typedef enum _DSROLE_PRIMARY_DOMAIN_INFO_LEVEL { + DsRolePrimaryDomainInfoBasic = 1, + DsRoleUpgradeStatus, + DsRoleOperationState + } DSROLE_PRIMARY_DOMAIN_INFO_LEVEL; + + typedef enum _DSROLE_MACHINE_ROLE { + DsRole_RoleStandaloneWorkstation, + DsRole_RoleMemberWorkstation, + DsRole_RoleStandaloneServer, + DsRole_RoleMemberServer, + DsRole_RoleBackupDomainController, + DsRole_RolePrimaryDomainController + } DSROLE_MACHINE_ROLE; + + typedef struct _DSROLE_PRIMARY_DOMAIN_INFO_BASIC { + DSROLE_MACHINE_ROLE MachineRole; + ULONG Flags; + LPWSTR DomainNameFlat; + LPWSTR DomainNameDns; + LPWSTR DomainForestName; + GUID DomainGuid; + } DSROLE_PRIMARY_DOMAIN_INFO_BASIC, * PDSROLE_PRIMARY_DOMAIN_INFO_BASIC; + + typedef DWORD(WINAPI* DSROLEGETPRIMARYDOMAININFORMATION)(LPCWSTR, DSROLE_PRIMARY_DOMAIN_INFO_LEVEL, PDSROLE_PRIMARY_DOMAIN_INFO_BASIC); + typedef VOID(WINAPI* DSROLEFREEMEMORY)(PVOID); + + HMODULE hLibrary = NULL; + DSROLEGETPRIMARYDOMAININFORMATION DsRoleGetPrimaryDomainInformation = NULL; + DSROLEFREEMEMORY DsRoleFreeMemory = NULL; + PDSROLE_PRIMARY_DOMAIN_INFO_BASIC Buffer = 0; + DWORD dwError = ERROR_SUCCESS; + *IsDomainController = FALSE; + + hLibrary = LoadLibraryW(L"Netapi32.dll"); + if (hLibrary == NULL) + goto EXIT_ROUTINE; + + DsRoleGetPrimaryDomainInformation = (DSROLEGETPRIMARYDOMAININFORMATION)GetProcAddress(hLibrary, "DsRoleGetPrimaryDomainInformation"); + DsRoleFreeMemory = (DSROLEFREEMEMORY)GetProcAddress(hLibrary, "DsRoleFreeMemory"); + + if (!DsRoleGetPrimaryDomainInformation || !DsRoleFreeMemory) + goto EXIT_ROUTINE; + + if (DsRoleGetPrimaryDomainInformation(0, DsRolePrimaryDomainInfoBasic, Buffer) != ERROR_SUCCESS) + goto EXIT_ROUTINE; + + if (Buffer != NULL) + { + if (Buffer->MachineRole == DsRole_RolePrimaryDomainController) + *IsDomainController = TRUE; + } + +EXIT_ROUTINE: + + dwError = EhGetLastError(); + + if (hLibrary) + FreeLibrary(hLibrary); + + if (Buffer) + DsRoleFreeMemory(&Buffer); + + return dwError; +}