Exemplo n.º 1
0
static
DWORD
CdcHandleOffSite(
    VOID
    )
{
    DWORD dwError = 0;
    PCDC_DC_INFO_W pCdcDCName = NULL;
    PWSTR pszNextDCName = NULL;
    BOOL bIsAlive = FALSE;
    CDC_DC_STATE cdcNextState = CDC_DC_STATE_UNDEFINED;

    dwError = CdcSrvGetDCName(NULL,&pCdcDCName);
    BAIL_ON_VMAFD_ERROR(dwError);

    dwError = CdcDbIsDCAlive(pCdcDCName, &bIsAlive);
    BAIL_ON_VMAFD_ERROR(dwError);

    dwError = CdcGetNewDC(&pszNextDCName, &cdcNextState);
    BAIL_ON_VMAFD_ERROR(dwError);

    switch (cdcNextState)
    {
        case CDC_DC_STATE_OFF_SITE:
          if (bIsAlive)
          {
              break;
          }
        case CDC_DC_STATE_SITE_AFFINITIZED:
          dwError = CdcUpdateAffinitizedDC(pszNextDCName);
          BAIL_ON_VMAFD_ERROR(dwError);
          break;
        case CDC_DC_STATE_NO_DCS_ALIVE:
          break;
        default:
          dwError = ERROR_INVALID_STATE;
          BAIL_ON_VMAFD_ERROR(dwError);
    }

    dwError = CdcStateTransition(cdcNextState);
    BAIL_ON_VMAFD_ERROR(dwError);

cleanup:

    if (pCdcDCName)
    {
        VmAfdFreeDomainControllerInfoW(pCdcDCName);
    }
    VMAFD_SAFE_FREE_MEMORY(pszNextDCName);
    return dwError;

error:

    goto cleanup;
}
Exemplo n.º 2
0
static
DWORD
CdcHandleSiteAffinitized(
    VOID
    )
{
    DWORD dwError = 0;
    PCDC_DC_INFO_W pCdcDCName = NULL;
    BOOL  bIsAlive = FALSE;
    PWSTR pszNewDCName = NULL;
    CDC_DC_STATE cdcNextState = CDC_DC_STATE_UNDEFINED;

    dwError = CdcSrvGetDCName(NULL,&pCdcDCName);
    BAIL_ON_VMAFD_ERROR(dwError);

    dwError = CdcDbIsDCAlive(pCdcDCName, &bIsAlive);
    BAIL_ON_VMAFD_ERROR(dwError);

    if (!bIsAlive)
    {
        dwError = CdcGetNewDC(&pszNewDCName, &cdcNextState);
        BAIL_ON_VMAFD_ERROR(dwError);

        if (cdcNextState != CDC_DC_STATE_NO_DCS_ALIVE)
        {
            dwError = CdcUpdateAffinitizedDC(pszNewDCName);
            BAIL_ON_VMAFD_ERROR(dwError);
        }
        dwError = CdcStateTransition(cdcNextState);
        BAIL_ON_VMAFD_ERROR(dwError);
    }

cleanup:

    if (pCdcDCName)
    {
        VmAfdFreeDomainControllerInfoW(pCdcDCName);
    }
    VMAFD_SAFE_FREE_MEMORY(pszNewDCName);
    return dwError;
error:

    goto cleanup;
}
Exemplo n.º 3
0
static
DWORD
CdcGetDomainControllers(
      PWSTR** ppszDomainControllers,
      PDWORD pdwCount
      )
{
      DWORD dwError       = 0;
      DWORD dwIndex       = 0;
      PWSTR pwszDomain    = NULL;
      PSTR  pszDomain     = NULL;
      PSTR  pszDCName     = NULL;

      PWSTR pwszAccount   = NULL;
      PSTR  pszAccount    = NULL;
      PWSTR pwszPassword  = NULL;
      PSTR  pszPassword   = NULL;
      PWSTR pwszAccountDN = NULL;
      PSTR  pszAccountDN  = NULL;
      PVMDNS_SERVER_CONTEXT pConnection  = NULL;
      PVMDNS_RECORD_ARRAY   pRecordArray = NULL;
      PWSTR* pszDomainControllers        = NULL;
      PCDC_DC_INFO_W pAffinitizedDC      = NULL;

      if (!ppszDomainControllers || !pdwCount)
      {
          dwError = ERROR_INVALID_PARAMETER;
          BAIL_ON_VMAFD_ERROR(dwError);
      }

      dwError = VmAfSrvGetMachineAccountInfo(
                            &pwszAccount,
                            &pwszPassword,
                            &pwszAccountDN,
                            NULL
                            );
      BAIL_ON_VMAFD_ERROR(dwError);

      dwError = VmAfdAllocateStringAFromW(
                                   pwszAccount,
                                   &pszAccount
                                   );
      BAIL_ON_VMAFD_ERROR(dwError);

      dwError = VmAfdAllocateStringAFromW(
                                  pwszPassword,
                                  &pszPassword
                                  );
      BAIL_ON_VMAFD_ERROR(dwError);

      dwError = VmAfSrvGetDomainName(&pwszDomain);
      BAIL_ON_VMAFD_ERROR(dwError);

      dwError = VmAfdAllocateStringAFromW(
                                pwszDomain,
                                &pszDomain
                                );
      BAIL_ON_VMAFD_ERROR(dwError);

      dwError = CdcSrvGetDCName(pwszDomain,&pAffinitizedDC);
      BAIL_ON_VMAFD_ERROR(dwError);

      dwError = VmAfdAllocateStringAFromW(
                                pAffinitizedDC->pszDCName,
                                &pszDCName
                                );
      BAIL_ON_VMAFD_ERROR(dwError);

      dwError = VmDnsOpenServerA(
                          pszDCName,
                          pszAccount,
                          pszDomain,
                          pszPassword,
                          0,
                          NULL,
                          &pConnection);
      BAIL_ON_VMAFD_ERROR(dwError);

      dwError = VmDnsQueryRecordsA(
                          pConnection,
                          pszDomain,
                          "_ldap._tcp",
                          VMDNS_RR_TYPE_SRV,
                          0,
                          &pRecordArray);
      BAIL_ON_VMAFD_ERROR(dwError);

      if (pRecordArray->dwCount)
      {
          dwError = VmAfdAllocateMemory(
                            sizeof(PWSTR)*pRecordArray->dwCount,
                            (PVOID *)&pszDomainControllers
                            );
          BAIL_ON_VMAFD_ERROR(dwError);
      }

      for (; dwIndex < pRecordArray->dwCount; dwIndex++)
      {
          dwError = VmAfdAllocateStringWFromA(
                                  pRecordArray->Records[dwIndex].Data.SRV.pNameTarget,
                                  &pszDomainControllers[dwIndex]
                                  );
          BAIL_ON_VMAFD_ERROR(dwError);

          dwError = VmAfdTrimFQDNTrailingDot(pszDomainControllers[dwIndex]);
          BAIL_ON_VMAFD_ERROR(dwError);
      }

      dwIndex = 0;

      *ppszDomainControllers = pszDomainControllers;
      *pdwCount = pRecordArray->dwCount;

cleanup:
      VMAFD_SAFE_FREE_MEMORY(pwszDomain);
      VMAFD_SAFE_FREE_MEMORY(pszDomain);
      VMAFD_SAFE_FREE_MEMORY(pszDCName);
      VMAFD_SAFE_FREE_MEMORY(pwszAccount);
      VMAFD_SAFE_FREE_MEMORY(pszAccount);
      VMAFD_SAFE_FREE_MEMORY(pwszPassword);
      VMAFD_SAFE_FREE_MEMORY(pszPassword);
      VMAFD_SAFE_FREE_MEMORY(pwszAccountDN);
      VMAFD_SAFE_FREE_MEMORY(pszAccountDN);

      if (pAffinitizedDC)
      {
          VmAfdFreeDomainControllerInfoW(pAffinitizedDC);
      }
      if (pRecordArray)
      {
          VmDnsFreeRecordArray(pRecordArray);
      }
      if (pConnection)
      {
          VmDnsCloseServer(pConnection);
      }

      return dwError;

error:

      if (ppszDomainControllers)
      {
          *ppszDomainControllers = NULL;
      }
      if (pszDomainControllers)
      {
          VmAfdFreeStringArrayW(pszDomainControllers,pRecordArray->dwCount);
      }

      goto cleanup;
}
Exemplo n.º 4
0
DWORD
CdcSrvGetDCName(
    PCWSTR pszDomainName,
    PCDC_DC_INFO_W *ppAffinitizedDC
    )
{
    DWORD dwError = 0;
    PCDC_DC_INFO_W pAffinitizedDC = NULL;
    DWORD dwAffinitizedSince = 0;
    BOOL bHAState = FALSE;
    PWSTR pszDomainToUse = NULL;

    if (!ppAffinitizedDC)
    {
        dwError = ERROR_INVALID_PARAMETER;
        BAIL_ON_VMAFD_ERROR(dwError);
    }

    dwError = VmAfSrvGetDomainName(&pszDomainToUse);
    BAIL_ON_VMAFD_ERROR(dwError);

    if (!IsNullOrEmptyString(pszDomainName))
    {
        if (!VmAfdStringIsEqualW(
                            pszDomainName,
                            pszDomainToUse,
                            FALSE
                            )
           )
        {
            dwError = ERROR_INVALID_DOMAINNAME;
            BAIL_ON_VMAFD_ERROR(dwError);
        }
    }

    dwError = CdcRegDbGetHAMode(&bHAState);
    BAIL_ON_VMAFD_ERROR(dwError);

    dwError = CdcDbGetAffinitizedDC(
                          pszDomainToUse,
                          &dwAffinitizedSince,
                          &pAffinitizedDC
                          );
    if (!bHAState || dwError)
    {
        dwError = VmAfdAllocateMemory(
                                sizeof(CDC_DC_INFO_W),
                                (PVOID *)&pAffinitizedDC
                                );
        BAIL_ON_VMAFD_ERROR(dwError);

        dwError = VmAfSrvGetDCName(&pAffinitizedDC->pszDCName);
        BAIL_ON_VMAFD_ERROR(dwError);

        dwError = VmAfSrvGetDomainName(&pAffinitizedDC->pszDomainName);
        BAIL_ON_VMAFD_ERROR(dwError);

        dwError = CdcGetClientSiteName(&pAffinitizedDC->pszDcSiteName);
        BAIL_ON_VMAFD_ERROR(dwError);
    }

    *ppAffinitizedDC = pAffinitizedDC;

cleanup:

    VMAFD_SAFE_FREE_MEMORY(pszDomainToUse);
    return dwError;
error:

    if (ppAffinitizedDC)
    {
        *ppAffinitizedDC = NULL;
    }
    if (pAffinitizedDC)
    {
        VmAfdFreeDomainControllerInfoW(pAffinitizedDC);
    }

    goto cleanup;
}
Exemplo n.º 5
0
DWORD
CdcSrvGetDCName(
    PCWSTR pszDomainName,
    PCDC_DC_INFO_W *ppAffinitizedDC
    )
{
    DWORD dwError = 0;
    PCDC_DC_INFO_W pAffinitizedDC = NULL;
    PCDC_DC_INFO_W pAffinitizedDCToFree = NULL;
    DWORD dwAffinitizedSince = 0;
    CDC_DB_ENUM_HA_MODE cdcHAMode = CDC_DB_ENUM_HA_MODE_UNDEFINED;
    PWSTR pszDomainToUse = NULL;
    UINT64 iStart = 0;
    UINT64 iEnd = 0;

    if (!ppAffinitizedDC)
    {
        dwError = ERROR_INVALID_PARAMETER;
        BAIL_ON_VMAFD_ERROR(dwError);
    }

    iStart = VmAfdGetTimeInMilliSec();
    dwError = VmAfSrvGetDomainName(&pszDomainToUse);
    BAIL_ON_VMAFD_ERROR(dwError);

    if (!IsNullOrEmptyString(pszDomainName))
    {
        if (!VmAfdStringIsEqualW(
                            pszDomainName,
                            pszDomainToUse,
                            FALSE
                            )
           )
        {
            dwError = ERROR_INVALID_DOMAINNAME;
            BAIL_ON_VMAFD_ERROR(dwError);
        }
    }

    dwError = CdcRegDbGetHAMode(&cdcHAMode);
    BAIL_ON_VMAFD_ERROR(dwError);

    dwError = CdcDbGetAffinitizedDC(
                          pszDomainToUse,
                          &dwAffinitizedSince,
                          &pAffinitizedDC
                          );
    if (cdcHAMode == CDC_DB_ENUM_HA_MODE_LEGACY || dwError)
    {
        pAffinitizedDCToFree = pAffinitizedDC;
        dwError = VmAfdAllocateMemory(
                                sizeof(CDC_DC_INFO_W),
                                (PVOID *)&pAffinitizedDC
                                );
        BAIL_ON_VMAFD_ERROR(dwError);

        dwError = VmAfSrvGetDCName(&pAffinitizedDC->pszDCName);
        BAIL_ON_VMAFD_ERROR(dwError);

        dwError = VmAfdTrimFQDNTrailingDot(pAffinitizedDC->pszDCName);
        BAIL_ON_VMAFD_ERROR(dwError);

        dwError = VmAfSrvGetDomainName(&pAffinitizedDC->pszDomainName);
        BAIL_ON_VMAFD_ERROR(dwError);

        dwError = CdcRegDbGetSiteName(&pAffinitizedDC->pszDcSiteName);
        BAIL_ON_VMAFD_ERROR(dwError);
    }

    iEnd = VmAfdGetTimeInMilliSec();
    *ppAffinitizedDC = pAffinitizedDC;

cleanup:

    VMAFD_SAFE_FREE_MEMORY(pszDomainToUse);
    if (pAffinitizedDCToFree)
    {
        VmAfdFreeDomainControllerInfoW(pAffinitizedDCToFree);
    }
    return dwError;
error:

    (DWORD)VmAfdAddDCSuperLogEntry(
                            gVmafdGlobals.pLogger,
                            iStart,
                            iEnd,
                            pAffinitizedDC,
                            dwError);

    if (ppAffinitizedDC)
    {
        *ppAffinitizedDC = NULL;
    }
    if (pAffinitizedDC)
    {
        VmAfdFreeDomainControllerInfoW(pAffinitizedDC);
    }

    goto cleanup;
}