我正在将一个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属性?这似乎是现在唯一的障碍。
答案 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个步骤对我有用-
构建和打包
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
部署
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 =