Exemple #1
0
wbcErr
wbcDcInfo(
    const char *domain,
    size_t *num_dcs,
    const char ***dc_names,
    const char ***dc_ips
    )
{
    DWORD error;
    PLWNET_DC_INFO pDCInfo = NULL;

    error = LWNetGetDCName(
            NULL,
            domain,
            NULL,
            0,
            &pDCInfo);
    BAIL_ON_LSA_ERR(error);

    *num_dcs = 1;

    *dc_names = _wbc_malloc_zero(sizeof(**dc_names) * 2,
            _wbc_free_string_array);
    BAIL_ON_NULL_PTR(*dc_names, error);

    (*dc_names)[0] = _wbc_strdup(pDCInfo->pszDomainControllerName);
    BAIL_ON_NULL_PTR((*dc_names)[0], error);

    *dc_ips = _wbc_malloc_zero(sizeof(**dc_ips) * 2,
            _wbc_free_string_array);
    BAIL_ON_NULL_PTR(*dc_ips, error);

    (*dc_ips)[0] = _wbc_strdup(pDCInfo->pszDomainControllerAddress);
    BAIL_ON_NULL_PTR((*dc_ips)[0], error);

cleanup:
    if (error)
    {
        _WBC_FREE(*dc_ips);
        _WBC_FREE(*dc_names);
    }
    return map_error_to_wbc_status(error);
}
wbcErr
wbcLookupDomainController(
    const char *domain,
    uint32_t flags,
    struct wbcDomainControllerInfo **dc_info
    )
{
    DWORD error;
    PLWNET_DC_INFO pDCInfo = NULL;
    struct wbcDomainControllerInfo *pResult = NULL;

    error = LWNetGetDCName(
            NULL,
            domain,
            NULL,
            flags,
            &pDCInfo);
    BAIL_ON_LSA_ERR(error);

    pResult = _wbc_malloc_zero(sizeof(*pResult), FreeDomainController);
    BAIL_ON_NULL_PTR(pResult, error);

    error = LwAllocateString(
                pDCInfo->pszDomainControllerName,
                &pResult->dc_name);
    BAIL_ON_LSA_ERR(error);

    *dc_info = pResult;

cleanup:
    if (error)
    {
        *dc_info = NULL;
        _WBC_FREE(pResult);
    }
    return map_error_to_wbc_status(error);
}
wbcErr
wbcDomainInfo(
    IN const char *domain,
    OUT struct wbcDomainInfo **info
    )
{
    wbcErr wbc_status = WBC_ERR_UNKNOWN_FAILURE;
    DWORD dwErr = LW_ERROR_INTERNAL;
    HANDLE hLsa = (HANDLE)NULL;
    PLSASTATUS pLsaStatus = NULL;
    struct wbcDomainInfo *pWbcDomInfo = NULL;
    PLSA_TRUSTED_DOMAIN_INFO pLsaDomInfo = NULL;
    PLSA_AUTH_PROVIDER_STATUS pADProvStatus = NULL;
    int i = 0;

    /* Sanity check */

    BAIL_ON_NULL_PTR_PARAM(domain, dwErr);
    BAIL_ON_NULL_PTR_PARAM(info, dwErr);

    /* Work */

    dwErr = LsaOpenServer(&hLsa);
    BAIL_ON_LSA_ERR(dwErr);
    
    dwErr = LsaGetStatus(hLsa, &pLsaStatus);
    BAIL_ON_LSA_ERR(dwErr);

    /* Find the AD provider entry */

    for (i=0; i<pLsaStatus->dwCount; i++)
    {
        if (strcmp(pLsaStatus->pAuthProviderStatusList[i].pszId,
                   LSA_PROVIDER_TAG_AD) == 0)
        {
            pADProvStatus = &pLsaStatus->pAuthProviderStatusList[i];
            break;
        }
    }

    if (pADProvStatus == NULL)
    {
        dwErr = LW_ERROR_NO_SUCH_DOMAIN;
        BAIL_ON_LSA_ERR(dwErr);
    }

    /* Find the requested domain */

    for (i=0; i<pADProvStatus->dwNumTrustedDomains; i++)
    {
        PLSA_TRUSTED_DOMAIN_INFO pCursorDomInfo = NULL;

        pCursorDomInfo = &pADProvStatus->pTrustedDomainInfoArray[i];
        if (StrEqual(pCursorDomInfo->pszDnsDomain, domain) ||
            StrEqual(pCursorDomInfo->pszNetbiosDomain, domain))
        {
            pLsaDomInfo = pCursorDomInfo;
            break;            
        }
    }

    if (pLsaDomInfo == NULL)
    {
        dwErr = LW_ERROR_NO_SUCH_DOMAIN;
        BAIL_ON_LSA_ERR(dwErr);
    }

    /* Fill in the domain info */

    pWbcDomInfo = _wbc_malloc_zero(
                      sizeof(struct wbcDomainInfo),
                      FreeWbcDomainInfo);
    BAIL_ON_NULL_PTR(pWbcDomInfo, dwErr);

    dwErr = FillDomainInfo(pWbcDomInfo, pLsaDomInfo);
    BAIL_ON_LSA_ERR(dwErr);

    *info = pWbcDomInfo;
    pWbcDomInfo = NULL;

cleanup:
    
    if (pLsaStatus)
    {
        LsaFreeStatus(pLsaStatus);
    }

    if (hLsa != (HANDLE)NULL) {
        LsaCloseServer(hLsa);
    }

    _WBC_FREE(pWbcDomInfo);
    
    wbc_status = map_error_to_wbc_status(dwErr);

    return wbc_status;
}
wbcErr
wbcLookupDomainControllerEx(
    const char *domain,
    struct wbcGuid *guid,
    const char *site,
    uint32_t flags,
    struct wbcDomainControllerInfoEx **dc_info
    )
{
    DWORD error;
    PLWNET_DC_INFO pDCInfo = NULL;
    struct wbcDomainControllerInfoEx *pResult = NULL;

    if (guid != NULL)
    {
        return WBC_ERR_NOT_IMPLEMENTED;
    }

    error = LWNetGetDCName(
            NULL,
            domain,
            site,
            flags,
            &pDCInfo);
    BAIL_ON_LSA_ERR(error);

    pResult = _wbc_malloc_zero(sizeof(*pResult), FreeDomainControllerEx);
    BAIL_ON_NULL_PTR(pResult, error);

    error = LwAllocateStringPrintf(
                (char **)&pResult->dc_unc,
                "\\\\%s",
                pDCInfo->pszDomainControllerAddress);
    BAIL_ON_LSA_ERR(error);

    error = LwAllocateString(
                pDCInfo->pszDomainControllerAddress,
                (char **)&pResult->dc_address);
    BAIL_ON_LSA_ERR(error);

    pResult->dc_address_type = pDCInfo->dwDomainControllerAddressType;

    error = LwAllocateMemory(
                sizeof(*pResult->domain_guid),
                (PVOID*)&pResult->domain_guid);
    BAIL_ON_LSA_ERR(error);

    wbcUuidToWbcGuid(
        pDCInfo->pucDomainGUID,
        pResult->domain_guid);

    error = LwAllocateString(
                pDCInfo->pszFullyQualifiedDomainName,
                (char **)&pResult->domain_name);
    BAIL_ON_LSA_ERR(error);

    error = LwAllocateString(
                pDCInfo->pszDnsForestName,
                (char **)&pResult->forest_name);
    BAIL_ON_LSA_ERR(error);

    pResult->dc_flags = pDCInfo->dwFlags;

    error = LwAllocateString(
                pDCInfo->pszDCSiteName,
                (char **)&pResult->dc_site_name);
    BAIL_ON_LSA_ERR(error);

    error = LwAllocateString(
                pDCInfo->pszClientSiteName,
                (char **)&pResult->client_site_name);
    BAIL_ON_LSA_ERR(error);

    *dc_info = pResult;

cleanup:
    if (error)
    {
        *dc_info = NULL;
        _WBC_FREE(pResult);
    }
    return map_error_to_wbc_status(error);
}
wbcErr
wbcListTrusts(
    OUT struct wbcDomainInfo **domains,
    OUT size_t *num_domains
    )
{
    wbcErr wbc_status = WBC_ERR_UNKNOWN_FAILURE;
    DWORD dwErr = LW_ERROR_INTERNAL;
    HANDLE hLsa = (HANDLE)NULL;
    PLSASTATUS pLsaStatus = NULL;
    struct wbcDomainInfo *pWbcDomInfoArray = NULL;
    PLSA_AUTH_PROVIDER_STATUS pADProvStatus = NULL;
    size_t NumDomains = 0;
    int i = 0;

    /* Sanity check */

    BAIL_ON_NULL_PTR_PARAM(domains, dwErr);
    BAIL_ON_NULL_PTR_PARAM(num_domains, dwErr);

    /* Work */

    dwErr = LsaOpenServer(&hLsa);
    BAIL_ON_LSA_ERR(dwErr);
    
    dwErr = LsaGetStatus(hLsa, &pLsaStatus);
    BAIL_ON_LSA_ERR(dwErr);

    /* Find the AD provider entry */

    for (i=0; i<pLsaStatus->dwCount; i++)
    {
        if (strcmp(pLsaStatus->pAuthProviderStatusList[i].pszId,
                   LSA_PROVIDER_TAG_AD) == 0)
        {
            pADProvStatus = &pLsaStatus->pAuthProviderStatusList[i];
            break;
        }
    }

    if (pADProvStatus == NULL)
    {
        dwErr = LW_ERROR_NO_SUCH_DOMAIN;
        BAIL_ON_LSA_ERR(dwErr);
    }

    /* Fill in the domain info */

    NumDomains = pADProvStatus->dwNumTrustedDomains;
    pWbcDomInfoArray = _wbc_malloc_zero(
                           sizeof(struct wbcDomainInfo)*(NumDomains+1),
                           FreeWbcDomainInfoArray);
    BAIL_ON_NULL_PTR(pWbcDomInfoArray, dwErr);

    for (i=0; i<NumDomains; i++)
    {
        dwErr = FillDomainInfo(
                    &pWbcDomInfoArray[i], 
                    &pADProvStatus->pTrustedDomainInfoArray[i]);
        BAIL_ON_LSA_ERR(dwErr);
    }

    *domains = pWbcDomInfoArray;
    pWbcDomInfoArray = NULL;

    *num_domains = NumDomains;

cleanup:
    if (hLsa != (HANDLE)NULL) {
        LsaCloseServer(hLsa);
    }

    _WBC_FREE(pWbcDomInfoArray);
    
    wbc_status = map_error_to_wbc_status(dwErr);

    return wbc_status;
}