msiexec:将网站静默部署到IIS

时间:2012-10-11 09:21:19

标签: iis msiexec

我们的团队正在编写一个包装器应用程序/界面,使用msiexec静默安装一系列msi。

我的问题与安装针对IIS的msi有关。

我一直收到以下错误

  

错误1314.指定的路径'Default Web Site / ROOT / someVirtual'是   不可用。 Internet Information Server可能未在运行或   路径存在并重定向到另一台机器。请检查   Internet服务管理器中此虚拟目录的状态。

使用以下参数设置执行msi,如下所示

msiexec.exe /i "D:\SOME.msi" UseShellExecute="false" TARGETSITE="Default Web Site" TARGETVDIR="someVirtual" TARGETAPPPOOL="DefaultAppPool" /qn /l* D:\SOME_log.txt

我意识到这个问题与IIS有关,因为我可能缺少一些我需要设置的设置/选项。

据我所知,我的虚拟机位于此位置“NT4334RB \ Sites \ Default网站\ someVirtual”,所以我最好的猜测是“默认网站 / ROOT / someVirtual“ - ROOT是问题,需要设置,但是要做什么?怎么样?

我刚刚在日志文件中遇到过这一行 - 我认为这可能有用吗?

  

从Url键获取AppRoot'TARGETURL'

1 个答案:

答案 0 :(得分:0)

似乎我的问题与我没有正确指定配置数据库路径有关。 我最终在我的代码中添加了一个帮助器。

在SO上发现了各种解决方案(this让我思考正确的方向),&我还安装了一个名为IIS Metabase Explorer的东西非常有用

//Added for reference purposes
//HasRequiredOption("site|s=", "The site location", c =>
//AddOrUpdateAdditionalMsiProperty("TARGETSITE", BuildMetabasePath(c)));

//apppool => TARGETAPPPOOL
//virtualdir => TARGETVDIR

/// <summary>
/// Builds the meta-base path.
/// </summary>
/// <param name="websiteName">Name of the website.</param>
/// <returns>The fully constructed meta-base path</returns>
private string BuildMetabasePath(string websiteName)
{
    return "/LM/W3SVC/" + this.GetWebSiteId(websiteName);
}

/// <summary>
/// Gets the web site id.
/// </summary>
/// <param name="websiteName">Name of the website.</param>
/// <param name="serverName">Name of the server. Defaults to: localhost if none specified</param>
/// <returns>The website id</returns>
private string GetWebSiteId(string websiteName, string serverName = "localhost")
{
    using (var entries = new DirectoryEntry(string.Format("IIS://{0}/w3svc", serverName)))
    {
        var children = entries.Children.Cast<DirectoryEntry>();
        var sites =
           (from de in children
             where
             de.SchemaClassName == "IIsWebServer" &&
             de.Properties["ServerComment"].Value.ToString() == websiteName
             select de).ToList();

       if (sites.Any())
       {
          return sites.First().Name;
       }
   }

  return "-1";
}