MSBuild可以使用集成身份验证进行部署还是仅基本部署

时间:2010-11-17 23:45:16

标签: msbuild msdeploy

我正在将一个Web应用程序包从MSBuild命令行部署到IIS6上的MSDepSvc,使用基本身份验证可以正常使用以下命令:

MSBuild.exe Web.csproj
  /p:Configuration=Debug
  /p:DeployOnBuild=True
  /p:DeployTarget=MSDeployPublish
  /p:MsDeployServiceUrl=http://[server name]/MsDeployAgentService
  /p:DeployIisAppPath=DeploymentTestProject
  /p:MSDeployPublishMethod=RemoteAgent
  /p:CreatePackageOnPublish=True
  /p:username=***
  /p:password=***

但是,我真正想做的是删除用户名和密码参数,然后以当前用户的身份回退到集成的身份验证。此命令将进入构建服务器,我不希望具有对目标环境(MsDepSvc所需)的管理员权限的帐户的纯文本凭据可见。我无法找到有关如何执行此操作的任何文档,并且当我尝试发布时,删除凭据会返回401。

让我特别沮丧的是,我可以愉快地在带有集成身份验证的软件包中运行deploy命令(只是不包含凭据),我似乎无法从MSBuild命令行运行它。我正在尝试封装包并将进程部署到单个命令中而不编辑构建文件,这是目前唯一的方法。

有任何想法吗?

修改 在与Sayed讨论并深入了解命令行输出之后,在执行上面的MSBuild命令(没有用户名和密码参数)之后,正在调用以下MSDeploy命令:

msdeploy.exe
  -source:package='[project path]\Web\obj\Debug\Package\Web.zip' 
  -dest:auto,ComputerName='http://[server]/MsDeployAgentService',UserName='***',IncludeAcls='False',AuthType='NTLM'
  -verb:sync
  -disableLink:AppPoolExtension
  -disableLink:ContentExtension
  -disableLink:CertificateExtension
  -retryAttempts=2

您可以看到正在设置UserName属性,该值是当前登录用户的用户名。如果我把它拿出并直接运行上面的命令,那么部署就可以了。

因此,在此基础上,为什么原始MSBuild命令在调用MSDeploy时插入UserName属性?这似乎是现在唯一的障碍。

5 个答案:

答案 0 :(得分:29)

答案是......

在我上面编辑了关于当前身份的用户名持久保存到MSDeploy命令,即使未在原始MSBuild调用中传递,我尝试重建参数以传递空用户名,如下所示:

MSBuild.exe Web.csproj
  /p:Configuration=Debug
  /p:DeployOnBuild=True
  /p:DeployTarget=MSDeployPublish
  /p:MsDeployServiceUrl=http://[server name]/MsDeployAgentService
  /p:DeployIisAppPath=DeploymentTestProject
  /p:MSDeployPublishMethod=RemoteAgent
  /p:CreatePackageOnPublish=True
  /p:username=

然后生成以下MSDeploy命令:

msdeploy.exe 
  -source:package='[project path]\obj\Debug\Package\Web.zip' 
  -dest:auto,ComputerName='http://[server name]/MsDeployAgentService',IncludeAcls='False',AuthType='NTLM' 
  -verb:sync 
  -disableLink:AppPoolExtension 
  -disableLink:ContentExtension 
  -disableLink:CertificateExtension 
  -retryAttempts=2

此调用不再包含UserName属性。所以简而言之,如果你没有为MSBuild调用添加一个用户名参数,它将会插入当前的身份并推迟到基本身份验证,因为没有密码会失败。如果包含username参数但不为其赋值,则在MSDeploy命令中根本不包含它。

答案 1 :(得分:3)

我查看了Microsoft.Web.Publishing.targets并看到了这个:

<PropertyGroup>
  <NormalizePublishSettings ...>
  <AuthType Condition="'$(AuthType)'==''" >Basic</AuthType>
  <!--Supported value for $(MSDeployPublishMethod): WMSVC, RemoteAgent, InProc-->
  <MSDeployPublishMethod ... >WMSVC</MSDeployPublishMethod>
  ...
</PropertyGroup>

因此,从MSBuild运行时看起来默认为Basic身份验证。然后我发现了这个http://technet.microsoft.com/de-de/library/dd569001(WS.10).aspx

  

authenticationType指定   要使用的身份验证类型。该   可能的值是NTLM和Basic。如果   wmsvc提供程序设置是   指定,默认身份验证   type是Basic;否则,默认   身份验证类型是NTLM。

我还没有尝试过,但也许就像/p:AuthType=NTLM

答案 2 :(得分:0)

我能够让NTLM按照以下方式工作:服务在[服务器名称]上具有admin privs的帐户下运行。

“C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ msbuild.exe”app \ Test.Web \ Test.Web.csproj / T:Clean / T:Package / P:Configuration = Release

C:\ hudson \ jobs \ Test \ workspace \ app \ Test.Web \ obj \ Release \ Package \ Test.Web.deploy.cmd / Y“/ M:http:// [server name] / MSDEPLOYAGENTSERVICE” / A:ntlm -allowUntrusted

生成:

“C:\ Program Files \ IIS \ Microsoft Web Deploy \ msdeploy.exe”-source:package ='C:\ hudson \ jobs \ Test \ workspace \ app \ Test.Web \ obj \ Release \ Package \ Test .Web.zip'-ads:auto,computerName ='http:// [服务器名称] / MSDEPLOYAGENTSERVICE',authtype ='ntlm',includeAcls ='False'-verb:sync -disableLink:AppPoolExtension -disableLink:ContentExtension -disableLink :CertificateExtension -setParamFile:“C:\ hudson \ jobs \ Test \ workspace \ app \ Test.Web \ obj \ Release \ Package \ RapidPrototypeRequestSystem.Web.SetParameters.xml”-allowUntrusted

答案 3 :(得分:0)

将流程分为2个步骤对我有用-

  1. 构建和打包

    msbuild.exe / p:DeployOnBuild = True / p:WebPublishMethod = Package / p:PackageAsASingleFile = true / p:AllowUntrustedCertificate = True / p:CreatePackageOnPublish = True / p:SkipExtraFilesOnServer = True / p:PublishProfile = DevProfile / p :Configuration = dev

  2. 部署

    msdeploy.exe -source:package ='C:\ packagelocation \ dev.zip'-dest:auto,ComputerName ='http://destinationserver/MsDeployAgentService',IncludeAcls ='False',AuthType ='NTLM'-verb: sync -disableLink:AppPoolExtension -disableLink:ContentExtension -disableLink:CertificateExtension -retryAttempts = 2

答案 4 :(得分:-1)

这很有用,我最初被目标文件分心,但意识到我的错误是在连接字符串中,即尝试使用https而不是http。

MSBuild.exe Web.csproj / p:Configuration = Debug / p:DeployOnBuild = True / p:DeployTarget = MSDeployPublish / p:MsDeployServiceUrl = http:// [serverName] / MsDeployAgentService / p:DeployIisAppPath = DeploymentTestProject / p: MSDeployPublishMethod = RemoteAgent / p:CreatePackageOnPublish = True / p:username =