windows-nt/Source/XPSP1/NT/net/config/netoc/ncias.cpp
2020-09-26 16:20:57 +08:00

341 lines
7.8 KiB
C++

//+---------------------------------------------------------------------------
//
// 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<BYTE*>(&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;
}