Как проверить, установлена ​​ли функция совместимости управления IIS 6? - PullRequest
4 голосов
/ 24 апреля 2010

Используя VB.NET, C # или VBScript, как проверить, установлена ​​ли функция совместимости управления IIS 6 и ее компоненты на компьютере с IIS 7.x?

1 Ответ

8 голосов
/ 24 апреля 2010

Я провел несколько тестов, используя пробную копию 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...