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
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;
|
|
}
|
|
|