WindowsXP-SP1/admin/cys/src/isserviceinstalled.cpp
2020-09-30 16:53:49 +02:00

203 lines
4.5 KiB
C++

// Copyright (c) 2000 Microsoft Corporation
//
// Implementation of IConfigureYourServer::IsServiceInstalled
//
// 27 Mar 2000 sburns
#include "headers.hxx"
#include "ConfigureYourServer.hpp"
// CODEWORK: could these be made const wchar_t*?
#define REGKEY_MSMQ L"SOFTWARE\\Microsoft\\MSMQ\\Parameters"
#define REGKEY_RRAS L"System\\CurrentControlSet\\Services\\RemoteAccess"
#define REGKEY_NETSHOW L"SOFTWARE\\Microsoft\\NetShow"
bool
IsServiceInstalledHelper(const wchar_t* serviceName)
{
LOG_FUNCTION2(IsServiceInstalledHelper, serviceName);
ASSERT(serviceName);
// if we can open the service, then it is installed
bool result = false;
SC_HANDLE hsc =
::OpenSCManager(0, SERVICES_ACTIVE_DATABASE, GENERIC_READ);
if (hsc)
{
SC_HANDLE hs = ::OpenServiceW(hsc, serviceName, GENERIC_READ);
if (hs)
{
::CloseServiceHandle(hs);
result = true;
}
::CloseServiceHandle(hsc);
}
return result;
}
// For most services:
// return -1 if the service should not be installed,
// return 0 if not installed,
// return 1 if installed
HRESULT __stdcall
ConfigureYourServer::IsServiceInstalled(BSTR bstrService, int* state)
{
LOG_FUNCTION2(ConfigureYourServer::IsServiceInstalled, bstrService);
ASSERT(bstrService);
ASSERT(state);
HRESULT hr = S_OK;
do
{
if (!bstrService || !state)
{
hr = E_INVALIDARG;
break;
}
*state = 0;
if (!StrCmpIW(bstrService, L"DNS"))
{
*state = IsServiceInstalledHelper(L"DNS") ? 1 : 0;
break;
}
if (!StrCmpIW(bstrService, L"DHCP"))
{
*state = IsServiceInstalledHelper(L"DHCPServer") ? 1 : 0;
break;
}
if (!StrCmpIW(bstrService, L"RRAS"))
{
// Routing & Remote Access
// If HKLM\System\CurrentControlSet\Services\RemoteAccess,
// ConfigurationFlags(REG_DWORD) == 1, then Ras and Routing is
// configured.
//
// RRAS is always installed.
DWORD dwRet;
DWORD dwCfgFlags;
DWORD cbSize = sizeof(dwCfgFlags);
dwRet =
::SHGetValue(
HKEY_LOCAL_MACHINE,
REGKEY_RRAS,
L"ConfigurationFlags",
NULL,
(LPVOID) &dwCfgFlags,
&cbSize);
if ((NO_ERROR == dwRet) && (1 == dwCfgFlags))
{
*state = 1;
}
break;
}
if (!StrCmpIW(bstrService, L"WINS"))
{
*state = IsServiceInstalledHelper(L"WINS") ? 1 : 0;
break;
}
if (!StrCmpIW(bstrService, L"IIS"))
{
*state = IsServiceInstalledHelper(L"IISADMIN") ? 1 : 0;
break;
}
if (!StrCmpIW(bstrService, L"StreamingMedia"))
{
// If we can find nsadmin.exe, we assume netshow is installed
DWORD dwRet;
TCHAR szPath[MAX_PATH];
DWORD cbSize = sizeof(szPath);
dwRet =
::SHGetValue(
HKEY_LOCAL_MACHINE,
REGKEY_NETSHOW,
L"InstallDir",
NULL,
(LPVOID)szPath,
&cbSize);
if ((NO_ERROR == dwRet) && *szPath)
{
if (
PathAppend(szPath, L"Server\\nsadmin.exe")
&& PathFileExists(szPath) )
{
*state = 1;
}
}
break;
}
if (!StrCmpIW(bstrService, L"MessageQueue"))
{
// If reg value HKLM\Software\Microsoft\MSMQ\Parameters,MaxSysQueue
// exists, we assume Message Queue is installed.
DWORD dwRet;
DWORD dwMaxSysQueue;
DWORD cbSize = sizeof(dwMaxSysQueue);
dwRet =
::SHGetValue(
HKEY_LOCAL_MACHINE,
REGKEY_MSMQ,
L"MaxSysQueue",
NULL,
(LPVOID) &dwMaxSysQueue,
&cbSize);
if (NO_ERROR == dwRet)
{
*state = 1;
}
break;
}
// At this point, the caller has asked for some service we don't
// recognize
hr = E_INVALIDARG;
}
while (0);
LOG_HRESULT(hr);
LOG(String::format(L"state = %1!d!", *state));
return hr;
}