在进行软件安装或系统配置时,经常需要确认是否已经安装了Internet Information Services (IIS)以及其组件。本文将介绍如何使用.NET Framework编写代码来检测IIS及其组件的安装状态。
要确定特定版本的IIS是否已安装,可以通过查看注册表中的以下键值:
HKLM\Software\Microsoft\InetStp\MajorVersion
这是一个DWORD值,表示已安装的IIS版本。例如:
对于IIS 5,还可以使用MinorVersion DWORD值来确定是运行在Windows 2000 Server还是Windows XP Professional上。如果MinorVersion为1,则表示运行在Windows XP Professional上。
有时候,仅仅知道IIS是否安装是不够的,还需要确定特定的子组件是否也已安装。同样,可以通过注册表来获取这些信息。所有子组件的信息都包含在以下注册表键中:
HKLM\Software\Microsoft\Microsoft\Windows\CurrentVersion\Setup\Oc Manager\Subcomponents
这个键下的所有值都是DWORD类型,如果值为1,则表示该组件已安装。
要检测ASP是否已注册到IIS,只需查看ASP组件(iis_asp)是否已安装。然而,对于ASP.NET,由于存在不同版本的ASP.NET,检测过程会稍微复杂一些。同样可以通过查看注册表中的以下键值来获取这些信息:
HKLM\Software\Microsoft\ASP.NET\1.1.4322.0
HKLM\Software\Microsoft\ASP.NET\2.0.50727.0
如果键存在,则表示该版本的ASP.NET已注册到IIS。
为了统一检查各种不同的注册表键,并帮助隔离.NET Framework和IIS未来版本的变更,创建了InternetInformationServicesDetection类。此类公开了以下公共方法:
这些函数使用了FrameworkVersion、InternetInformationServicesVersion和InternetInformationServicesComponent枚举。以下是这些枚举的定义:
以下是一个完整的C#示例,用于检测IIS及其组件的安装状态:
bool iis4Installed = InternetInformationServicesDetection.IsInstalled(InternetInformationServicesVersion.IIS4);
bool iis5Installed = InternetInformationServicesDetection.IsInstalled(InternetInformationServicesVersion.IIS5);
bool iis6Installed = InternetInformationServicesDetection.IsInstalled(InternetInformationServicesVersion.IIS6);
bool iis7Installed = InternetInformationServicesDetection.IsInstalled(InternetInformationServicesVersion.IIS7);
Console.WriteLine("IIS 4 installed? " + iis4Installed);
Console.WriteLine("IIS 5 installed? " + iis5Installed);
Console.WriteLine("IIS 6 installed? " + iis6Installed);
Console.WriteLine("IIS 7 installed? " + iis7Installed);
if (iis4Installed || iis5Installed || iis6Installed || iis7Installed)
{
Console.WriteLine("ASP Registered? " + InternetInformationServicesDetection.IsAspRegistered());
Console.WriteLine("ASP.NET 1.0 Registered? " + InternetInformationServicesDetection.IsAspNetRegistered(FrameworkVersion.Fx10));
Console.WriteLine("ASP.NET 1.1 Registered? " + InternetInformationServicesDetection.IsAspNetRegistered(FrameworkVersion.Fx11));
Console.WriteLine("ASP.NET 2.0 Registered? " + InternetInformationServicesDetection.IsAspNetRegistered(FrameworkVersion.Fx20));
Console.WriteLine("ASP.NET 3.0 Registered? " + InternetInformationServicesDetection.IsAspNetRegistered(FrameworkVersion.Fx30));
Console.WriteLine("ASP.NET 3.5 Registered? " + InternetInformationServicesDetection.IsAspNetRegistered(FrameworkVersion.Fx35));
}
公共方法仅仅是确定应该调用哪个私有函数的包装器。这些私有函数反过来查询相应的注册表键并处理结果。然而,真正的工作是在GetRegistryValue