static DWORD CdcHandleNoDCList( VOID ) { DWORD dwError = 0; PWSTR pszDCName = NULL; DWORD dwPingResult = 0; PWSTR pszSiteName = NULL; time_t timeTaken = 0; dwError = VmAfSrvGetDCName(&pszDCName); BAIL_ON_VMAFD_ERROR(dwError); dwError = VmAfdTrimFQDNTrailingDot(pszDCName); BAIL_ON_VMAFD_ERROR(dwError); dwError = CdcDCPing( pszDCName, NULL, &dwPingResult, &timeTaken, &pszSiteName ); BAIL_ON_VMAFD_ERROR(dwError); if (!dwPingResult) { dwError = CdcUpdateCache(TRUE); BAIL_ON_VMAFD_ERROR(dwError); dwError = CdcUpdateAffinitizedDC(pszDCName); BAIL_ON_VMAFD_ERROR(dwError); dwError = CdcSetClientSiteName(pszSiteName); BAIL_ON_VMAFD_ERROR(dwError); dwError = CdcStateTransition(CDC_DC_STATE_SITE_AFFINITIZED); BAIL_ON_VMAFD_ERROR(dwError); } cleanup: VMAFD_SAFE_FREE_MEMORY(pszDCName); return dwError; error: goto cleanup; }
DWORD VmAfdGetRegArgs( PVMAFD_REG_ARG *ppArgs ) { DWORD dwError = 0; PWSTR pwszAccountName = NULL; PWSTR pwszPassword = NULL; PWSTR pwszAccountDN = NULL; PWSTR pwszDomain = NULL; PWSTR pwszDCName = 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(dwError); } dwError = VmAfSrvGetDCName(&pwszDCName); BAIL_ON_VMAFD_ERROR(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( pwszDCName, &pArgs->pszDCName); 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->pszDCName)) { dwError = VECS_MISSING_DC_NAME; 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(pwszDCName); 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] fetching registry args", dwError); break; } goto cleanup; }
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; }
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; }