mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
441 lines
9.3 KiB
441 lines
9.3 KiB
//----------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 2001.
|
|
//
|
|
// File: dsstore.c
|
|
//
|
|
// Contents: Policy management for directory
|
|
//
|
|
//
|
|
// History: TaroonM
|
|
// 10/30/01
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include "precomp.h"
|
|
|
|
LPWSTR PolicyDNAttributes[] = {
|
|
L"msieee80211-ID",
|
|
L"description",
|
|
L"msieee80211-DataType",
|
|
L"msieee80211-Data",
|
|
L"cn",
|
|
L"distinguishedName",
|
|
L"whenChanged",
|
|
NULL
|
|
};
|
|
|
|
|
|
DWORD
|
|
OpenDirectoryServerHandle(
|
|
LPWSTR pszDomainName,
|
|
DWORD dwPortNumber,
|
|
HLDAP * phLdapBindHandle
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
|
|
|
|
*phLdapBindHandle = NULL;
|
|
|
|
dwError = LdapOpen(
|
|
pszDomainName,
|
|
dwPortNumber,
|
|
phLdapBindHandle
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
dwError = LdapBind(
|
|
*phLdapBindHandle
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
return(dwError);
|
|
|
|
error:
|
|
|
|
if (*phLdapBindHandle) {
|
|
CloseDirectoryServerHandle(
|
|
*phLdapBindHandle
|
|
);
|
|
*phLdapBindHandle = NULL;
|
|
}
|
|
|
|
return(dwError);
|
|
}
|
|
|
|
DWORD
|
|
CloseDirectoryServerHandle(
|
|
HLDAP hLdapBindHandle
|
|
)
|
|
{
|
|
|
|
int ldaperr = 0;
|
|
|
|
if (hLdapBindHandle) {
|
|
|
|
ldaperr = ldap_unbind(hLdapBindHandle);
|
|
|
|
}
|
|
|
|
return(0);
|
|
}
|
|
|
|
|
|
DWORD
|
|
ReadPolicyObjectFromDirectory(
|
|
HLDAP hLdapBindHandle,
|
|
LPWSTR pszPolicyDN,
|
|
PWIRELESS_POLICY_OBJECT * ppWirelessPolicyObject
|
|
)
|
|
{
|
|
|
|
LDAPMessage *res = NULL;
|
|
LDAPMessage *e = NULL;
|
|
LPWSTR szFilterString = L"(objectClass=*)";
|
|
DWORD dwError = 0;
|
|
PWIRELESS_POLICY_OBJECT pWirelessPolicyObject = NULL;
|
|
|
|
|
|
dwError = LdapSearchST(
|
|
hLdapBindHandle,
|
|
pszPolicyDN,
|
|
LDAP_SCOPE_BASE,
|
|
szFilterString,
|
|
PolicyDNAttributes,
|
|
0,
|
|
NULL,
|
|
&res
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
dwError = UnMarshallPolicyObject(
|
|
hLdapBindHandle,
|
|
pszPolicyDN,
|
|
&pWirelessPolicyObject,
|
|
res
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
|
|
|
|
|
|
*ppWirelessPolicyObject = pWirelessPolicyObject;
|
|
|
|
cleanup:
|
|
|
|
if (res) {
|
|
LdapMsgFree(res);
|
|
}
|
|
|
|
return(dwError);
|
|
|
|
error:
|
|
|
|
if (pWirelessPolicyObject) {
|
|
FreeWirelessPolicyObject(
|
|
pWirelessPolicyObject
|
|
);
|
|
}
|
|
|
|
*ppWirelessPolicyObject = NULL;
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
DWORD
|
|
UnMarshallPolicyObject(
|
|
HLDAP hLdapBindHandle,
|
|
LPWSTR pszPolicyDN,
|
|
PWIRELESS_POLICY_OBJECT * ppWirelessPolicyObject,
|
|
LDAPMessage *res
|
|
)
|
|
{
|
|
PWIRELESS_POLICY_OBJECT pWirelessPolicyObject = NULL;
|
|
DWORD dwCount = 0;
|
|
DWORD dwLen = 0;
|
|
LPBYTE pBuffer = NULL;
|
|
DWORD i = 0;
|
|
DWORD dwError = 0;
|
|
LDAPMessage *e = NULL;
|
|
WCHAR **strvalues = NULL;
|
|
struct berval ** bvalues = NULL;
|
|
LPWSTR * ppszTemp = NULL;
|
|
|
|
|
|
pWirelessPolicyObject = (PWIRELESS_POLICY_OBJECT)AllocPolMem(
|
|
sizeof(WIRELESS_POLICY_OBJECT)
|
|
);
|
|
if (!pWirelessPolicyObject) {
|
|
dwError = ERROR_OUTOFMEMORY;
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
}
|
|
|
|
|
|
dwError = LdapFirstEntry(
|
|
hLdapBindHandle,
|
|
res,
|
|
&e
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
/*
|
|
strvalues = NULL;
|
|
dwError = LdapGetValues(
|
|
hLdapBindHandle,
|
|
e,
|
|
L"distinguishedName",
|
|
(WCHAR ***)&strvalues,
|
|
(int *)&dwCount
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
*/
|
|
|
|
pWirelessPolicyObject->pszWirelessOwnersReference = AllocPolStr(
|
|
pszPolicyDN
|
|
);
|
|
if (!pWirelessPolicyObject->pszWirelessOwnersReference) {
|
|
dwError = ERROR_OUTOFMEMORY;
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
}
|
|
|
|
strvalues = NULL;
|
|
dwError = LdapGetValues(
|
|
hLdapBindHandle,
|
|
e,
|
|
L"cn",
|
|
(WCHAR ***)&strvalues,
|
|
(int *)&dwCount
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
pWirelessPolicyObject->pszWirelessName = AllocPolStr(
|
|
LDAPOBJECT_STRING((PLDAPOBJECT)strvalues)
|
|
);
|
|
if (!pWirelessPolicyObject->pszWirelessName) {
|
|
dwError = ERROR_OUTOFMEMORY;
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
}
|
|
LdapValueFree(strvalues);
|
|
|
|
|
|
strvalues = NULL;
|
|
dwError = LdapGetValues(
|
|
hLdapBindHandle,
|
|
e,
|
|
L"description",
|
|
(WCHAR ***)&strvalues,
|
|
(int *)&dwCount
|
|
);
|
|
// BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
if (strvalues && LDAPOBJECT_STRING((PLDAPOBJECT)strvalues)) {
|
|
|
|
pWirelessPolicyObject->pszDescription = AllocPolStr(
|
|
LDAPOBJECT_STRING((PLDAPOBJECT)strvalues)
|
|
);
|
|
if (!pWirelessPolicyObject->pszDescription) {
|
|
dwError = ERROR_OUTOFMEMORY;
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
}
|
|
LdapValueFree(strvalues);
|
|
|
|
} else {
|
|
pWirelessPolicyObject->pszDescription = NULL;
|
|
}
|
|
|
|
|
|
strvalues = NULL;
|
|
dwError = LdapGetValues(
|
|
hLdapBindHandle,
|
|
e,
|
|
L"msieee80211-ID",
|
|
(WCHAR ***)&strvalues,
|
|
(int *)&dwCount
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
|
|
pWirelessPolicyObject->pszWirelessID = AllocPolStr(
|
|
LDAPOBJECT_STRING((PLDAPOBJECT)strvalues)
|
|
);
|
|
if (!pWirelessPolicyObject->pszWirelessID) {
|
|
dwError = ERROR_OUTOFMEMORY;
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
}
|
|
LdapValueFree(strvalues);
|
|
|
|
|
|
strvalues = NULL;
|
|
dwError = LdapGetValues(
|
|
hLdapBindHandle,
|
|
e,
|
|
L"msieee80211-DataType",
|
|
(WCHAR ***)&strvalues,
|
|
(int *)&dwCount
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
pWirelessPolicyObject->dwWirelessDataType = _wtol(LDAPOBJECT_STRING((PLDAPOBJECT)strvalues));
|
|
LdapValueFree(strvalues);
|
|
|
|
strvalues = NULL;
|
|
dwError = LdapGetValues(
|
|
hLdapBindHandle,
|
|
e,
|
|
L"whenChanged",
|
|
(WCHAR ***)&strvalues,
|
|
(int *)&dwCount
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
pWirelessPolicyObject->dwWhenChanged = _wtol(LDAPOBJECT_STRING((PLDAPOBJECT)strvalues));
|
|
LdapValueFree(strvalues);
|
|
|
|
|
|
|
|
//
|
|
// unmarshall the msieee80211-Data blob
|
|
//
|
|
|
|
dwError = LdapGetValuesLen(
|
|
hLdapBindHandle,
|
|
e,
|
|
L"msieee80211-Data",
|
|
(struct berval ***)&bvalues,
|
|
(int *)&dwCount
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
dwLen = LDAPOBJECT_BERVAL_LEN((PLDAPOBJECT)bvalues);
|
|
pBuffer = (LPBYTE)AllocPolMem(dwLen);
|
|
if (!pBuffer) {
|
|
dwError = ERROR_OUTOFMEMORY;
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
}
|
|
memcpy( pBuffer, LDAPOBJECT_BERVAL_VAL((PLDAPOBJECT)bvalues), dwLen );
|
|
pWirelessPolicyObject->pWirelessData = pBuffer;
|
|
pWirelessPolicyObject->dwWirelessDataLen = dwLen;
|
|
LdapValueFreeLen(bvalues);
|
|
|
|
|
|
*ppWirelessPolicyObject = pWirelessPolicyObject;
|
|
|
|
return(dwError);
|
|
|
|
error:
|
|
|
|
if (pWirelessPolicyObject) {
|
|
FreeWirelessPolicyObject(pWirelessPolicyObject);
|
|
}
|
|
|
|
*ppWirelessPolicyObject = NULL;
|
|
|
|
return(dwError);
|
|
}
|
|
|
|
|
|
|
|
DWORD
|
|
ComputePrelimCN(
|
|
LPWSTR szDN,
|
|
LPWSTR szCommonName
|
|
)
|
|
{
|
|
LPWSTR pszComma = NULL;
|
|
|
|
pszComma = wcschr(szDN, L',');
|
|
|
|
if (!pszComma) {
|
|
return (ERROR_INVALID_DATA);
|
|
}
|
|
|
|
*pszComma = L'\0';
|
|
|
|
wcscpy(szCommonName, szDN);
|
|
|
|
*pszComma = L',';
|
|
|
|
return(0);
|
|
}
|
|
|
|
DWORD
|
|
ComputePolicyContainerDN(
|
|
LPWSTR pszPolicyDN,
|
|
LPWSTR * ppszPolicyContainerDN
|
|
)
|
|
{
|
|
LPWSTR pszComma = NULL;
|
|
LPWSTR pszPolicyContainer = NULL;
|
|
DWORD dwError = 0;
|
|
|
|
*ppszPolicyContainerDN = NULL;
|
|
pszComma = wcschr(pszPolicyDN, L',');
|
|
|
|
pszPolicyContainer = AllocPolStr(
|
|
pszComma + 1
|
|
);
|
|
if (!pszPolicyContainer) {
|
|
dwError = ERROR_OUTOFMEMORY;
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
}
|
|
|
|
*ppszPolicyContainerDN = pszPolicyContainer;
|
|
|
|
error:
|
|
|
|
return(dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
ComputeDefaultDirectory(
|
|
LPWSTR * ppszDefaultDirectory
|
|
)
|
|
{
|
|
|
|
PDOMAIN_CONTROLLER_INFOW pDomainControllerInfo = NULL;
|
|
DWORD dwError = 0;
|
|
DWORD Flags = DS_DIRECTORY_SERVICE_REQUIRED | DS_RETURN_DNS_NAME;
|
|
LPWSTR pszDefaultDirectory = NULL;
|
|
|
|
|
|
*ppszDefaultDirectory = NULL;
|
|
|
|
dwError = DsGetDcNameW(
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
Flags,
|
|
&pDomainControllerInfo
|
|
) ;
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
|
|
pszDefaultDirectory = AllocPolStr(
|
|
pDomainControllerInfo->DomainName
|
|
);
|
|
if (!pszDefaultDirectory) {
|
|
dwError = ERROR_OUTOFMEMORY;
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
}
|
|
|
|
*ppszDefaultDirectory = pszDefaultDirectory;
|
|
|
|
error:
|
|
|
|
if (pDomainControllerInfo) {
|
|
|
|
(void) NetApiBufferFree(pDomainControllerInfo) ;
|
|
}
|
|
|
|
|
|
return(dwError);
|
|
}
|
|
|
|
|