Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

292 lines
6.4 KiB

//----------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 2001.
//
// File: New.cpp
//
// Contents: Wireless Policy Snapin - New Policy Creation
//
//
// History: TaroonM
// 10/30/01
//
//----------------------------------------------------------------------------
#include "stdafx.h"
#include <htmlhelp.h>
#include "activeds.h"
#include "iadsp.h"
#include "new.h"
HRESULT
CreateDirectoryAndBindToObject(
IDirectoryObject * pParentContainer,
LPWSTR pszCommonName,
LPWSTR pszObjectClass,
IDirectoryObject ** ppDirectoryObject
)
{
ADS_ATTR_INFO AttrInfo[2];
ADSVALUE classValue;
HRESULT hr = S_OK;
IADsContainer * pADsContainer = NULL;
IDispatch * pDispatch = NULL;
//
// Populate ADS_ATTR_INFO structure for new object
//
classValue.dwType = ADSTYPE_CASE_IGNORE_STRING;
classValue.CaseIgnoreString = pszObjectClass;
AttrInfo[0].pszAttrName = L"objectClass";
AttrInfo[0].dwControlCode = ADS_ATTR_UPDATE;
AttrInfo[0].dwADsType = ADSTYPE_CASE_IGNORE_STRING;
AttrInfo[0].pADsValues = &classValue;
AttrInfo[0].dwNumValues = 1;
hr = pParentContainer->CreateDSObject(
pszCommonName,
AttrInfo,
1,
&pDispatch
);
if ((FAILED(hr) && (hr == E_ADS_OBJECT_EXISTS)) ||
(FAILED(hr) && (hr == HRESULT_FROM_WIN32(ERROR_OBJECT_ALREADY_EXISTS)))){
hr = pParentContainer->QueryInterface(
IID_IADsContainer,
(void **)&pADsContainer
);
BAIL_ON_FAILURE(hr);
hr = pADsContainer->GetObject(
pszObjectClass,
pszCommonName,
&pDispatch
);
BAIL_ON_FAILURE(hr);
}
hr = pDispatch->QueryInterface(
IID_IDirectoryObject,
(void **)ppDirectoryObject
);
error:
if (pADsContainer) {
pADsContainer->Release();
}
if (pDispatch) {
pDispatch->Release();
}
return(hr);
}
HRESULT
CreateChildPath(
LPWSTR pszParentPath,
LPWSTR pszChildComponent,
BSTR * ppszChildPath
)
{
HRESULT hr = S_OK;
IADsPathname *pPathname = NULL;
hr = CoCreateInstance(
CLSID_Pathname,
NULL,
CLSCTX_ALL,
IID_IADsPathname,
(void**)&pPathname
);
BAIL_ON_FAILURE(hr);
hr = pPathname->Set(pszParentPath, ADS_SETTYPE_FULL);
BAIL_ON_FAILURE(hr);
hr = pPathname->AddLeafElement(pszChildComponent);
BAIL_ON_FAILURE(hr);
hr = pPathname->Retrieve(ADS_FORMAT_X500, ppszChildPath);
BAIL_ON_FAILURE(hr);
error:
if (pPathname) {
pPathname->Release();
}
return(hr);
}
HRESULT
ConvertADsPathToDN(
LPWSTR pszPathName,
BSTR * ppszPolicyDN
)
{
HRESULT hr = S_OK;
IADsPathname *pPathname = NULL;
hr = CoCreateInstance(
CLSID_Pathname,
NULL,
CLSCTX_ALL,
IID_IADsPathname,
(void**)&pPathname
);
BAIL_ON_FAILURE(hr);
hr = pPathname->Set(pszPathName, ADS_SETTYPE_FULL);
BAIL_ON_FAILURE(hr);
hr = pPathname->Retrieve(ADS_FORMAT_X500_DN, ppszPolicyDN);
BAIL_ON_FAILURE(hr);
error:
if (pPathname) {
pPathname->Release();
}
return(hr);
}
// Create Container for Our Policies.
HRESULT
AddWirelessPolicyContainerToGPO(
const CString & szMachinePath
)
{
HRESULT hr = S_OK;
IDirectoryObject * pMachineContainer = NULL;
IDirectoryObject * pWindowsContainer = NULL;
IDirectoryObject * pMicrosoftContainer = NULL;
IDirectoryObject * pWirelessContainer = NULL;
BSTR pszMicrosoftPath = NULL;
BSTR pszWindowsPath = NULL;
BSTR pszWirelessPath = NULL;
CString szCompleteMachinePath;
LPWSTR szMachineContainerPath;
CString prefixMachinePath;
prefixMachinePath = L"LDAP://";
szCompleteMachinePath = prefixMachinePath + szMachinePath;
szMachineContainerPath = szCompleteMachinePath.GetBuffer(0);
hr = ADsGetObject(
szMachineContainerPath,
IID_IDirectoryObject,
(void **)&pMachineContainer
);
BAIL_ON_FAILURE(hr);
// Build the fully qualified ADsPath for my object
hr = CreateChildPath(
szMachineContainerPath,
L"cn=Microsoft",
&pszMicrosoftPath
);
BAIL_ON_FAILURE(hr);
hr = CreateChildPath(
pszMicrosoftPath,
L"cn=Windows",
&pszWindowsPath
);
BAIL_ON_FAILURE(hr);
hr = CreateChildPath(
pszWindowsPath,
L"cn=Wireless",
&pszWirelessPath
);
BAIL_ON_FAILURE(hr);
hr = ADsGetObject(
pszWirelessPath,
IID_IDirectoryObject,
(void **)&pWirelessContainer
);
if (FAILED(hr)) {
//
// Bind to the Machine Container
//
hr = CreateDirectoryAndBindToObject(
pMachineContainer,
L"cn=Microsoft",
L"container",
&pMicrosoftContainer
);
BAIL_ON_FAILURE(hr);
hr = CreateDirectoryAndBindToObject(
pMicrosoftContainer,
L"cn=Windows",
L"container",
&pWindowsContainer
);
BAIL_ON_FAILURE(hr);
hr = CreateDirectoryAndBindToObject(
pWindowsContainer,
L"cn=Wireless",
L"container",
&pWirelessContainer
);
BAIL_ON_FAILURE(hr);
}
error:
if (pWirelessContainer) {
pWirelessContainer->Release();
}
if (pWindowsContainer) {
pWindowsContainer->Release();
}
if (pMicrosoftContainer) {
pMicrosoftContainer->Release();
}
if (pMachineContainer) {
pMachineContainer->Release();
}
if (pszMicrosoftPath) {
SysFreeString(pszMicrosoftPath);
}
if (pszWindowsPath) {
SysFreeString(pszWindowsPath);
}
return(hr);
}