38

我正在尝试msdeploy安装和设置。我已经在 Web 服务器上安装了远程服务,但我所有的测试都给了我一个401 unauthorised error. 服务器是 Windows 2008 R2。

我正在测试一个非常简单的 msdeploy 命令:

msdeploy -verb:dump -source:contentPath=c:\inetpub\wwwroot\MyApp,computerName=<IP HERE>,userName=Domain\msdeploy,password=MyPassword

和错误:

Error: Object of type 'contentPath' and path 'c:\inetpub\wwwroot\MonApp' cannot be created.
Error: Remote agent (URL http://<IP HERE>/MSDEPLOYAGENTSERVICE) could not be contacted.  Make sure the remote agent service is installed and started on the target computer.
Error: An unsupported response was received. The response header 'MSDeploy.Response' was '' but 'v1' was expected.
Error: The remote server returned an error: (401) Unauthorized.
Error count: 1.

我创建了一个名为 msdeploy 的用户,并将其添加到服务器上的本地管理员组中。

我检查过:

  • 该服务安装正确,我启动了它
  • 不使用用户名的域部分,并添加 authType=Basic 的各种组合
  • 授予每个人对该文件夹的完全权限
  • 在 IIS 中允许远程连接
  • 为 contentPath 和 iisApp 的“msdeploy”用户添加了管理服务委派规则(大致基于阅读内容)
  • 尝试使用我用于 RDC 到服务器的不同管理员帐户...
  • 尝试使用不同的 contentPaths 和不同的 msdeploy 命令
  • 创建了一个特定帐户,并将该帐户添加到 IIS_Users。将该用户添加到我的网站“IIS 管理器权限”,并为所有提供商设置“管理服务委派”。
4

5 回答 5

56

我假设您已按照本文为 WebDeploy 2.0 正确配置了服务器:

配置 Web 部署 (IIS.NET)

注意: MS 已经发布了 Web Deploy 2.0 的更新,原来的链接不再有效。我已经更新了这个,但我认为随着时间的推移它会成为一个移动的目标。

您还需要在您的开发/构建/CI 机器上安装 Web Deploy 2.0。

如果您仍在使用 1.0,那么我建议升级,2.0 中有一些巨大的改进。

使用 Visual Studio 2010 的发布功能:

Visual Studio 可以通过右键单击站点并选择“发布”来发布站点。这带来了以下对话:

在此处输入图像描述

Visual Studio 2010 和 WebDeploy 2.0 有几个问题。首先是 VS2010 不支持 WebDeploy/MSDeploy 2.0。因此,如果您尝试发布,您将收到如下错误:

错误 1 ​​Web 部署任务失败。((04/02/2011 12:30:40)在远程计算机上处​​理请求时出错。)

在此处输入图像描述

C:\inetpub\logs\wmsvc\TracingLogFiles\W3SVC1假设您已打开此功能,您还将在服务器上 Web 管理服务的 Failed Request Tracing 中看到以下错误:

AspNetModuleDiagErrorEvent
Uri /msdeploy.axd
eventData 跟踪部署代理异常。请求 ID ''。请求时间戳:'02/04/2011
System.UnauthorizedAccessException:对路径'D:\'的访问被拒绝。

在此处输入图像描述

驱动器号会根据您的 IIS 站点所在的驱动器而有所不同。

开箱即用,GUI 内发布机制默认使用错误版本的 MSDeploy (1.0)。我们想告诉 VS2010 使用 MSDeploy 2.0。您可以通过编辑devenv.exe.config位于以下位置的 Visual Studio 2010 文件来执行此操作(假设您安装了默认c:\驱动器):

对于 64 位系统:c:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE 对于 32 位系统:c:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE

在您最喜欢的 XML 编辑器中打开devenv.exe.config(我只是使用 Visual Studio 2010 本身)并复制以下 xml:

<dependentAssembly>
  <assemblyIdentity 
    name="Microsoft.Web.Deployment" 
    publicKeyToken="31bf3856ad364e35" culture="neutral"/>
  <bindingRedirect oldVersion="7.1.0.0" newVersion="8.0.0.0"/>
</dependentAssembly>

将此添加到该/configuration/runtime/assemblyBinding部分:

在此处输入图像描述

完成此操作后,关闭 Visual Studio 2010 的所有实例以使此更改生效。重新启动 VS2010,打开一个 web 项目,然后再次尝试发布。这次应该成功了。

使用构建包发布:

Visual Studio 可以生成可以从命令行执行的构建包。这是使用生成的Project -> Build Deployment Package。方便持续集成等(也可以使用带有/t:Package开关的 msbuild 生成包)。

包的输出文件夹通常默认为obj\Package.

不幸的是,Visual Studio 2010 有点错误,并生成了一个针对 1.0 的 msdeploy 包装批处理脚本,并针对服务器而不是站点级别的部署。

除了制作您自己的 msdeploy.exe 命令行外,没有快速解决方法。我将其拆分为几行以使其更具可读性。:

“C:\Program Files\IIS\Microsoft Web 部署 v2\\msdeploy.exe”
  -source:archiveDir='d:\sites\DemoApp\obj\Package\Archive'
  -目的地:
       汽车,
       computerName='https://yoursite.com:8172/msdeploy.axd?site=yoursitename',
       用户名='demosite',
       密码='一些密码',
       authtype='基本',
       includeAcls='假'
  -动词:同步
  -disableLink:AppPoolExtension
  -disableLink:内容扩展
  -disableLink:CertificateExtension
  -setParamFile:"d:\sites\DemoApp\obj\Package\Archive.SetParameters.xml"   
  -allowuntrusted

首先要注意的是路径msdeploy.exe。Visual Studio 生成 1.0 版的路径。我已将其更改为使用 2.0。

显着参数:

-source:archiveDir=告诉 msdeploy 我们正在部署一个包并提供本地位置

computerName='https://yoursite.com:8172/msdeploy.axd?site=yoursitename'- 这告诉 MSDEPLOY 部署到 IIS7 上的特定站点。yoursitename应该与 IIS 中的站点名称完全匹配。

userName并且passwordare 是站点的委派经理用户的名称。这是使用站点级别的“IIS 管理器权限”功能配置的。该帐户需要是本地 Windows 用户帐户。

-authtype='basic'- 这会强制进行基本身份验证,否则会尝试 NTLM 身份验证。

-allowuntrusted- 如果您使用内置的自签名 SSL 证书,这将忽略任何 SSL 证书错误。

如果您使用该命令行,那么您应该能够成功部署到远程 IIS7 服务器。

发布原始内容:

有时我们只想直接从本地文件夹发布一些静态内容(或者甚至是经典的 ASP 或 PHP 站点)。我们可以使用以下msdeploy.exe命令行来执行此操作:

“C:\Program Files\IIS\Microsoft Web 部署 v2\\msdeploy.exe”
  -source:contentPath='d:\websites\mysite'
  -目的地:
     contentPath='你的网站名称',
     computerName='https://yoursite.com:8172/msdeploy.axd?site=yoursitename',
     用户名='demosite',
     密码='一些密码',
     authtype='基本',
     includeAcls='假'
-动词:同步
-allowuntrusted

同样的规则也适用于-dest:contentPathcomputerName

我相信 MSDeploy 版本问题将在 SP1 中得到解决(我还没有机会查看)。

一个最终的 VS2010 陷阱:

使用 Visual Studio 2010 发布时,“发布”构建包会导致站点匿名帐户的 ACL 对所有文件和文件App_Data夹更改为只读,但更改为读取和写入的文件夹除外。

这可以通过将以下设置添加到.csproj每个下的文件来解决<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">

<IncludeSetAclProviderOnDestination>False</IncludeSetAclProviderOnDestination>

或者,如果您使用的是 msbuild:

msbuild.exe myproject.csproj /t:Package /p:IncludeSetAclProviderOnDestination=False

我从这里找到了有用的金块:

跳过在 Visual Studio 2010 部署包中设置 ACL(WayBackMachine 链接,因为原始内容不再可用)

于 2011-02-04T13:35:45.017 回答
6

.deploy.cmd对我来说,发布在 Visual Studio 中工作,但在我运行脚本时它不起作用。

通过设置<UseMsdeployExe>true</UseMsdeployExe>您的.csproj,您可以强制 VS 使用 msdeploy.exe 而不是 MSBuild 任务。然后通过调高日志记录级别(工具 > 选项 > 项目和解决方案 > 构建和运行 > MSBuild 项目构建输出详细程度),您可以看到 VS 使用的命令行。

我的问题.deploy.cmd是:

  • 我的 IIS 用户只有该站点的权限,所以我需要?site=<SITENAME>computerName.
  • 我需要AuthType='Basic'-dest:参数中。
于 2011-12-22T10:47:18.633 回答
3

我们面临与您类似的问题。

为此,您需要在服务中启动远程代理服务。我们使用 PC 名称是因为 IP 地址出错。所以尝试使用电脑名称、用户名和密码。

于 2011-01-18T03:54:11.537 回答
1

最后,我从来没有弄清楚我的部署用户帐户缺少什么权限 - 但发现如果我使用机器管理员帐户,部署就会成功。现在我使用管理员帐户进行部署。

感谢 Kev 对设置 ms deploy 2 的精彩而翔实的总结 :)

于 2011-06-02T07:31:58.067 回答
0

物有所值。发布对我有用,然后有一天我遇到了同样的问题(401未经授权的错误)重新启动VS2012解决了这个问题。希望我在尝试所有其他解决方案之前尝试过。

于 2012-12-17T19:05:35.350 回答