Я провел несколько тестов, используя пробную копию Registry Workshop (функция сравнения реестров), и обнаружил следующее:
Если установлен IIS 7.x, следующий раздел реестра содержит информацию об установленных подкомпонентах:
HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ InetStp \ Компоненты
Каждая установленная функция представлена значением DWORD 0x00000001. Если функция не установлена, значение отсутствует.
Для инструментов веб-управления имена значений следующие:
Web Management Tools
IIS 6 Management Compatibility
IIS 6 Management Console (LegacySnapin)
IIS 6 Scripting Tools (LegacyScripts)
IIS 6 WMI Compatibility (WMICompatibility)
IIS Metabase and IIS 6 configuration compatibility (Metabase + ADSICompatibility)
IIS Management Console (ManagementConsole)
IIS Management Scripts and Tools (ManagementScriptingTools)
IIS Management Service (AdminService)
Обратите внимание, что имена этих компонентов были получены при установке Windows 7 и могут немного отличаться от имен Windows Server 2008, хотя ключи реестра должны совпадать.
Часть этого упоминается в примечании к этой статье:
Использование управляемого кода для обнаружения, если установлен IIS и зарегистрирован ASP / ASP.NET
Список этих и других подкомпонентов можно найти здесь:
Обнаружение установленных компонентов
Обновление:
Некоторые основные функции из окончательного кода. Это не полный код, но его должно быть достаточно для тех, кто тратит время на поиск имен компонентов для различных версий IIS:
Function IsIISComponentInstalled(ByVal ComponentName)
Dim result
Dim intProcessorArchitecture
intProcessorArchitecture = GetProcessorArchitectureIIS()
If intProcessorArchitecture = 64 Then
'64-bit system
On Error Resume Next
Err.Clear
result = RegReadDWORD(HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\InetStp\Components", ComponentName, 64)
If Err.Number <> 0 Then
Err.Clear
IsIISComponentInstalled = False
Else
If result = 1 Then
IsIISComponentInstalled = True
Else
IsIISComponentInstalled = False
End If
End If
Else
'32-bit system
If RegReadStringIIS("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\InetStp\Components\" & ComponentName) = "1" Then
IsIISComponentInstalled = True
Else
IsIISComponentInstalled = False
End If
End If
End Function
Function GetProcessorArchitectureIIS()
Dim strProcessorArchitecture
Dim oShell
Set oShell = CreateObject("Wscript.Shell")
strProcessorArchitecture = oShell.RegRead("HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\PROCESSOR_ARCHITECTURE")
If strProcessorArchitecture = "x86" Then
GetProcessorArchitectureIIS = 32
Else
If strProcessorArchitecture = "AMD64" Then
GetProcessorArchitectureIIS = 64
Else
GetProcessorArchitectureIIS = 0
End If
End If
End Function
Function RegReadStringIIS(sRegValue)
Set oShell = CreateObject("WScript.Shell")
On Error Resume Next
RegReadStringIIS = oShell.RegRead(sRegValue)
If Err Then
RegReadStringIIS = ""
Err.clear
End If
If VarType(RegReadStringIIS) < vbArray Then
If RegReadStringIIS = sRegValue Then
RegReadStringIIS = ""
End If
End If
On Error Goto 0
End Function
'-------------------------------------------------------------------
' Reads a REG_SZ value from the local computer's registry using WMI.
' Parameters:
' RootKey - The registry hive (see http://msdn.microsoft.com/en-us/library/aa390788(VS.85).aspx for a list of possible values).
' Key - The key that contains the desired value.
' Value - The value that you want to get.
' RegType - The registry bitness: 32 or 64.
'
'References:
' /1102324/kak-mne-prochitat-64-bitnye-znacheniya-reestra-iz-vbscript-rabotayschego-kak-zadacha-msi-posle-ustanovki
' http://msdn.microsoft.com/en-us/library/aa393067(VS.85).aspx
' http://msdn.microsoft.com/en-us/library/windows/desktop/aa390445(v=VS.85).aspx
'
Function RegReadDWORD(RootKey, Key, Value, RegType)
Dim oCtx, oLocator, oReg, oInParams, oOutParams
Set oCtx = CreateObject("WbemScripting.SWbemNamedValueSet")
oCtx.Add "__ProviderArchitecture", RegType
Set oLocator = CreateObject("Wbemscripting.SWbemLocator")
Set oReg = oLocator.ConnectServer("", "root\default", "", "", , , , oCtx).Get("StdRegProv")
Set oInParams = oReg.Methods_("GetDWORDValue").InParameters
oInParams.hDefKey = RootKey
oInParams.sSubKeyName = Key
oInParams.sValueName = Value
Set oOutParams = oReg.ExecMethod_("GetDWORDValue", oInParams, , oCtx)
RegReadDWORD = oOutParams.uValue
End Function