Может ли MSBuild развертываться с использованием встроенной аутентификации или только базовой?
Я развертываю пакет веб-приложения из командной строки MSBuild в MSDepSvc на IIS6, который отлично работает со следующей командой, использующей обычную аутентификацию:
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. Я пытаюсь инкапсулировать пакет и развернуть процессы в одну команду, не редактируя файлы сборки, и это единственное, что мешает в настоящее время.
Есть идеи?
Edit После некоторых обсуждений с 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 вставляет атрибут UserName, когда она вызывает MSDeploy? Это, кажется, единственный барьер сейчас.
4 ответа
И ответ...
После моего редактирования выше о том, что имя пользователя текущего удостоверения сохраняется в команде 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.
Я посмотрел в Microsoft.Web.Publishing.targets и увидел это:
<PropertyGroup>
<NormalizePublishSettings ...>
<AuthType Condition="'$(AuthType)'==''" >Basic</AuthType>
<!--Supported value for $(MSDeployPublishMethod): WMSVC, RemoteAgent, InProc-->
<MSDeployPublishMethod ... >WMSVC</MSDeployPublishMethod>
...
</PropertyGroup>
Итак, похоже, что по умолчанию Basic
аутентификация при запуске из MSBuild. Затем я нашел этот http://technet.microsoft.com/de-de/library/dd569001%28WS.10%29.aspx
authenticationType указывает тип используемой аутентификации. Возможные значения: NTLM и Basic. Если указан параметр провайдера wmsvc, типом аутентификации по умолчанию является Basic; в противном случае тип аутентификации по умолчанию - NTLM.
Я еще не пробовал, но, может быть, это что-то вроде /p:AuthType=NTLM
Мне удалось заставить NTLM работать следующим образом, когда служба работает под учетной записью с правами администратора на [имя сервера].
Приложение "C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe" \Test.Web\Test.Web.csproj /T: Очистить / T: Пакет / P: Конфигурация = Выпуск
C:\hudson\jobs\Test\workspace\app\Test.Web\obj\Release\Package\Test.Web.deploy.cmd /Y "/M:http://[имя сервера]/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 '-dest: auto, computerName =' http: // [имя сервера]/MSDEPLOYAGENTSERVICE',authtype='ntlm',includeAcls='False' -verb:sync -disableLink:AppPoolExtension -disableLink:ContentExtension -disableLink:CertificateExtension - CertificateExtension - setParamFile:"C:\hudson\jobs\Test\workspace\app\Test.Web\obj\Release\Package\RapidPrototypeRequestSystem.Web.SetParameters.xml" -allowUntrusted
Для меня сработало разбиение процесса на 2 этапа -
Сборка и упаковка
msbuild.exe /p:DeployOnBuild=True /p:WebPublishMethod=Package /p:PackageAsASingleFile=true /p:AllowUntrustedCertificate=True /p:CreatePackageOnPublish=True /p:SkipExtraFilesOnServer=True /p:PubroflishProfile = p: PubroflishProfile = p: PubroflishProfile = p: разработчик
Развернуть
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
Это сработало, я изначально был отвлечен файлом целей, но понял, что моя ошибка была в строке подключения, т.е. я пытался использовать https вместо http.
MSBuild.exe Web.csproj / p: Конфигурация = Отладка /p:DeployOnBuild=True /p:DeployTarget=MSDeployPublish /p:MsDeployServiceUrl=http://[имя_сервера]/MsDeployAgentService /p:DeployIisAppPath=DepubTest: DeploymentTestDject / p: CreatePackageOnPublish = True / p: имя пользователя =