经过多次反复试验配置后,我现在能够编写脚本 msdeploy.exe,将 Visual Studio 2010 中构建的包部署到运行 IIS 7.5 的远程服务器,命令行如下:
基本身份验证命令:
msdeploy -source:package="project.zip" -dest:auto,computerName='https://webserver:8172/MsDeploy.axd',authtype='Basic',username='DOMAIN\myuser',password='xxx',includeAcls='False' -verb:sync -setParamFile:"SetParameters.xml" -allowUntrusted
我可以通过启用传递身份验证来消除在命令行中提供密码的需要吗?Web Deploy 文档提到了 authType 参数可以指定“NTLM”,而不是 Basic。但是,每当我尝试这样做时(参见下面的示例),我都会收到指示 401 的错误。WMSvc Web 日志显示 401.2,并且该日志条目中没有填充用户 ID,与之前使用 Basic 身份验证的尝试不同,Web 日志中确实显示了 DOMAIN\myuser。在客户端或服务器的事件查看器中找不到其他有用的信息。
注意:目标网络服务器位于另一个域上,因此我执行了net use \\webserver /u:DOMAIN\myuser
一个建立令牌的操作。
传递身份验证命令尝试:
msdeploy -source:package="project.zip" -dest:auto,computerName='https://webserver:8172/MsDeploy.axd',authtype='NTLM',includeAcls='False' -verb:sync -setParamFile:"SetParameters.xml" -allowUntrusted
看来 msdeploy.exe 未在 HTTP 级别正确与 IIS 进行身份验证。可能是什么问题?
客户端是 Windows XP,服务器是 Win2008R2。两者都运行 msdeploy.exe 版本 7.1.618.0。两者都安装了 .NET 2.0、3.5 和 4.0。
答案1
我猜如果客户端计算机不在同一个域中,我们就不能使用直通身份验证。如果您使用 web deploy 1.1,您可以尝试 storeCredentials 和 getCredentials 以避免直接在命令行中输入用户名和密码。
答案2
这显然是一个迟来的答案,我相信你已经解决了这个问题或者解决了它,但如果这对别人有帮助:
即使目标 Web 服务器位于另一个域中,您也可以使用 MSDeploy 通过 NTLM 身份验证部署包。以下是我们使用的命令行:
msdeploy.exe -source:package='MyPackage.csproj.zip' -dest:auto,computerName='https://www.myserver.com:8172/MsDeploy.axd?site=mysitename',authtype='NTLM',includeAcls='False' -verb:sync -disableLink:AppPoolExtension -disableLink:ContentExtension -disableLink:CertificateExtension -setParamFile:"MyPackage.csproj.SetParameters.xml"
为了实现这一点,我们在源计算机中以用户名+密码的安全上下文运行此命令,完全匹配目标域上的用户名+密码。
param 文件可能与身份验证无关,但我只是为了完整性而将其包括在内。这是我们根据应用程序的部署位置应用不同连接字符串的方法。
我们不使用“网络使用”方法来建立令牌,我不确定这是否可以通过 HTTP 轻松转换为 NTLM 身份验证。
答案3
我可能没有完全理解您的问题,但是您可以使用 -storeCredentials 和 -getCredentials 标志来完成此操作吗?
答案4
转到 IIS 站点管理页面 -> IIS -> 身份验证
启用匿名身份验证 -> 指定 IIS 来宾用户 (IUSER_computername)
授予 IIS 来宾用户对网站 wwwroot 文件夹的权限。