Leaked source code of windows server 2003
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.
 
 
 
 
 
 

444 lines
9.4 KiB

// Copyright (c) 2002 Microsoft Corporation
//
// File: IndexingInstallationUnit.cpp
//
// Synopsis: Defines a IndexingInstallationUnit
// This object has the knowledge for installing the
// indexing service
//
// History: 03/20/2002 JeffJon Created
#include "pch.h"
#include "resource.h"
#include "IndexingInstallationUnit.h"
#include "InstallationUnitProvider.h"
#include <ciodm.h>
IndexingInstallationUnit::IndexingInstallationUnit() :
InstallationUnit(
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
String(),
String(),
String(),
INDEXING_SERVICE)
{
LOG_CTOR(IndexingInstallationUnit);
}
IndexingInstallationUnit::~IndexingInstallationUnit()
{
LOG_DTOR(IndexingInstallationUnit);
}
InstallationReturnType
IndexingInstallationUnit::InstallService(HANDLE /*logfileHandle*/, HWND /*hwnd*/)
{
LOG_FUNCTION(IndexingInstallationUnit::InstallService);
InstallationReturnType result = INSTALL_SUCCESS;
String unattendFileText;
String infFileText;
unattendFileText += L"[Components]\n";
unattendFileText += L"indexsrv_system=ON\n";
bool ocmResult = InstallServiceWithOcManager(infFileText, unattendFileText);
if (ocmResult &&
IsServiceOn())
{
LOG(L"Indexing service installed successfully");
}
else
{
LOG(L"Failed to install the indexing service");
result = INSTALL_FAILURE;
}
LOG_INSTALL_RETURN(result);
return result;
}
UnInstallReturnType
IndexingInstallationUnit::UnInstallService(HANDLE /*logfileHandle*/, HWND /*hwnd*/)
{
LOG_FUNCTION(IndexingInstallationUnit::UnInstallService);
UnInstallReturnType result = UNINSTALL_SUCCESS;
LOG_UNINSTALL_RETURN(result);
return result;
}
bool
IndexingInstallationUnit::IsServiceInstalled()
{
LOG_FUNCTION(IndexingInstallationUnit::IsServiceInstalled);
bool result = false;
// If we can instantiate the indexing server COM object
// then the indexing service is installed
do
{
CLSID clsid;
HRESULT hr = CLSIDFromProgID( L"Microsoft.ISAdm", &clsid );
if (FAILED(hr))
{
LOG(String::format(
L"Failed to get the CLSID from ProgID: hr = 0x%x",
hr));
break;
}
SmartInterface<IAdminIndexServer> adminIndexServer;
hr = adminIndexServer.AcquireViaCreateInstance(
clsid,
0,
CLSCTX_INPROC_SERVER);
if (SUCCEEDED(hr))
{
result = true;
}
else
{
LOG(String::format(
L"Failed to CreateInstance the indexing COM object: hr = 0x%1!x!",
hr));
}
} while (false);
LOG_BOOL(result);
return result;
}
HRESULT
IndexingInstallationUnit::StartService(HANDLE logfileHandle)
{
LOG_FUNCTION(IndexingInstallationUnit::StartService);
HRESULT hr = S_OK;
do
{
if (!IsServiceInstalled())
{
InstallationReturnType installResult =
InstallService(logfileHandle, 0);
if (installResult != INSTALL_SUCCESS)
{
LOG(L"Failed to install the indexing service");
hr = Win32ToHresult(ERROR_SERVICE_DOES_NOT_EXIST);
break;
}
}
// Since the Indexing service is no longer SERVICE_DEMAND_START we
// we have to change the service config from SERVICE_DISABLED to
// SERVICE_AUTO_START.
hr = ChangeServiceConfigToAutoStart();
if (FAILED(hr))
{
LOG(String::format(
L"Failed to enable the indexing service: hr = 0x%1!x!",
hr));
break;
}
hr = ModifyIndexingService(true);
} while (false);
LOG_HRESULT(hr);
return hr;
}
HRESULT
IndexingInstallationUnit::StopService()
{
LOG_FUNCTION(IndexingInstallationUnit::StopService);
HRESULT hr = S_OK;
do
{
hr = ModifyIndexingService(false);
if (FAILED(hr))
{
LOG(String::format(
L"Failed to stop the indexing service: hr = 0x%1!x!",
hr));
break;
}
// Set the indexing service to disabled so that it doesn't
// start after a reboot
hr = ChangeServiceConfigToDisabled();
if (FAILED(hr))
{
LOG(String::format(
L"Failed to disable the indexing service: hr = 0x%1!x!",
hr));
break;
}
} while (false);
LOG_HRESULT(hr);
return hr;
}
bool
IndexingInstallationUnit::IsServiceOn()
{
LOG_FUNCTION(IndexingInstallationUnit::IsServiceOn);
bool result = false;
do
{
CLSID clsid;
HRESULT hr = CLSIDFromProgID( L"Microsoft.ISAdm", &clsid );
if (FAILED(hr))
{
LOG(String::format(
L"Failed to get the CLSID from ProgID: hr = 0x%x",
hr));
break;
}
SmartInterface<IAdminIndexServer> adminIndexServer;
hr = adminIndexServer.AcquireViaCreateInstance(
clsid,
0,
CLSCTX_INPROC_SERVER);
if (FAILED(hr))
{
LOG(String::format(
L"Failed to CoCreateInstance of IAdminIndexServer: hr = 0x%x",
hr));
break;
}
VARIANT_BOOL var;
hr = adminIndexServer->IsRunning(&var);
if (FAILED(hr))
{
LOG(String::format(
L"Failed to get running state: hr = 0x%x",
hr));
break;
}
LOG(String::format(
L"var = 0x%1!x!",
var));
result = var ? true : false;
} while (false);
LOG_BOOL(result);
return result;
}
HRESULT
IndexingInstallationUnit::ModifyIndexingService(bool turnOn)
{
LOG_FUNCTION2(
IndexingInstallationUnit::ModifyIndexingService,
turnOn ? L"true" : L"false");
HRESULT hr = S_OK;
do
{
CLSID clsid;
hr = CLSIDFromProgID( L"Microsoft.ISAdm", &clsid );
if (FAILED(hr))
{
LOG(String::format(
L"Failed to get the CLSID from ProgID: hr = 0x%x",
hr));
break;
}
SmartInterface<IAdminIndexServer> adminIndexServer;
hr = adminIndexServer.AcquireViaCreateInstance(
clsid,
0,
CLSCTX_INPROC_SERVER);
if (FAILED(hr))
{
LOG(String::format(
L"Failed to CoCreateInstance of IAdminIndexServer: hr = 0x%x",
hr));
break;
}
if (turnOn)
{
hr = adminIndexServer->Start();
}
else
{
hr = adminIndexServer->Stop();
}
if (FAILED(hr))
{
LOG(String::format(
L"Failed to start or stop indexing service: hr = 0x%x",
hr));
break;
}
} while (false);
LOG(String::format(L"hr = %1!x!", hr));
return hr;
}
HRESULT
IndexingInstallationUnit::ChangeServiceConfigToAutoStart()
{
LOG_FUNCTION(IndexingInstallationUnit::ChangeServiceConfigToAutoStart);
HRESULT hr = ChangeServiceStartType(SERVICE_AUTO_START);
LOG_HRESULT(hr);
return hr;
}
HRESULT
IndexingInstallationUnit::ChangeServiceConfigToDisabled()
{
LOG_FUNCTION(IndexingInstallationUnit::ChangeServiceConfigToDisabled);
HRESULT hr = ChangeServiceStartType(SERVICE_DISABLED);
LOG_HRESULT(hr);
return hr;
}
HRESULT
IndexingInstallationUnit::ChangeServiceStartType(DWORD startType)
{
LOG_FUNCTION(IndexingInstallationUnit::ChangeServiceStartType);
HRESULT hr = S_OK;
SC_HANDLE handle = 0;
SC_HANDLE serviceHandle = 0;
do
{
// Open the service controller
hr =
Win::OpenSCManager(
L"",
GENERIC_READ | GENERIC_WRITE,
handle);
if (FAILED(hr))
{
LOG(String::format(
L"Failed to open service controller: hr = 0x%1!x!",
hr));
break;
}
// The indexing service name
static const String serviceName(L"cisvc");
// Open the service
hr =
Win::OpenService(
handle,
serviceName,
SERVICE_CHANGE_CONFIG,
serviceHandle);
if (FAILED(hr))
{
LOG(String::format(
L"Failed to open service %1: hr = 0x%2!x!",
serviceName.c_str(),
hr));
break;
}
hr =
Win::ChangeServiceConfig(
serviceHandle,
SERVICE_NO_CHANGE,
startType,
SERVICE_NO_CHANGE,
L"",
L"",
0,
L"",
L"",
EncryptedString(),
L"");
if (FAILED(hr))
{
LOG(String::format(
L"Failed to change service config: hr = 0x%1!x!",
hr));
break;
}
} while(false);
// Close the service handles if necessary
if (serviceHandle)
{
Win::CloseServiceHandle(serviceHandle);
}
if (handle)
{
Win::CloseServiceHandle(handle);
}
LOG_HRESULT(hr);
return hr;
}