///////////////////////////////////////////////////////////////////////////// // // Copyright(C) 2000 Microsoft Corporation all rights reserved. // // Module: updatemschap.cpp // // Project: Windows 2000 IAS // // Description: add the authentication types RAS_AT_MSCHAPPASS and // RAS_AT_MSCHAP2PASS when RAS_AT_MSCHAP and RAS_AT_MSCHAP2 // are in the profiles. // // Author: tperraut 11/30/2000 // // Revision // ///////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "GlobalData.h" #include "updatemschap.h" #include "Objects.h" #include "Properties.h" #include "sdoias.h" void CUpdateMSCHAP::UpdateProperties(const LONG CurrentProfileIdentity) { _bstr_t AuthenticationName = L"msNPAuthenticationType2"; // Now get the properties for the current profile _bstr_t PropertyName; _bstr_t PropertyValue; LONG Type = 0; bool ChapSet = false; bool Chap2Set = false; bool ChapPassSet = false; bool Chap2PassSet = false; LONG IndexProperty = 0; HRESULT hr = m_GlobalData.m_pProperties->GetProperty( CurrentProfileIdentity, PropertyName, Type, PropertyValue ); while ( SUCCEEDED(hr) ) { // msNPAuthenticationType2 property found if ( PropertyName == AuthenticationName ) { if ( Type != VT_I4 ) { _com_issue_error(E_UNEXPECTED); } LONG AuthenticationType = _wtol(static_cast(PropertyValue)); switch (AuthenticationType) { case IAS_AUTH_MSCHAP: { ChapSet = true; break; } case IAS_AUTH_MSCHAP2: { Chap2Set = true; break; } case IAS_AUTH_MSCHAP_CPW: { ChapPassSet = true; break; } case IAS_AUTH_MSCHAP2_CPW: { Chap2PassSet = true; break; } default: { break; } } } ++IndexProperty; hr = m_GlobalData.m_pProperties->GetNextProperty( CurrentProfileIdentity, PropertyName, Type, PropertyValue, IndexProperty ); } // No property or no more properties for this profile // Insert the newproperties if necessary if ( ChapSet && !ChapPassSet ) { // RAS_AT_MSCHAPPASS = 9 wchar_t buffer[34]; // can convert 33 char max _ltow(IAS_AUTH_MSCHAP_CPW, buffer, 10); // radix 10 _bstr_t ChapPasswordValue(buffer); // now insert the new properties if needed m_GlobalData.m_pProperties->InsertProperty( CurrentProfileIdentity, AuthenticationName, VT_I4, ChapPasswordValue ); } if ( Chap2Set && !Chap2PassSet ) { // RAS_AT_MSCHAP2PASS = 10 wchar_t buffer[34]; // can convert 33 char max _ltow(IAS_AUTH_MSCHAP2_CPW, buffer, 10); // radix 10 _bstr_t Chap2PasswordValue(buffer); // now insert the new properties if needed m_GlobalData.m_pProperties->InsertProperty( CurrentProfileIdentity, AuthenticationName, VT_I4, Chap2PasswordValue ); } } ////////////////////////////////////////////////////////////////////////////// // Execute // // For each profile, if msNPAuthenticationType2 is RAS_AT_MSCHAP then add the // msNPAuthenticationType2 RAS_AT_MSCHAPPASS // if msNPAuthenticationType2 is RAS_AT_MSCHAP2 then add the // msNPAuthenticationType2 RAS_AT_MSCHAP2PASS // ////////////////////////////////////////////////////////////////////////////// void CUpdateMSCHAP::Execute() { // Get the Profiles container identity const WCHAR ProfilesPath[] = L"Root\0" L"Microsoft Internet Authentication Service\0" L"RadiusProfiles\0"; LONG ProfilesIdentity; m_GlobalData.m_pObjects->WalkPath(ProfilesPath, ProfilesIdentity); // Get the first Profile (if any) _bstr_t CurrentProfileName; LONG CurrentProfileIdentity; HRESULT hr = m_GlobalData.m_pObjects->GetObject( CurrentProfileName, CurrentProfileIdentity, ProfilesIdentity ); // for each profiles in ias.mdb, execute the changes. LONG IndexObject = 0; // if hr is not S_OK, there's no profile, nothing to do while ( SUCCEEDED(hr) ) { UpdateProperties(CurrentProfileIdentity); // now get the next profile ++IndexObject; hr = m_GlobalData.m_pObjects->GetNextObject( CurrentProfileName, CurrentProfileIdentity, ProfilesIdentity, IndexObject ); } }