767 lines
17 KiB
C
767 lines
17 KiB
C
|
|
|
|
#include "precomp.h"
|
|
|
|
extern LPWSTR PolicyDNAttributes[];
|
|
|
|
DWORD
|
|
ValidateISAKMPData(
|
|
PIPSEC_ISAKMP_DATA pIpsecISAKMPData
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
|
|
|
|
if (!pIpsecISAKMPData) {
|
|
dwError = ERROR_INVALID_PARAMETER;
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
}
|
|
|
|
if (!(pIpsecISAKMPData->pSecurityMethods) ||
|
|
!(pIpsecISAKMPData->dwNumISAKMPSecurityMethods)) {
|
|
dwError = ERROR_INVALID_PARAMETER;
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
}
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
ValidateNegPolData(
|
|
PIPSEC_NEGPOL_DATA pIpsecNegPolData
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
|
|
|
|
if (!pIpsecNegPolData) {
|
|
dwError = ERROR_INVALID_PARAMETER;
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
}
|
|
|
|
if (!IsClearOnly(pIpsecNegPolData->NegPolAction) &&
|
|
!IsBlocking(pIpsecNegPolData->NegPolAction)) {
|
|
|
|
if (!(pIpsecNegPolData->pIpsecSecurityMethods) ||
|
|
!(pIpsecNegPolData->dwSecurityMethodCount)) {
|
|
dwError = ERROR_INVALID_PARAMETER;
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
}
|
|
|
|
}
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
BOOL
|
|
IsClearOnly(
|
|
GUID gNegPolAction
|
|
)
|
|
{
|
|
if (!memcmp(
|
|
&gNegPolAction,
|
|
&(GUID_NEGOTIATION_ACTION_NO_IPSEC),
|
|
sizeof(GUID))) {
|
|
return (TRUE);
|
|
}
|
|
else {
|
|
return (FALSE);
|
|
}
|
|
}
|
|
|
|
|
|
BOOL
|
|
IsBlocking(
|
|
GUID gNegPolAction
|
|
)
|
|
{
|
|
if (!memcmp(
|
|
&gNegPolAction,
|
|
&(GUID_NEGOTIATION_ACTION_BLOCK),
|
|
sizeof(GUID))) {
|
|
return (TRUE);
|
|
}
|
|
else {
|
|
return (FALSE);
|
|
}
|
|
}
|
|
|
|
|
|
DWORD
|
|
ValidateISAKMPDataDeletion(
|
|
HANDLE hPolicyStore,
|
|
GUID ISAKMPIdentifier
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
PIPSEC_POLICY_STORE pPolicyStore = NULL;
|
|
LPWSTR pszIpsecISAKMPReference = NULL;
|
|
DWORD dwRootPathLen = 0;
|
|
LPWSTR pszRelativeName = NULL;
|
|
LPWSTR * ppszIpsecPolicyReferences = NULL;
|
|
DWORD dwNumReferences = 0;
|
|
|
|
|
|
pPolicyStore = (PIPSEC_POLICY_STORE) hPolicyStore;
|
|
|
|
switch (pPolicyStore->dwProvider) {
|
|
|
|
case IPSEC_REGISTRY_PROVIDER:
|
|
|
|
dwError = ConvertGuidToISAKMPString(
|
|
ISAKMPIdentifier,
|
|
pPolicyStore->pszIpsecRootContainer,
|
|
&pszIpsecISAKMPReference
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
dwRootPathLen = wcslen(pPolicyStore->pszIpsecRootContainer);
|
|
pszRelativeName = pszIpsecISAKMPReference + dwRootPathLen + 1;
|
|
|
|
dwError = RegGetPolicyReferencesForISAKMP(
|
|
pPolicyStore->hRegistryKey,
|
|
pPolicyStore->pszIpsecRootContainer,
|
|
pszRelativeName,
|
|
&ppszIpsecPolicyReferences,
|
|
&dwNumReferences
|
|
);
|
|
break;
|
|
|
|
case IPSEC_DIRECTORY_PROVIDER:
|
|
|
|
dwError = DirGetPolicyReferencesForISAKMP(
|
|
pPolicyStore->hLdapBindHandle,
|
|
pPolicyStore->pszIpsecRootContainer,
|
|
ISAKMPIdentifier,
|
|
&ppszIpsecPolicyReferences,
|
|
&dwNumReferences
|
|
);
|
|
break;
|
|
|
|
default:
|
|
|
|
dwError = ERROR_INVALID_PARAMETER;
|
|
return (dwError);
|
|
break;
|
|
|
|
}
|
|
|
|
if (!dwNumReferences) {
|
|
dwError = ERROR_SUCCESS;
|
|
}
|
|
else {
|
|
dwError = ERROR_INVALID_DATA;
|
|
}
|
|
|
|
error:
|
|
|
|
if (pszIpsecISAKMPReference) {
|
|
FreePolStr(pszIpsecISAKMPReference);
|
|
}
|
|
|
|
if (ppszIpsecPolicyReferences) {
|
|
FreeNFAReferences(
|
|
ppszIpsecPolicyReferences,
|
|
dwNumReferences
|
|
);
|
|
}
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
ValidateNegPolDataDeletion(
|
|
HANDLE hPolicyStore,
|
|
GUID NegPolIdentifier
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
PIPSEC_POLICY_STORE pPolicyStore = NULL;
|
|
LPWSTR pszIpsecNegPolReference = NULL;
|
|
DWORD dwRootPathLen = 0;
|
|
LPWSTR pszRelativeName = NULL;
|
|
LPWSTR * ppszIpsecNFAReferences = NULL;
|
|
DWORD dwNumReferences = 0;
|
|
|
|
|
|
pPolicyStore = (PIPSEC_POLICY_STORE) hPolicyStore;
|
|
|
|
switch (pPolicyStore->dwProvider) {
|
|
|
|
case IPSEC_REGISTRY_PROVIDER:
|
|
|
|
dwError = ConvertGuidToNegPolString(
|
|
NegPolIdentifier,
|
|
pPolicyStore->pszIpsecRootContainer,
|
|
&pszIpsecNegPolReference
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
dwRootPathLen = wcslen(pPolicyStore->pszIpsecRootContainer);
|
|
pszRelativeName = pszIpsecNegPolReference + dwRootPathLen + 1;
|
|
|
|
dwError = RegGetNFAReferencesForNegPol(
|
|
pPolicyStore->hRegistryKey,
|
|
pPolicyStore->pszIpsecRootContainer,
|
|
pszRelativeName,
|
|
&ppszIpsecNFAReferences,
|
|
&dwNumReferences
|
|
);
|
|
break;
|
|
|
|
case IPSEC_DIRECTORY_PROVIDER:
|
|
|
|
dwError = DirGetNFAReferencesForNegPol(
|
|
pPolicyStore->hLdapBindHandle,
|
|
pPolicyStore->pszIpsecRootContainer,
|
|
NegPolIdentifier,
|
|
&ppszIpsecNFAReferences,
|
|
&dwNumReferences
|
|
);
|
|
break;
|
|
|
|
default:
|
|
|
|
dwError = ERROR_INVALID_PARAMETER;
|
|
return (dwError);
|
|
break;
|
|
|
|
}
|
|
|
|
if (!dwNumReferences) {
|
|
dwError = ERROR_SUCCESS;
|
|
}
|
|
else {
|
|
dwError = ERROR_INVALID_DATA;
|
|
}
|
|
|
|
error:
|
|
|
|
if (pszIpsecNegPolReference) {
|
|
FreePolStr(pszIpsecNegPolReference);
|
|
}
|
|
|
|
if (ppszIpsecNFAReferences) {
|
|
FreeNFAReferences(
|
|
ppszIpsecNFAReferences,
|
|
dwNumReferences
|
|
);
|
|
}
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
ValidateFilterDataDeletion(
|
|
HANDLE hPolicyStore,
|
|
GUID FilterIdentifier
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
PIPSEC_POLICY_STORE pPolicyStore = NULL;
|
|
LPWSTR pszIpsecFilterReference = NULL;
|
|
DWORD dwRootPathLen = 0;
|
|
LPWSTR pszRelativeName = NULL;
|
|
LPWSTR * ppszIpsecNFAReferences = NULL;
|
|
DWORD dwNumReferences = 0;
|
|
|
|
|
|
pPolicyStore = (PIPSEC_POLICY_STORE) hPolicyStore;
|
|
|
|
switch (pPolicyStore->dwProvider) {
|
|
|
|
case IPSEC_REGISTRY_PROVIDER:
|
|
|
|
dwError = ConvertGuidToFilterString(
|
|
FilterIdentifier,
|
|
pPolicyStore->pszIpsecRootContainer,
|
|
&pszIpsecFilterReference
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
dwRootPathLen = wcslen(pPolicyStore->pszIpsecRootContainer);
|
|
pszRelativeName = pszIpsecFilterReference + dwRootPathLen + 1;
|
|
|
|
dwError = RegGetNFAReferencesForFilter(
|
|
pPolicyStore->hRegistryKey,
|
|
pPolicyStore->pszIpsecRootContainer,
|
|
pszRelativeName,
|
|
&ppszIpsecNFAReferences,
|
|
&dwNumReferences
|
|
);
|
|
break;
|
|
|
|
case IPSEC_DIRECTORY_PROVIDER:
|
|
|
|
dwError = DirGetNFAReferencesForFilter(
|
|
pPolicyStore->hLdapBindHandle,
|
|
pPolicyStore->pszIpsecRootContainer,
|
|
FilterIdentifier,
|
|
&ppszIpsecNFAReferences,
|
|
&dwNumReferences
|
|
);
|
|
break;
|
|
|
|
default:
|
|
|
|
dwError = ERROR_INVALID_PARAMETER;
|
|
return (dwError);
|
|
break;
|
|
|
|
}
|
|
|
|
if (!dwNumReferences) {
|
|
dwError = ERROR_SUCCESS;
|
|
}
|
|
else {
|
|
dwError = ERROR_INVALID_DATA;
|
|
}
|
|
|
|
error:
|
|
|
|
if (pszIpsecFilterReference) {
|
|
FreePolStr(pszIpsecFilterReference);
|
|
}
|
|
|
|
if (ppszIpsecNFAReferences) {
|
|
FreeNFAReferences(
|
|
ppszIpsecNFAReferences,
|
|
dwNumReferences
|
|
);
|
|
}
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
ValidatePolicyDataDeletion(
|
|
HANDLE hPolicyStore,
|
|
PIPSEC_POLICY_DATA pIpsecPolicyData
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
PIPSEC_POLICY_STORE pPolicyStore = NULL;
|
|
LPWSTR pszIpsecPolicyReference = NULL;
|
|
DWORD dwRootPathLen = 0;
|
|
LPWSTR pszRelativeName = NULL;
|
|
LPWSTR * ppszIpsecNFAReferences = NULL;
|
|
DWORD dwNumReferences = 0;
|
|
|
|
|
|
pPolicyStore = (PIPSEC_POLICY_STORE) hPolicyStore;
|
|
|
|
switch (pPolicyStore->dwProvider) {
|
|
|
|
case IPSEC_REGISTRY_PROVIDER:
|
|
|
|
dwError = ConvertGuidToPolicyString(
|
|
pIpsecPolicyData->PolicyIdentifier,
|
|
pPolicyStore->pszIpsecRootContainer,
|
|
&pszIpsecPolicyReference
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
dwRootPathLen = wcslen(pPolicyStore->pszIpsecRootContainer);
|
|
pszRelativeName = pszIpsecPolicyReference + dwRootPathLen + 1;
|
|
|
|
dwError = RegGetNFAReferencesForPolicy(
|
|
pPolicyStore->hRegistryKey,
|
|
pPolicyStore->pszIpsecRootContainer,
|
|
pszRelativeName,
|
|
&ppszIpsecNFAReferences,
|
|
&dwNumReferences
|
|
);
|
|
break;
|
|
|
|
case IPSEC_DIRECTORY_PROVIDER:
|
|
|
|
dwError = GenerateSpecificPolicyQuery(
|
|
pIpsecPolicyData->PolicyIdentifier,
|
|
&pszIpsecPolicyReference
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
dwError = DirGetNFADNsForPolicy(
|
|
pPolicyStore->hLdapBindHandle,
|
|
pPolicyStore->pszIpsecRootContainer,
|
|
pszIpsecPolicyReference,
|
|
&ppszIpsecNFAReferences,
|
|
&dwNumReferences
|
|
);
|
|
break;
|
|
|
|
default:
|
|
|
|
dwError = ERROR_INVALID_PARAMETER;
|
|
return (dwError);
|
|
break;
|
|
|
|
}
|
|
|
|
if (!dwNumReferences) {
|
|
dwError = ERROR_SUCCESS;
|
|
}
|
|
else {
|
|
dwError = ERROR_INVALID_DATA;
|
|
}
|
|
|
|
error:
|
|
|
|
if (pszIpsecPolicyReference) {
|
|
FreePolStr(pszIpsecPolicyReference);
|
|
}
|
|
|
|
if (ppszIpsecNFAReferences) {
|
|
FreeNFAReferences(
|
|
ppszIpsecNFAReferences,
|
|
dwNumReferences
|
|
);
|
|
}
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
ValidatePolicyData(
|
|
HANDLE hPolicyStore,
|
|
PIPSEC_POLICY_DATA pIpsecPolicyData
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
PIPSEC_ISAKMP_DATA pIpsecISAKMPData = NULL;
|
|
|
|
|
|
dwError = IPSecGetISAKMPData(
|
|
hPolicyStore,
|
|
pIpsecPolicyData->ISAKMPIdentifier,
|
|
&pIpsecISAKMPData
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
error:
|
|
|
|
if (pIpsecISAKMPData) {
|
|
FreeIpsecISAKMPData(
|
|
pIpsecISAKMPData
|
|
);
|
|
}
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
ValidateNFAData(
|
|
HANDLE hPolicyStore,
|
|
GUID PolicyIdentifier,
|
|
PIPSEC_NFA_DATA pIpsecNFAData
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
PIPSEC_FILTER_DATA pIpsecFilterData = NULL;
|
|
PIPSEC_NEGPOL_DATA pIpsecNegPolData = NULL;
|
|
GUID gZeroGUID;
|
|
|
|
|
|
memset(&gZeroGUID, 0, sizeof(GUID));
|
|
|
|
if (memcmp(
|
|
&gZeroGUID,
|
|
&pIpsecNFAData->FilterIdentifier,
|
|
sizeof(GUID))) {
|
|
dwError = IPSecGetFilterData(
|
|
hPolicyStore,
|
|
pIpsecNFAData->FilterIdentifier,
|
|
&pIpsecFilterData
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
}
|
|
|
|
dwError = IPSecGetNegPolData(
|
|
hPolicyStore,
|
|
pIpsecNFAData->NegPolIdentifier,
|
|
&pIpsecNegPolData
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
dwError = VerifyPolicyDataExistence(
|
|
hPolicyStore,
|
|
PolicyIdentifier
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
error:
|
|
|
|
if (pIpsecFilterData) {
|
|
FreeIpsecFilterData(
|
|
pIpsecFilterData
|
|
);
|
|
}
|
|
|
|
if (pIpsecNegPolData) {
|
|
FreeIpsecNegPolData(
|
|
pIpsecNegPolData
|
|
);
|
|
}
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
VerifyPolicyDataExistence(
|
|
HANDLE hPolicyStore,
|
|
GUID PolicyIdentifier
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
PIPSEC_POLICY_STORE pPolicyStore = NULL;
|
|
|
|
|
|
pPolicyStore = (PIPSEC_POLICY_STORE) hPolicyStore;
|
|
|
|
switch (pPolicyStore->dwProvider) {
|
|
|
|
case IPSEC_REGISTRY_PROVIDER:
|
|
dwError = RegVerifyPolicyDataExistence(
|
|
pPolicyStore->hRegistryKey,
|
|
pPolicyStore->pszIpsecRootContainer,
|
|
PolicyIdentifier
|
|
);
|
|
break;
|
|
|
|
case IPSEC_DIRECTORY_PROVIDER:
|
|
dwError = DirVerifyPolicyDataExistence(
|
|
pPolicyStore->hLdapBindHandle,
|
|
pPolicyStore->pszIpsecRootContainer,
|
|
PolicyIdentifier
|
|
);
|
|
break;
|
|
|
|
default:
|
|
dwError = ERROR_INVALID_PARAMETER;
|
|
break;
|
|
|
|
}
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
RegGetNFAReferencesForPolicy(
|
|
HKEY hRegistryKey,
|
|
LPWSTR pszIpsecRootContainer,
|
|
LPWSTR pszIpsecRelPolicyName,
|
|
LPWSTR ** pppszIpsecNFANames,
|
|
PDWORD pdwNumNFANames
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
HKEY hRegKey = 0;
|
|
LPWSTR pszIpsecNFAReference = NULL;
|
|
DWORD dwSize = 0;
|
|
LPWSTR pszTemp = NULL;
|
|
DWORD dwCount = 0;
|
|
LPWSTR * ppszIpsecNFANames = NULL;
|
|
LPWSTR pszString = NULL;
|
|
DWORD i = 0;
|
|
|
|
|
|
dwError = RegOpenKeyExW(
|
|
hRegistryKey,
|
|
pszIpsecRelPolicyName,
|
|
0,
|
|
KEY_ALL_ACCESS,
|
|
&hRegKey
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
dwError = RegstoreQueryValue(
|
|
hRegKey,
|
|
L"ipsecNFAReference",
|
|
REG_MULTI_SZ,
|
|
(LPBYTE *)&pszIpsecNFAReference,
|
|
&dwSize
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
pszTemp = pszIpsecNFAReference;
|
|
while (*pszTemp != L'\0') {
|
|
|
|
pszTemp += wcslen(pszTemp) + 1;
|
|
dwCount++;
|
|
|
|
}
|
|
|
|
if (!dwCount) {
|
|
dwError = ERROR_NO_DATA;
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
}
|
|
|
|
ppszIpsecNFANames = (LPWSTR *)AllocPolMem(
|
|
sizeof(LPWSTR)*dwCount
|
|
);
|
|
if (!ppszIpsecNFANames) {
|
|
dwError = ERROR_OUTOFMEMORY;
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
}
|
|
|
|
pszTemp = pszIpsecNFAReference;
|
|
for (i = 0; i < dwCount; i++) {
|
|
|
|
pszString = AllocPolStr(pszTemp);
|
|
if (!pszString) {
|
|
dwError = ERROR_OUTOFMEMORY;
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
}
|
|
|
|
*(ppszIpsecNFANames + i) = pszString;
|
|
|
|
pszTemp += wcslen(pszTemp) + 1; //for the null terminator;
|
|
|
|
}
|
|
|
|
*pppszIpsecNFANames = ppszIpsecNFANames;
|
|
*pdwNumNFANames = dwCount;
|
|
|
|
dwError = ERROR_SUCCESS;
|
|
|
|
cleanup:
|
|
|
|
if (hRegKey) {
|
|
RegCloseKey(hRegKey);
|
|
}
|
|
|
|
if (pszIpsecNFAReference) {
|
|
FreePolStr(pszIpsecNFAReference);
|
|
}
|
|
|
|
return(dwError);
|
|
|
|
error:
|
|
|
|
if (ppszIpsecNFANames) {
|
|
FreeNFAReferences(
|
|
ppszIpsecNFANames,
|
|
dwCount
|
|
);
|
|
}
|
|
|
|
*pppszIpsecNFANames = NULL;
|
|
*pdwNumNFANames = 0;
|
|
|
|
goto cleanup;
|
|
}
|
|
|
|
|
|
DWORD
|
|
RegVerifyPolicyDataExistence(
|
|
HKEY hRegistryKey,
|
|
LPWSTR pszIpsecRootContainer,
|
|
GUID PolicyGUID
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
WCHAR szIpsecPolicyName[MAX_PATH];
|
|
LPWSTR pszPolicyName = NULL;
|
|
HKEY hRegKey = NULL;
|
|
|
|
|
|
szIpsecPolicyName[0] = L'\0';
|
|
wcscpy(szIpsecPolicyName, L"ipsecPolicy");
|
|
|
|
dwError = UuidToString(&PolicyGUID, &pszPolicyName);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
wcscat(szIpsecPolicyName, L"{");
|
|
wcscat(szIpsecPolicyName, pszPolicyName);
|
|
wcscat(szIpsecPolicyName, L"}");
|
|
|
|
dwError = RegOpenKeyExW(
|
|
hRegistryKey,
|
|
szIpsecPolicyName,
|
|
0,
|
|
KEY_ALL_ACCESS,
|
|
&hRegKey
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
error:
|
|
|
|
if (pszPolicyName) {
|
|
RpcStringFree(&pszPolicyName);
|
|
}
|
|
|
|
if (hRegKey) {
|
|
RegCloseKey(hRegKey);
|
|
}
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
DirVerifyPolicyDataExistence(
|
|
HLDAP hLdapBindHandle,
|
|
LPWSTR pszIpsecRootContainer,
|
|
GUID PolicyGUID
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
LPWSTR pszPolicyString = NULL;
|
|
LDAPMessage * res = NULL;
|
|
DWORD dwCount = 0;
|
|
|
|
|
|
dwError = GenerateSpecificPolicyQuery(
|
|
PolicyGUID,
|
|
&pszPolicyString
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
dwError = LdapSearchST(
|
|
hLdapBindHandle,
|
|
pszIpsecRootContainer,
|
|
LDAP_SCOPE_ONELEVEL,
|
|
pszPolicyString,
|
|
PolicyDNAttributes,
|
|
0,
|
|
NULL,
|
|
&res
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
dwCount = LdapCountEntries(
|
|
hLdapBindHandle,
|
|
res
|
|
);
|
|
if (!dwCount) {
|
|
dwError = ERROR_DS_NO_ATTRIBUTE_OR_VALUE;
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
}
|
|
|
|
error:
|
|
|
|
if (pszPolicyString) {
|
|
FreePolStr(pszPolicyString);
|
|
}
|
|
|
|
if (res) {
|
|
LdapMsgFree(res);
|
|
}
|
|
|
|
return (dwError);
|
|
}
|
|
|