Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can MSBuild deploy using integrated authentication or only basic?

I'm deploying a web app package from the MSBuild command line to MSDepSvc on IIS6 which is working fine with the following command using basic authentication:

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=*** 

However, what I'd really like to do is drop the username and password parameters and fall back to integrated auth under the identity of the current user. This command is going into a build server and I'd prefer not to have the plain text credentials of an account with admin rights on the target environment (required for MsDepSvc) visible. I can't locate any documentation on how to do this and dropping off the credentials returns 401 unauthorised when I attempt to publish.

What makes it particularly frustrating is that I can happily run the deploy command in the package with integrated auth (just don't include credentials), I just can't seem to run it from the MSBuild command line. I'm trying to encapsulate the package and deploy processes into a single command without editing build files and this is the only thing in the way at present.

Any ideas out there?

Edit After some discussions with Sayed and looking a bit deeper into the command line output, after executing the MSBuild command above (without username and password parameters), the following MSDeploy command is being invoked:

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 

You can see the UserName attribute is being set and the value is the username of the current logged on user. If I take this out and run the above command directly, the deployment goes through just fine.

So on that basis, why is the original MSBuild command inserting a UserName attribute when it calls MSDeploy? This appears to be the only barrier now.

like image 595
Troy Hunt Avatar asked Nov 17 '10 23:11

Troy Hunt


People also ask

How to do MSBuild in command prompt?

To run MSBuild at a command prompt, pass a project file to MSBuild.exe, together with the appropriate command-line options. Command-line options let you set properties, execute specific targets, and set other options that control the build process.

What does MSBuild do?

Overview. MSBuild is a build tool that helps automate the process of creating a software product, including compiling the source code, packaging, testing, deployment and creating documentations. With MSBuild, it is possible to build Visual Studio projects and solutions without the Visual Studio IDE installed.


2 Answers

And the answer is...

Following my edit above about the current identity's username persisting to the MSDeploy command even when not passed in the original MSBuild call, I tried reconstructing the parameters to pass an empty username as follows:

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= 

Which then generates the following MSDeploy command:

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 

This call no longer includes the UserName attribute. So in short, if you do not add a username parameter to the MSBuild call it will insert the current identity anyway and defer to basic auth which will fail because there's no password. If you include the username parameter but don't give it a value, it doesn't include it at all in the MSDeploy command.

like image 142
Troy Hunt Avatar answered Oct 23 '22 18:10

Troy Hunt


I looked in the Microsoft.Web.Publishing.targets and saw this:

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

So, it looks like the default is Basic authentication when running from MSBuild. Then I found this http://technet.microsoft.com/de-de/library/dd569001(WS.10).aspx

authenticationType specifies the type of authentication to be used. The possible values are NTLM and Basic. If the wmsvc provider setting is specified, the default authentication type is Basic; otherwise, the default authentication type is NTLM.

I haven't tried it yet, but maybe it's something like /p:AuthType=NTLM

like image 33
Mike Valenty Avatar answered Oct 23 '22 19:10

Mike Valenty