38 votes

MSBuild peut-il déployer en utilisant l'authentification intégrée ou seulement de base ?

Je déploie un paquet d'applications Web à partir de la ligne de commande MSBuild vers MSDepSvc sur IIS6 qui fonctionne bien avec la commande suivante en utilisant l'authentification de base :

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

Cependant, ce que j'aimerais vraiment faire, c'est supprimer les paramètres de nom d'utilisateur et de mot de passe et revenir à l'authentification intégrée sous l'identité de l'utilisateur actuel. Cette commande est destinée à un serveur de construction et je préférerais que les informations d'identification en texte clair d'un compte ayant des droits d'administrateur sur l'environnement cible (requis pour MsDepSvc) ne soient pas visibles. Je n'arrive pas à trouver de documentation sur la façon de procéder et le fait de déposer les informations d'identification renvoie 401 unauthorised lorsque je tente de publier.

Ce qui rend la situation particulièrement frustrante, c'est que je peux très bien exécuter la commande de déploiement dans le paquet avec l'authentification intégrée (il suffit de ne pas inclure les informations d'identification), mais je n'arrive pas à l'exécuter à partir de la ligne de commande MSBuild. J'essaie d'encapsuler le paquet et les processus de déploiement dans une seule commande sans modifier les fichiers de construction et c'est la seule chose qui m'en empêche actuellement.

Des idées ?

Editar Après quelques discussions avec Sayed et en regardant un peu plus profondément dans la sortie de la ligne de commande, après avoir exécuté la commande MSBuild ci-dessus (sans paramètres de nom d'utilisateur et de mot de passe), la commande MSDeploy suivante est invoquée :

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

Vous pouvez voir que l'attribut UserName est défini et que la valeur est le nom d'utilisateur de l'utilisateur actuellement connecté. Si je retire cet attribut et que j'exécute directement la commande ci-dessus, le déploiement se déroule sans problème.

Sur cette base, pourquoi la commande MSBuild originale insère-t-elle un attribut UserName lorsqu'elle appelle MSDeploy ? Cela semble être le seul obstacle maintenant.

0 votes

Si vous définissez UseMSDeployExe à true, la commande n'inclut pas AuthType=NTLM ???

0 votes

En fait, je suis confronté à ce problème lorsque je publie depuis Visual Studio vers une autre machine du même domaine. Après avoir entré les informations d'identification avec lesquelles je suis déjà connecté, la publication se passe bien et la commande MSBuild sous-jacente affiche AuthType='NTLM', mais inclut également mes informations d'identification. Je suis donc en quelque sorte revenu à la commande d'origine !

0 votes

Pour Visual Studio 2012, vous devez omettre complètement la propriété /P:UserName.

34voto

Troy Hunt Points 9745

Et la réponse est...

Suite à ma modification ci-dessus concernant le nom d'utilisateur de l'identité actuelle qui persiste dans la commande MSDeploy même s'il n'est pas passé dans l'appel MSBuild original, j'ai essayé de reconstruire les paramètres pour passer un nom d'utilisateur vide comme suit :

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=

Ce qui génère ensuite la commande MSDeploy suivante :

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

Cet appel n'inclut plus l'attribut UserName. Donc, en résumé, si vous n'ajoutez pas un paramètre username à l'appel MSBuild, il insérera l'identité actuelle de toute façon et se reportera à l'authentification de base qui échouera parce qu'il n'y a pas de mot de passe. Si vous incluez le paramètre username mais ne lui donnez pas de valeur, il ne l'inclut pas du tout dans la commande MSDeploy.

0 votes

Existe-t-il un moyen de faire en sorte que la boîte de dialogue Publish Web GUI le fasse ? Elle semble vouloir demander des informations d'identification avant même de générer la commande msdeploy.exe, ce qui fait qu'elle définit toujours AuthType sur Basic.

0 votes

Il y a un moyen très simple de résoudre ce problème Yadyn - il suffit d'appuyer sur "Entrée" sans saisir d'informations d'identification lorsque vous êtes mis au défi. Facile :)

0 votes

Hm, j'ai essayé cela, et en utilisant UseMsDeployExe=true, je peux voir qu'il laisse définitivement de côté les paramètres username/password (enfin !) mais il définit toujours AuthType à Basic. Ceci en utilisant une adresse WMSvc (MsDeploy.axd)... De plus, je dois dire que cliquer sur OK sans rien saisir n'est pas du tout intuitif.

4voto

Michael Valenty Points 5482

J'ai regardé dans les cibles Microsoft.Web.Publishing.targets et j'ai vu ceci :

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

Donc, il semble que le défaut soit Basic l'authentification lors de l'exécution à partir de MSBuild. Ensuite, j'ai trouvé ceci http://technet.microsoft.com/de-de/library/dd569001(WS.10).aspx

authenticationType spécifie le type type d'authentification à utiliser. Les valeurs possibles de valeurs possibles sont NTLM et Basic. Si le paramètre du fournisseur wmsvc est spécifié, l'authentification par défaut d'authentification par défaut est Basic ; sinon, le Sinon, le type d'authentification par défaut est NTLM.

Je ne l'ai pas encore essayé, mais peut-être que c'est quelque chose comme /p:AuthType=NTLM

0 votes

Bonne découverte, mais ce qu'elle explique ne correspond pas à ce que j'observe. La façon dont j'ai lu cette déclaration est que le déploiement contre MsDepSvc (c'est-à-dire pas WMSvc), NTLM devrait se produire par défaut. J'ai essayé le commutateur AuthType avec NTLM juste pour être sûr, mais sans succès.

0 votes

Je pensais que la cible de construction remplaçait le comportement par défaut de MSDeploy en spécifiant sa propre valeur par défaut pour AuthType. C'était juste une supposition.

1voto

Mark Points 71

J'ai réussi à faire fonctionner NTLM comme suit : le service est exécuté sous un compte avec des privilèges d'administrateur sur [nom du serveur].

" C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe "L'application \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://\[nom du serveur]/MSDEPLOYAGENTSERVICE" /A:ntlm -allowUntrusted

qui génère :

" C:\Program Fichiers \IIS\Microsoft Déploiement Web \msdeploy.exe " -source:package=' C:\hudson\jobs\Test\workspace\app\Test.Web\obj\Release\Package\Test.Web.zip ' -dest:auto,computerName='http://\[nom du serveur]/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

0voto

bmavity Points 762

Pour Visual Studio 2012, vous devez omettre complètement la propriété /P:UserName.

0voto

Jules Clements Points 1

Cela a fonctionné, j'ai d'abord été distrait par le fichier cible mais j'ai réalisé que mon erreur était dans la chaîne de connexion, c'est-à-dire que j'essayais d'utiliser https au lieu de http.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X