Пример #1
0
static
DWORD
CdcUpdateAffinitizedDC(
    PWSTR pszNewDCName
    )
{
    DWORD dwError = 0;
    PWSTR pszDomainName = NULL;

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

    dwError = CdcDbAddAffinitizedDC(
                              pszNewDCName,
                              pszDomainName
                              );
    BAIL_ON_VMAFD_ERROR(dwError);

cleanup:

    VMAFD_SAFE_FREE_MEMORY(pszDomainName);
    return dwError;

error:

    goto cleanup;
}
Пример #2
0
static
DWORD
CdcGetNewDC(
    PWSTR* ppszNewDCName,
    PCDC_DC_STATE pCdcNextState
    )
{
    DWORD dwError = 0;
    PWSTR pszNewDCName = NULL;
    PWSTR pszSiteName = NULL;
    PWSTR pszDomainName = NULL;
    CDC_DC_STATE cdcNextState = CDC_DC_STATE_UNDEFINED;

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

    dwError = CdcGetClientSiteName(&pszSiteName);
    BAIL_ON_VMAFD_ERROR(dwError);

    dwError = CdcDbGetClosestDCOnSite(
                                pszSiteName,
                                pszDomainName,
                                &pszNewDCName
                                );
    if (dwError)
    {
        VMAFD_SAFE_FREE_MEMORY(pszNewDCName);

        dwError = CdcDbGetClosestDC(
                                   pszDomainName,
                                   &pszNewDCName
                                   );
        if (dwError)
        {
            cdcNextState = CDC_DC_STATE_NO_DCS_ALIVE;
            dwError = 0;
        }
        else
        {
            cdcNextState = CDC_DC_STATE_OFF_SITE;
        }
    }
    else
    {
        cdcNextState = CDC_DC_STATE_SITE_AFFINITIZED;
    }

    *ppszNewDCName = pszNewDCName;
    *pCdcNextState = cdcNextState;


cleanup:

    VMAFD_SAFE_FREE_MEMORY(pszDomainName);
    VMAFD_SAFE_FREE_MEMORY(pszSiteName);
    return dwError;

error:

    if (ppszNewDCName)
    {
        *ppszNewDCName = NULL;
    }
    if (pCdcNextState)
    {
        *pCdcNextState = CDC_DC_STATE_UNDEFINED;
    }
    VMAFD_SAFE_FREE_MEMORY(pszNewDCName);

    goto cleanup;
}
Пример #3
0
static
DWORD
CdcRefreshCache(
    BOOL bPurgeRefresh,
    PCDC_DB_ENTRY_W pCdcEntry,
    DWORD dwCount
    )
{
    //TODO: Or simply always purge and repopulate?
    DWORD dwError = 0;
    PWSTR *ppszDomainControllers = NULL;
    DWORD dwDBDCCount = 0;
    DWORD dwDbIndex = 0;
    DWORD dwIndex = 0;
    PWSTR pwszDomainName = NULL;

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

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

    if (bPurgeRefresh)
    {
        dwError = CdcDbEnumDCEntries(&ppszDomainControllers, &dwDBDCCount);
        BAIL_ON_VMAFD_ERROR(dwError);

        for (; dwDbIndex<dwDBDCCount; ++dwDbIndex)
        {
            BOOL bFoundDC = FALSE;
            for (dwIndex = 0;dwIndex < dwCount; ++dwIndex)
            {
               if (VmAfdStringIsEqualW(
                            ppszDomainControllers[dwDbIndex],
                            pCdcEntry[dwIndex].pszDCName,
                            FALSE
                     )
                  )
               {
                    pCdcEntry[dwIndex].cdcEntryStatus =
                                          CDC_DB_ENTRY_STATUS_UPDATE;
                    bFoundDC = TRUE;
                    break;
               }
            }

            if (!bFoundDC)
            {
               CdcDbDeleteDCEntry(ppszDomainControllers[dwDbIndex]);
            }
        }
    }

    for (dwIndex = 0; dwIndex < dwCount; ++dwIndex)
    {

        dwError = VmAfdAllocateStringW(
                                pwszDomainName,
                                &pCdcEntry[dwIndex].pszDomainName
                                );
        BAIL_ON_VMAFD_ERROR(dwError);

        switch (pCdcEntry[dwIndex].cdcEntryStatus)
        {
            case CDC_DB_ENTRY_STATUS_NEW:
                dwError = CdcDbAddDCEntry(&pCdcEntry[dwIndex]);
                break;

            case CDC_DB_ENTRY_STATUS_UPDATE:
                dwError = CdcDbUpdateDCEntry(&pCdcEntry[dwIndex]);
                break;

            default:
                dwError = ERROR_INVALID_PARAMETER;
                break;
        }
        BAIL_ON_VMAFD_ERROR(dwError);
    }

cleanup:

    if (ppszDomainControllers)
    {
        VmAfdFreeStringArrayW(ppszDomainControllers, dwDBDCCount);
    }
    VMAFD_SAFE_FREE_MEMORY(pwszDomainName);
    return dwError;
error:

    goto cleanup;
}
Пример #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;
}
Пример #5
0
static
DWORD
CdcDCPing(
    PWSTR pszDCName,
    PWSTR pszDomainName,
    PDWORD pdwResult,
    time_t *ptimeTaken,
    PWSTR *ppszSiteName
    )
{
    DWORD dwError = 0;
    DWORD dwAfdPingResult = 0;
    DWORD dwDirPingResult = 0;

    time_t timeBefore = 0;
    time_t timeAfter = 0;
    time_t timeDiff = 0;

    PWSTR pwszAccount = NULL;
    PWSTR pwszPassword = NULL;
    PWSTR pwszAccountDN = NULL;
    PWSTR pwszDomain = NULL;
    PSTR  pszSiteName = NULL;
    PWSTR pwszSiteName = NULL;
    PVMDIR_CONNECTION pConnection = NULL;

    BOOL bDCIsAlive = FALSE;

    if (!pszDCName || !pdwResult || !ptimeTaken || !ppszSiteName)
    {
        dwError = ERROR_INVALID_PARAMETER;
        BAIL_ON_VMAFD_ERROR(dwError);
    }

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

    if (IsNullOrEmptyString(pszDomainName))
    {
        dwError = VmAfSrvGetDomainName(&pwszDomain);
        BAIL_ON_VMAFD_ERROR(dwError);
    }

    else
    {
        dwError = VmAfdAllocateStringW(
                                pszDomainName,
                                &pwszDomain);
        BAIL_ON_VMAFD_ERROR(dwError);
    }

    time(&timeBefore);

    dwAfdPingResult = CdcVmafdHeartbeatPing(
                                  pszDCName,
                                  pwszAccount,
                                  pwszPassword,
                                  pwszDomain,
                                  &bDCIsAlive
                                  );

    time(&timeAfter);

    timeDiff = timeAfter-timeBefore;

    dwDirPingResult = VmAfSrvDirOpenConnection(
                        pszDCName,
                        pwszDomain,
                        pwszAccount,
                        pwszPassword,
                        &pConnection
                        );
    if (!dwDirPingResult)
    {
        dwDirPingResult = VmDirGetSiteName(pConnection,&pszSiteName);
    }

    if (dwDirPingResult)
    {
        *ppszSiteName = NULL;
    }
    else
    {
        dwError = VmAfdAllocateStringWFromA(
                                    pszSiteName,
                                    &pwszSiteName
                                    );
        BAIL_ON_VMAFD_ERROR(dwError);
        *ppszSiteName = pwszSiteName;
        pwszSiteName = NULL;
    }

    *ptimeTaken = timeDiff;
    *pdwResult = !(!dwDirPingResult && !dwAfdPingResult && bDCIsAlive);

cleanup:

    if (pConnection)
    {
        VmDirConnectionClose(pConnection);
    }
    VMAFD_SAFE_FREE_MEMORY(pwszDomain);
    VMAFD_SAFE_FREE_MEMORY(pwszAccount);
    VMAFD_SAFE_FREE_MEMORY(pwszPassword);
    VMAFD_SAFE_FREE_MEMORY(pwszAccountDN);
    VMAFD_SAFE_FREE_MEMORY(pwszSiteName);
    VMAFD_SAFE_FREE_MEMORY(pszSiteName);

    return dwError;
error:
    if (ptimeTaken)
    {
        *ptimeTaken = 0;
    }
    if (ppszSiteName)
    {
      *ppszSiteName = NULL;
    }
    if (pdwResult)
    {
        *pdwResult = 0;
    }
    goto cleanup;
}
Пример #6
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;
}
Пример #7
0
DWORD
VmAfdGetMachineInfo(
    PVMAFD_REG_ARG *ppArgs
    )
{
    DWORD dwError = 0;
    PWSTR pwszAccountName = NULL;
    PWSTR pwszPassword = NULL;
    PWSTR pwszAccountDN = NULL;
    PWSTR pwszDomain = NULL;
    PWSTR pwszAccount = NULL;
    PVMAFD_REG_ARG pArgs = NULL;
    VMAFD_DOMAIN_STATE domainState = VMAFD_DOMAIN_STATE_NONE ;

    dwError = VmAfSrvGetDomainState(&domainState);
    BAIL_ON_VMAFD_ERROR(dwError);

    if (domainState == VMAFD_DOMAIN_STATE_NONE)
    {
        dwError = ERROR_NOT_JOINED;
        BAIL_ON_VMAFD_ERROR_NO_LOG(dwError);
    }

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

    dwError =  VmAfdAllocateMemory(
                    sizeof(VMAFD_REG_ARG),
                    (PVOID*)&pArgs);
    BAIL_ON_VMAFD_ERROR(dwError);

    dwError = VmAfdAllocateStringAFromW(
                    pwszAccountDN,
                    &pArgs->pszAccountDN);
    BAIL_ON_VMAFD_ERROR(dwError);

    dwError = VmAfdAllocateStringAFromW(
                    pwszPassword,
                    &pArgs->pszPassword);
    BAIL_ON_VMAFD_ERROR(dwError);

    dwError = VmAfdAllocateStringAFromW(
                    pwszAccount,
                    &pArgs->pszAccount);
    BAIL_ON_VMAFD_ERROR(dwError);

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

    dwError = VmAfdAllocateStringAFromW(
                    pwszDomain,
                    &pArgs->pszDomain);
    BAIL_ON_VMAFD_ERROR(dwError);

    dwError = VmAfdAllocateStringPrintf( &(pArgs->pszAccountUPN), "%s@%s",
                                         pArgs->pszAccount, pArgs->pszDomain);
    BAIL_ON_VMAFD_ERROR(dwError);

    if (IsNullOrEmptyString(pArgs->pszAccountDN) ||
        IsNullOrEmptyString(pArgs->pszPassword))
    {
        dwError = VECS_MISSING_CREDS;
        BAIL_ON_VMAFD_ERROR(dwError);
    }

    *ppArgs = pArgs;

cleanup:

    VMAFD_SAFE_FREE_MEMORY(pwszAccountName);
    VMAFD_SAFE_FREE_MEMORY(pwszPassword);
    VMAFD_SAFE_FREE_MEMORY(pwszAccountDN);
    VMAFD_SAFE_FREE_MEMORY(pwszDomain);
    VMAFD_SAFE_FREE_MEMORY(pwszAccount);

    return dwError;

error :

    *ppArgs = NULL;

    if (pArgs)
    {
        VmAfdFreeRegArgs(pArgs);
    }

    switch (dwError)
    {
        case VECS_MISSING_CREDS:

            VmAfdLog(VMAFD_DEBUG_ANY, "Account DN / Password missing");

            break;

        case VECS_MISSING_DC_NAME:

            VmAfdLog(VMAFD_DEBUG_ANY, "Invalid domain controller name");

            break;

        default:

            VmAfdLog(
                VMAFD_DEBUG_ANY,
                "Error [%d] getting machine Info",
                dwError);

            break;
    }

    goto cleanup;
}
Пример #8
0
DWORD
CdcSrvGetDCStatusInfo(
    PWSTR pwszDCName,
    PWSTR pwszDomainName,
    PCDC_DC_STATUS_INFO_W *ppCdcStatusInfo,
    PVMAFD_HB_STATUS_W    *ppHeartbeatStatus
    )
{
    DWORD dwError = 0;
    PWSTR pwszDomainToUse = NULL;
    PCDC_DC_STATUS_INFO_W pCdcStatusInfo = NULL;
    PVMAFD_HB_STATUS_W    pHeartbeatStatus = NULL;

    if (IsNullOrEmptyString(pwszDCName))
    {
        dwError = ERROR_INVALID_PARAMETER;
        BAIL_ON_VMAFD_ERROR(dwError);
    }

    if (!ppCdcStatusInfo)
    {
        dwError = ERROR_INVALID_PARAMETER;
        BAIL_ON_VMAFD_ERROR(dwError);
    }
    
    if (IsNullOrEmptyString(pwszDomainName))
    {
        dwError = VmAfSrvGetDomainName(&pwszDomainToUse);
        BAIL_ON_VMAFD_ERROR(dwError);
    }
    else
    {
        dwError = VmAfdAllocateStringW(pwszDomainName, &pwszDomainToUse);
        BAIL_ON_VMAFD_ERROR(dwError);
    }

    dwError = CdcDbGetDCInfo(
                            pwszDCName,
                            pwszDomainToUse,
                            &pCdcStatusInfo
                            );
    BAIL_ON_VMAFD_ERROR(dwError);

    if (ppHeartbeatStatus)
    {

        dwError = CdcDbGetHeartbeatStatus(
                                    pwszDCName,
                                    pwszDomainToUse,
                                    &pHeartbeatStatus
                                    );
        BAIL_ON_VMAFD_ERROR(dwError);
        
        pHeartbeatStatus->bIsAlive = pCdcStatusInfo->bIsAlive;
        *ppHeartbeatStatus = pHeartbeatStatus;
    }

    *ppCdcStatusInfo = pCdcStatusInfo;

cleanup:

    VMAFD_SAFE_FREE_MEMORY(pwszDomainToUse);
    return dwError;
error:

    if (ppCdcStatusInfo)
    {
        *ppCdcStatusInfo = NULL;
    }
    if (ppHeartbeatStatus)
    {
        *ppHeartbeatStatus = NULL;
    }
    if (pCdcStatusInfo)
    {
        VmAfdFreeCdcStatusInfoW(pCdcStatusInfo);
    }
    if (pHeartbeatStatus)
    {
        VmAfdFreeHbStatusW(pHeartbeatStatus);
    }
    goto cleanup;
}
Пример #9
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;
}