1

私たちのチームは、msiexec を使用して一連の msi をサイレント モードでインストールするためのラッパー アプリケーション/インターフェイスを作成しました。

私の問題は、IIS 向けの msi のインストールに関連しています。

次のエラーが発生し続けます

エラー 1314。指定されたパス 'Default Web Site/ROOT/someVirtual' は使用できません。Internet Information Server が実行されていないか、パスが存在し、別のマシンにリダイレクトされている可能性があります。インターネット サービス マネージャで、この仮想ディレクトリの状態を確認してください。

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 Web Site\someVirtual」なので、 「Default Web Site / ROOT / someVirtual」であることが最善の推測です-ROOTが問題であり、設定する必要があります、しかし何に?そしてどうやって?

ログファイルでこの行に出くわしました - これは役に立つと思いますか?

URLキー「TARGETURL」からAppRootを取得しています

4

1 に答える 1

0

私の問題は、メタベース パスを正しく指定していないことに関連しているようです。私は自分のコードにこのようなヘルパーを追加することになりました。

SOでさまざまなソリューションを見つけました(これにより、正しい方向に考えることができました)。また、非常に便利な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";
}
于 2012-10-15T15:11:40.990 に答える