//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1999. // // File: N C I A S . C P P // // Contents: Installation support for IAS service // // Notes: // // Author: tperraut 02/22/1999 // // Revision: tperraut 01/19/2000 bugs 444353, 444354, 444355 // //---------------------------------------------------------------------------- #include "pch.h" #pragma hdrstop #include "netoc.h" #include "ncreg.h" #include "ncias.h" #include "ncstring.h" #include "userenv.h" static const char c_szIASRegisterFunctionName[] = "IASDirectoryRegisterService"; static const char c_szIASUnRegisterFunctionName[] = "IASDirectoryUnregisterService"; static const WCHAR c_szIASDllName[] = L"ias.dll"; //+--------------------------------------------------------------------------- // // Function: HrOcIASRegisterActiveDirectory // // Purpose: Try to register IAS in the Active Directory // if the computer is part of a Win2k domain... // // Arguments: // // Returns: S_OK if successful, Win32 error otherwise. // // Notes: // // Author: Thierry Perraut (tperraut) // HRESULT HrOcIASUnRegisterActiveDirectory() { typedef INT_PTR (WINAPI *UNREGISTER_IAS_ACTIVE_DIRECTORY)(); UNREGISTER_IAS_ACTIVE_DIRECTORY pfnUnRegisterIASActiveDirectory; /////////////////// // Load ias.dll /////////////////// HMODULE hmod; HRESULT hr = HrLoadLibAndGetProc ( c_szIASDllName, c_szIASUnRegisterFunctionName, &hmod, &pfnUnRegisterIASActiveDirectory ); if (S_OK == hr) { // fix bug 444354 // pfnUnRegisterIASActiveDirectory not NULL here if (!FAILED (CoInitialize(NULL))) { LONG lresult = pfnUnRegisterIASActiveDirectory(); if (ERROR_SUCCESS != lresult) { hr = S_OK; //not a fatal error, should be ignored } CoUninitialize(); } FreeLibrary(hmod); } // Errors ignored hr = S_OK; return hr; } //+--------------------------------------------------------------------------- // // Function: HrOcIASUnRegisterActiveDirectory // // Purpose: Try to remove IAS from the Active Directory // if the computer is part of a Win2k domain... // // Arguments: // // Returns: S_OK if successful, Win32 error otherwise. // // Notes: // // Author: Thierry Perraut (tperraut) // HRESULT HrOcIASRegisterActiveDirectory() { typedef INT_PTR (WINAPI *REGISTER_IAS_ACTIVE_DIRECTORY)(); REGISTER_IAS_ACTIVE_DIRECTORY pfnRegisterIASActiveDirectory; /////////////////// // Load ias.dll /////////////////// HMODULE hmod; HRESULT hr = HrLoadLibAndGetProc ( c_szIASDllName, c_szIASRegisterFunctionName, &hmod, &pfnRegisterIASActiveDirectory ); if (S_OK == hr) { // Fix bug 444353 // pfnRegisterIASActiveDirectory not NULL here if (!FAILED (CoInitialize(NULL))) { LONG lresult = pfnRegisterIASActiveDirectory(); if (ERROR_SUCCESS != lresult) { hr = S_OK; //not a fatal error, should be ignored } CoUninitialize(); } FreeLibrary(hmod); } // Errors ignored hr = S_OK; return hr; } HRESULT HrOcIASDisableLMAuthentication() { static const WCHAR IASLMAuthKey[] = L"SYSTEM\\CurrentControlSet\\Services\\RemoteAccess\\Policy"; static const WCHAR IASLMAuthValue[] = L"Allow LM Authentication"; HKEY key = NULL; HRESULT hr = HrRegOpenKeyEx( HKEY_LOCAL_MACHINE, IASLMAuthKey, KEY_SET_VALUE | KEY_EXECUTE | KEY_QUERY_VALUE, &key ); if (SUCCEEDED(hr)) { hr = HrRegQueryValueEx ( key, IASLMAuthValue, NULL, NULL, NULL ); if (FAILED(hr)) { DWORD value = 0; // No such value: create it hr = HrRegSetValueEx( key, IASLMAuthValue, REG_DWORD, reinterpret_cast(&value), sizeof(value) ); } RegSafeCloseKey(key); } hr = S_OK; return hr; } //+--------------------------------------------------------------------------- // // Function: HrOcIASPreInf // // Purpose: Called when IAS service is being installed/upgraded/removed. // Called before the processing of the INF file // // Arguments: // pnocd [in] Pointer to NETOC data. // // Returns: S_OK if successful, Win32 error otherwise. // // Notes: // // Author: Thierry Perraut (tperraut) // HRESULT HrOcIASPreInf(const PNETOCDATA pnocd) { HRESULT hr; switch(pnocd->eit) { case IT_INSTALL: { // Place holder hr = S_OK; break; } case IT_REMOVE: { // Place holder hr = S_OK; break; } case IT_UPGRADE: { // Place holder hr = S_OK; break; } default: { hr = S_OK; // some new messages should not be seen as errors } } TraceError("HrOcIASPreInf", hr); return hr; } //+--------------------------------------------------------------------------- // // Function: HrOcIASPostInstall // // Purpose: Called when IAS service is being installed/upgraded/removed. // Called after the processing of the INF file // // Arguments: // pnocd [in] Pointer to NETOC data. // // Returns: S_OK if successful, Win32 error otherwise. // // Notes: // // Author: Thierry Perraut (tperraut) // HRESULT HrOcIASPostInstall(const PNETOCDATA pnocd) { HRESULT hr; switch(pnocd->eit) { case IT_INSTALL: { // Disable LM AUthentication on clean installs hr = HrOcIASDisableLMAuthentication(); // ignore the result // call the Active Directory registration code here hr = HrOcIASRegisterActiveDirectory(); break; } case IT_REMOVE: { // call the Active Directory clean code here hr = HrOcIASUnRegisterActiveDirectory(); break; } case IT_UPGRADE: { hr = S_OK; break; } default: { hr = S_OK; // some new messages should not be seen as errors } } TraceError("HrOcIASPostInstall", hr); return hr; } //+--------------------------------------------------------------------------- // // Function: HrOcExtIAS // // Purpose: NetOC external message handler // // Arguments: // pnocd [] // uMsg [] // wParam [] // lParam [] // // Returns: // // Author: tperraut 02/22/1999 // // Notes: // HRESULT HrOcExtIAS(PNETOCDATA pnocd, UINT uMsg, WPARAM wParam, LPARAM lParam) { HRESULT hr; Assert(pnocd); switch (uMsg) { case NETOCM_PRE_INF: { hr = HrOcIASPreInf(pnocd); break; } case NETOCM_POST_INSTALL: { hr = HrOcIASPostInstall(pnocd); break; } default: { hr = S_OK; // some new messages should not be seen as errors } } TraceError("HrOcExtIAS", hr); return hr; }