概述
我只能想到两种方法来以编程方式修改 IIS 的配置,从经典的 ASP。第一种是使用 ADSI 或 WMI 等 COM 类来操作配置。第二个将利用 Microsoft 引入的新 ASP.Net 类Microsoft.Web.Administration。 (为了完整起见,您也可以使用 System.DirectoryServices,但这些类只是 ADSI 的托管包装器。)
方法 1 - 通过 ADSI 的 COM
我将首先讨论基于 COM 的解决方案,因为这种方法涉及的开销最少。我将专注于 ADSI,而不是 WMI,因为这是我过去使用的。 ADSI 可以使用add sites, vdirs, apps, etc。
例如,要创建一个新站点,您可以使用CreateNewSite():
Dim myNewSiteID, oIIsWebServiceObj, oBindings
oBindings = Array(0)
Set oBindings(0) = providerObj.get("ServerBinding").SpawnInstance_()
oBindings(0).IP = "192.168.1.1"
oBindings(0).Port = "80"
oBindings(0).Hostname = "yournewsite.example.com"
Set oIIsWebServiceObj = GetObject("IIS://MachineName/W3SVC")
myNewSiteID = oIIsWebServiceObj.CreateNewSite("NewSite", oBindings, _
"C:\Sites\yournewsite")
要创建一个新的虚拟目录,您可以使用:
Dim IIsWebVDirRootObj, IIsWebVDirObj
Set IIsWebVDirRootObj = GetObject("IIS://localhost/W3SVC/1/Root")
Set IIsWebVDirObj = IIsWebVDirRootObj.Create("IIsWebVirtualDir", "NewVDir")
IIsWebVDirObj.Put "Path", "C:\NewContent"
IIsWebVDirObj.Put "AccessRead", True
IIsWebVDirObj.Put "AccessScript", True
IIsWebVDirObj.SetInfo
我有 95% 的把握,为了使用 ADSI 或 WMI,您需要启用 IIS6 兼容性,因为这些 COM 对象试图操作元数据库,而新版本的 IIS 不再使用这些元数据库。要启用 IIS6 兼容性,请see this MSDN page for IIS 7.5 或此MSDN page for IIS8。
方法 2 - .Net 通过 Microsoft.Web.Administration
如果我以某种方式使用 .Net,我会选择 Microsoft.Web.Administration 而不是 System.DirectoryServices。无论您使用哪个 .Net 类,您都必须将其包装以便能够从经典 asp 中使用它,因为没有本地调用 .Net 的方法。为此,您需要将您编写的任何代码包装在 CCW 中 - COM-Callable Wrapper。完全有可能做到这一点,您可以在 .Net 中编写所有代码,并实例化一个 COM 组件,该组件只是所有 .Net 代码的容器。我不会详细介绍如何将 .net 代码包装在 CCW 中,但您的 CCW 的 .Net 代码将非常简单:
ServerManager serverManager = new ServerManager();
Site mySite = serverManager.Sites.Add("NewSite", "C:\\Sites\\yournewsite", 80);
mySite.ServerAutoStart = true;
serverManager.CommitChanges();
有关如何使用 CCW 的更多信息,请参阅this MSDN article。
最后...权限。
现在,更大的问题是:您是以 IUSR 或 IUSR_MachineName 身份运行的,或者是某个完全无权使用 IIS 配置的受限帐户。一种或另一种方式,你将不得不获得更多的许可。您可能可以use impersonation in classic asp,但另一种方法是change the identity that your application is running as。在你的情况下,尽管它是绝对可怕,你需要以比IUSR更有特权的身份运行。
或者,只需关闭匿名身份验证,然后启用基本身份验证。然后,向将要向服务器进行身份验证的用户授予足够的权限,代码应该可以正常运行。