【问题标题】:Create a virtual directory in IIS from Classic ASP从经典 ASP 在 IIS 中创建虚拟目录
【发布时间】:2015-01-08 04:06:15
【问题描述】:

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

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

现在我们的 URL 看起来像“https://www.somesite.com/CustomerName”。稍后我想将其更改为“https://CustomerName.somesite.com”。在这方面的任何帮助也将不胜感激。

【问题讨论】:

  • 您的目标是什么版本的 IIS?如果 > IIS6,是否会安装 IIS6 兼容层?
  • 对不起,我没有在原帖中提到这一点。服务器正在运行 Windows Server 2008 r2。我相信是IIS 8。肯定是在IIS 6之上的。我认为没有安装兼容层。
  • 没问题。我详细介绍了两种方法。其中一个需要打开 IIS6 兼容性,但比第二个要简单得多。

标签: iis asp-classic virtual-directory


【解决方案1】:

概述

我只能想到两种方法来以编程方式修改 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更有特权的身份运行。

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

【讨论】:

  • 谢谢!方法 1 看起来很棒。我会在今晚尝试设置它。权限显然是一个问题。如果我为这段代码打开这个漏洞,它会为这个站点上的所有内容打开它。我可能必须创建第二个应用程序,例如 Web 服务或其他东西来处理这个问题。如果是这样的话,我可以用 .net 来做。
【解决方案2】:

以下是可能的步骤:

  1. 收集所有必需的数据(如应用程序/站点名称)以创建/配置新站点/应用程序。
  2. 使用 System.DirectoryServices api 创建/配置新站点。 通过this 链接了解有关如何在 IIS6 中创建/配置站点/应用程序的更多信息。
  3. 如果您使用的是 IIS7,那么this 文章将帮助您创建/配置新站点/应用程序。

【讨论】:

  • 该站点使用的是经典 ASP。这行不通。我需要从我的网络应用程序进行调用。
  • 我们可以使用经典 asp 中的 .Net 程序集。我们不能吗?
猜你喜欢
  • 2012-02-02
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
  • 2016-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多