从 Classic ASP 在 IIS 中创建虚拟目录

Create a virtual directory in IIS from Classic ASP

我正在开发一个提供软件即服务的经典 asp 站点。该站点的潜在客户与我们联系,我们手动设置该站点。我们希望尽可能自动化这个过程。目前,我有一个我的老板填写的表格,用于存根数据库中的数据。该过程向我发送了一封电子邮件,我必须手动为站点创建虚拟目录。

我想使用经典 ASP 进行设置。我没有从 GIS 中找到很好的结果。我发现了有关创建批处理文件或执行 appcmd 的内容。有人成功过吗?

现在我们的 URL 看起来像“https://www.somesite.com/CustomerName". Later I would like to change this to something like "https://CustomerName.somesite.com”。在这方面的任何帮助也将不胜感激。

以下是可能的步骤:

  1. 收集所有必需的数据(如 application/site 姓名)到 create/configure new site/application。
  2. 使用 System.DirectoryServices api 到 create/configure 新站点。 通过 this link 了解有关如何在 IIS6 中 create/configure site/application 的更多信息。
  3. 如果您使用的是 IIS7,那么 this 文章将帮助您 create/configure 新 site/application。

概览

我只能想到两种方法来以编程方式修改 IIS 的配置,来自 classic ASP。第一种是使用 COMclasses,例如 ADSI 或 WMI 来操作配置。第二个将利用 Microsoft 引入的新 ASP.Net classes Microsoft.Web.Administration. (For completeness, you could also use System.DirectoryServices,但这些 classes 只是 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 or this MSDN page for IIS8.


方法 2 - .Net 通过 Microsoft.Web.Administration

如果我执意要以某种方式使用 .Net,我会选择 Microsoft.Web.Administration 而不是 System.DirectoryServices。无论您使用哪个 .Net class,您都必须将其包装起来才能从 classic asp 中使用它,因为没有本地方法调用 .网。为此,您需要将您在 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, but the other approach is to change the identity that your application is running as。在你的情况下,绝对可怕,你需要 运行 作为比 IUSR 更特权的东西。

或者,只需关闭匿名身份验证,然后启用基本身份验证。然后,授予将要对服务器进行身份验证的用户足够的权限,代码应该 运行 没问题。