msdeploy(Web Deploy)因401身份验证问题而失败

38

我正在尝试安装和设置msdeploy。我已经在Web服务器上安装了远程服务,但所有的测试都给了我一个401未经授权的错误。该服务器是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中允许远程连接
  • 为我的"msdeploy"用户添加了内容路径和iisApp的管理服务委托规则(基于阅读这个),
  • 尝试使用我用于RDC到服务器的另一个管理员帐户...
  • 尝试不同的contentPaths和不同的msdeploy命令
  • 创建了一个特定帐户,并将该帐户添加到IIS_Users。 将该用户添加到我的网站"IIS管理器权限",并为所有提供程序设置"管理服务委派"。
5个回答

56
我假设您已经按照以下文章正确配置了WebDeploy 2.0服务器:

配置Web Deploy(IIS.NET)

注意:微软已经发布了Web Deploy 2.0的更新,原始链接已经不再有效。我已经进行了更新,但我认为它将随着时间而变化。

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

如果您仍在使用1.0,则建议升级,因为2.0有一些巨大的改进。

使用Visual Studio 2010的发布功能:

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

enter image description here

使用Visual Studio 2010和WebDeploy 2.0时需要注意几个问题。首先是VS2010不支持WebDeploy/MSDeploy 2.0。因此,如果您尝试发布,您会收到以下错误:

Error 1 Web deployment task failed.((04/02/2011 12:30:40) An error occurred when the request was processed on the remote computer.)

enter image description here

如果您已经开启了服务器上Web管理服务的故障请求跟踪,那么您还会在C:\inetpub\logs\wmsvc\TracingLogFiles\W3SVC1中看到以下错误:

AspNetModuleDiagErrorEvent
Uri /msdeploy.axd
eventData Tracing deployment agent exception. Request ID ''. Request Timestamp: '02/04/2011
System.UnauthorizedAccessException: 访问路径'D:\'被拒绝。

enter image description here

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

默认情况下,GUI发布机制使用错误版本的MSDeploy(1.0)。我们想要告诉VS2010使用MSDeploy 2.0。您可以通过编辑Visual Studio 2010的devenv.exe.config文件来实现这一点,该文件位于(假设您进行了默认的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编辑器(我只是使用了Visual Studio 2010本身)打开devenv.exe.config并复制以下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部分:

enter image description here

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

使用Build Package进行发布:

Visual Studio可以生成一个Build Package,可以从命令行执行。这是使用Project->Build Deployment Package生成的。非常适合持续集成等情况(该包也可以使用带有/t:Package开关的msbuild生成)。

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

不幸的是,Visual Studio 2010做错了一点,并生成了一个面向1.0版本的msdeploy包装批处理脚本,将部署目标定位到服务器而不是站点级别。

除了自己编写msdeploy.exe命令行之外,没有快速解决此问题的方法。我已将此拆分为多行,以使其更易读。

"C:\Program Files\IIS\Microsoft Web Deploy v2\\msdeploy.exe"
  -source:archiveDir='d:\sites\DemoApp\obj\Package\Archive' 
  -dest:
       auto,
       computerName='https://yoursite.com:8172/msdeploy.axd?site=yoursitename',
       userName='demosite',
       password='somepassword',
       authtype='basic',
       includeAcls='False' 
  -verb:sync 
  -disableLink:AppPoolExtension 
  -disableLink:ContentExtension 
  -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中站点的名称完全匹配。 userNamepassword是网站委派管理器用户的名称。这可以使用站点级别的"IIS管理器权限"功能进行配置。该帐户需要是本地Windows用户帐户。 -authtype='basic' - 这强制执行基本身份验证,否则会尝试使用NTLM身份验证。 -allowuntrusted - 如果使用内置自签名SSL证书,则忽略任何SSL证书错误。
如果使用该命令行,则应能够成功部署到远程IIS7服务器。
发布原始内容:
有时我们只想直接从本地文件夹发布一些静态内容(或甚至是Classic ASP或PHP站点)。我们可以使用以下msdeploy.exe命令行来实现:
"C:\Program Files\IIS\Microsoft Web Deploy v2\\msdeploy.exe" 
  -source:contentPath='d:\websites\mysite' 
  -dest:
     contentPath='yoursitename',
     computerName='https://yoursite.com:8172/msdeploy.axd?site=yoursitename',
     userName='demosite',
     password='somepassword',
     authtype='basic',
     includeAcls='False' 
-verb:sync 
-allowuntrusted 

再次强调-dest:contentPathcomputerName的规则。

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

Visual Studio 2010的最后一点注意事项:

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

可以通过在每个<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">下添加以下设置来解决此问题:

<IncludeSetAclProviderOnDestination>False</IncludeSetAclProviderOnDestination>

或者如果你正在使用msbuild:

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

我从这里找到了有用的信息:

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


这是一篇很棒的文章,Kev - 这里有非常有用的信息。然而对于我的问题,除非我使用计算机管理员帐户(在下面我自己的答案中解释),否则我仍然会看到401身份验证错误。 - Matt Roberts
1
msdeploy.axd?site=yoursitename 对我来说解决了这个问题。如果我省略了 site 参数,就会得到 401 错误。谢谢。 - Jack Ukleja
谢谢你的精彩回答。?site=...就是我刚刚花了三个小时的地方! :) - Ragesh

6

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

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

我的.deploy.cmd存在以下问题:

  • 我的IIS用户只有该站点的权限,因此我需要在computerName中添加?site=<SITENAME>
  • 我需要在-dest:参数中添加AuthType='Basic'

1
感谢您提出<UseMsdeployExe>属性的建议。 - Robert Greathouse

3
我们曾遇到和你们类似的问题。
解决方法是在服务中启动远程代理服务。由于使用IP地址会出现错误,所以我们使用了PC名称。因此,请尝试使用PC名称、用户名和密码。

1
最终,我没有搞清楚我的部署用户帐户缺少哪些权限,但发现如果使用机器管理员帐户,则部署将成功。目前我正在使用管理员帐户进行部署。
感谢Kev提供了关于设置ms deploy 2的精彩和信息丰富的摘要 :)

0

就我个人而言,发布功能一直在正常工作,但有一天我也遇到了同样的问题(401未授权错误)。重新启动VS2012解决了这个问题。真希望在尝试其他所有解决方案之前就尝试过这个方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接