DefaultAppPool 下的 运行 msdeploy.exe 产生奇怪的行为

Run msdeploy.exe from under DefaultAppPool produces weird behaviour

简介

我有这个 ASP.NET 网络应用程序,我想为其用户提供一种通过 POST 请求更新应用程序的方法 zip 包含较新版本应用程序的文件。

在成功接收、存储和使用 zip 文件时,我发现 msdeploy.exe 程序无法运行,这意味着我的应用程序没有得到更新。

我正在使用以下命令行语法:

msdeploy -verb:sync -source:package={0} -dest:auto -enableRule:DoNotDeleteRule

(其中 {0} 替换为带引号的 zip 文件的完整路径)

问题

虽然通过 Windows© Shell 手动 成功安装 更新,但我 未能安装 当我从我的 Web 应用程序开始 msdeploy。我使用的代码:

ProcessStartInfo info = new ProcessStartInfo()
{
    FileName = Path.Combine(workingDir, "msdeploy.exe"),
    WorkingDirectory = workingDir,
    CreateNoWindow = true,
    Arguments = @"-verb:sync -source:package={0} -dest:auto -enableRule:DoNotDeleteRule -verbose".Formatted(filename.Enquote()),
    UseShellExecute = false,
    RedirectStandardOutput = true,
};

Process deploy = Process.Start(info);
deploy.Start();

调试尝试

我已将程序的输出重定向到一个文件中,因此我可以将其与 理想 比较,即实际工作的手动方式。

工作 msdeploy 输出(运行 通过我的 windows 帐户 + windows shell):

Info: Updating file (Default Web Site/ElQueue\bin\AutoMapper.dll).
Info: Updating file (Default Web Site/ElQueue\bin\Contracts.dll).
...
Info: Updating file (Default Web Site/ElQueue\Views\Web.config).
Info: Updating file (Default Web Site/ElQueue\Web.config).
Info: Adding ACL's for path (Default Web Site/ElQueue)
Info: Adding ACL's for path (Default Web Site/ElQueue)
Total changes: 27 (1 added, 0 deleted, 26 updated, 0 parameters changed, 803122 bytes copied)

非工作 msdeploy 输出(运行 通过 Process.Start 因此 IIS AppPool\DefaultAppPool IIS 的虚拟帐户):

Warning: BACKUP_FAILED - Skipping backup because it failed due to an unknown reason.яFor more information, contact your server administrator.
Info: Adding sitemanifest (sitemanifest).
Info: Creating application (Default Web Site/ElQueue)

而且,仅此而已。不多。没有文件更新,什么都没有。应用程序的文件保持不变。

那么,如何以正确的方式更新我的网络应用程序?

我认为 msdeploy 是正确的方式,但它似乎不适用于默认的 IIS 应用程序池。

通过 lusrmgr.msc 管理控制台工具将 IIS AppPool\DefaultAppPool 用户添加到 Administrators 组并在之后重新启动来解决问题。

您如何对用户进行身份验证?如果是 Windows 身份验证,最好的选择是配置 Web deployment delegation rule。使您的池帐户身份成为本地管理员的一部分可能会产生严重的安全问题。