msdeploy(Web部署)失败401authentication问题

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

我正在testing一个非常简单的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. 

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

我查过了:

  • 该服务安装正确,我开始了
  • 不使用用户名的域名部分,并添加authType = Basic的各种组合
  • 给予所有人对该文件夹的完全权限
  • 在IIS中允许远程连接
  • 为我的“msdeploy”用户的contentPath和iisApp添加了pipe理服务委派规则(松散地基于这个 )
  • 尝试用不同的pipe理员帐户,我使用的RDC到服务器…
  • 尝试了不同的contentPaths和不同的msdeploy命令
  • 创build一个特定的帐户,并将该帐户添加到IIS_Users。 将该用户添加到我的网站“IISpipe理器权限”中,并为所有提供者设置“pipe理服务委派”。

我假设你已经根据这篇文章正确configuration了WebDeploy 2.0的服务器:

configurationWeb部署(IIS.NET)

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

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

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

使用Visual Studio 2010的发布function:

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

在这里输入图像说明

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服务器上的Webpipe理服务的失败请求跟踪中,您也会看到以下错误:

AspNetModuleDiagErrorEvent
Uri /msdeploy.axd
eventData跟踪部署代理exception。 请求ID“。 请求时间戳:'02 / 04/2011
System.UnauthorizedAccessException:访问path“D:\”被拒绝。

在这里输入图像说明

驱动器号将根据您的IIS站点位于哪个驱动器而有所不同。

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

对于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部分:

在这里输入图像说明

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

使用构build包发布:

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

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

不幸的是,Visual Studio 2010得到这个有点错误,并生成一个msdeploy包装批处理脚本目标1.0和定位在服务器部署而不是站点级别。

除了制作自己的msdeploy.exe命令行外,没有其他的快速修复方法。 我已经把它分成了几行,以使它更具可读性。

 “C:\ Program Files \ IIS \ Microsoft Web Deploy v2 \\ msdeploy.exe”
   -source:archiveDir = 'd:\网站\ DemoApp \ OBJ \包\存档' 
   -dest:
       汽车,
       计算机名=的 'https://yoursite.com:8172 / msdeploy.axd网站= yoursitename',
       用户名= 'demosite',
       口令= 'somepassword',
       的authType = '基本',
        includeAcls = '假' 
   -verb:同步 
   -disableLink:AppPoolExtension 
   -disableLink:ContentExtension 
   -disableLink:CertificateExtension 
   -setParamFile: “d:\网站\ DemoApp \ OBJ \包\ Archive.SetParameters.xml”   
   -allowuntrusted

首先要注意的是msdeploy.exe的path。 Visual Studio生成1.0版的path。 我已经改变了这个使用2.0。

值得注意的参数:

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

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

userNamepassword是该网站的委派pipe理员用户的名称。 这是使用站点级别的“IISpipe理器权限”functionconfiguration的。 该帐户需要是本地Windows用户帐户。

-authtype='basic' – 这将强制进行基本身份validation,否则尝试执行NTLM身份validation。

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

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

发布原始内容:

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

 “C:\ Program Files \ IIS \ Microsoft Web Deploy v2 \\ msdeploy.exe” 
   -source:的contentPath = 'd:\网站\ mysite的' 
   -dest:
     的contentPath = 'yoursitename',
     计算机名=的 'https://yoursite.com:8172 / msdeploy.axd网站= yoursitename',
     用户名= 'demosite',
     口令= 'somepassword',
     的authType = '基本',
      includeAcls = '假' 
 -verb:同步 
 -allowuntrusted 

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

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

一个最终VS2010难题:

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

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

 <IncludeSetAclProviderOnDestination>False</IncludeSetAclProviderOnDestination> 

或者如果你使用msbuild:

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

我发现这里有用的金块:

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

对我来说,发布工作在Visual Studio中,但是在运行.deploy.cmd脚本.deploy.cmd

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

我的.deploy.cmd的问题是:

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

我们遇到了和你一样的类似问题。

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

最后,我从来没有做过我的部署用户帐户缺less什么权限 – 但发现如果我使用机器pipe理员帐户,部署将成功。 现在我正在使用pipe理员帐户进行部署。

荣誉Kev的神奇和翔实的总结设置MS部署2 🙂

物有所值。 出版为我工作,然后有一天,我有这个相同的问题(401未经授权的错误)重新启动VS2012解决了这个问题。 希望我已经尝试了所有其他解决scheme之前尝试。