Using either VB.NET, C#, or VBScript, how can I check if the IIS 6 Management Compatibility feature and its subfeatures have been installed on a machine running IIS 7.x?
I performed some tests using a trial copy of Registry Workshop (the Compare Registries function) and found the following:
If IIS 7.x is installed, the following Registry key contains information about the installed subcomponents:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\InetStp\Components
Each installed feature is represented with a value of DWORD 0x00000001. If a feature is not installed, the value is missing.
For the Web Management Tools, the value names are as follows:
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)
Note that these component names came from a Windows 7 installation and might differ slightly from those of Windows Server 2008, though the Registry keys should be the same.
Some of this is mentioned in a note to this article: Using Managed Code to Detect if IIS is Installed and ASP/ASP.NET is Registered
A list of these and other subcomponents can be found here: Discover Installed Components
Update:
Some core functions from the final code. This is not the complete code but should be enough for anyone who spends the time looking up the component names for the various IIS versions:
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:
' http://stackoverflow.com/questions/1229760/how-do-i-read-64-bit-registry-values-from-vbscript-running-as-a-an-msi-post-inst
' 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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With