341 lines
7.8 KiB
C++
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;
|
|
}
|
|
|