msdeploy(Web部署)失败,出现401 auth问题

Mat*_*rts 38 iis visual-studio-2010 msdeploy msdeployserviceagent webdeploy

我正在尝试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
Run Code Online (Sandbox Code Playgroud)

而错误:

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.
Run Code Online (Sandbox Code Playgroud)

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

我检查过:

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

Kev*_*Kev 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管理服务的失败请求跟踪中看到以下错误:

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

devenv.exe.config在您喜欢的XML编辑器中打开(我只使用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>
Run Code Online (Sandbox Code Playgroud)

将其添加到以下/configuration/runtime/assemblyBinding部分:

在此输入图像描述

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

使用构建包发布:

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

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

不幸的是,Visual Studio 2010有点错误并生成一个msdeploy包装器批处理脚本,目标是1.0并在服务器而不是站点级别进行目标部署.

除了制作自己的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中的站点名称完全匹配.

userName并且password是该站点的委派经理用户的名称.这是使用站点级别的"IIS管理器权限"功能进行配置的.该帐户必须是本地Windows用户帐户.

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

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

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

发布原始内容:

有时我们想直接从本地文件夹发布一些静态内容(或者甚至是经典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中得到解决(我还没有机会查看).

一个最终的VS2010问题:

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

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

<IncludeSetAclProviderOnDestination>False</IncludeSetAclProviderOnDestination>
Run Code Online (Sandbox Code Playgroud)

或者如果你正在使用msbuild:

msbuild.exe myproject.csproj /t:Package /p:IncludeSetAclProviderOnDestination=False
Run Code Online (Sandbox Code Playgroud)

我从这里发现了有用的金块:

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


Ben*_*nor 6

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

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

我的问题.deploy.cmd是:

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