TFS 2017发布阶段能否从TFS服务器而非代理运行PowerShell脚本?
可以从TFS 2017服务器本身运行PowerShell脚本,这确实能解决你遇到的WinRM信任问题
你的问题核心是Docker容器里的代理未加入域,导致WinRM无法通过Kerberos认证访问目标Web服务器——而如果让脚本直接在加入域的TFS服务器本身运行,就能利用域内的Kerberos认证机制,避开TrustedHosts或者HTTPS的限制,顺利执行停止应用池的操作。
下面是具体的实现方案和步骤:
1. 先在TFS服务器上部署本地代理
TFS的脚本任务必须通过代理执行,所以你需要在TFS服务器本机安装一个构建/发布代理:
- 打开TFS的管理界面,进入“代理池”管理页面
- 按照指引下载代理安装包,在TFS服务器本地安装,配置时选择用域账号运行代理服务(或者使用TFS服务器的本地账号,但该账号需要有访问目标Web服务器的域权限)
- 安装完成后,这个代理会被归属到某个代理池(比如你可以新建一个名为
TFSServerLocal的池)
2. 在发布管道中指定该代理运行PowerShell任务
修改你的发布管道:
- 添加一个PowerShell任务(选择“内联脚本”或者引用脚本文件都可以)
- 在任务的“代理池”选项中,选择刚才新建的包含TFS本地代理的池
- 编写你的应用池停止脚本,比如用IIS管理命令:
$targetServer = "<server>.<domain>.com" $appPoolName = "你的应用池名称" # 远程执行停止应用池命令 Invoke-Command -ComputerName $targetServer -ScriptBlock { Import-Module WebAdministration Stop-WebAppPool -Name $using:appPoolName }
或者用WMI的方式(如果你更熟悉这个):
$targetServer = "<server>.<domain>.com" $appPoolName = "你的应用池名称" $appPool = Get-WmiObject -ComputerName $targetServer ` -Namespace root\WebAdministration ` -Class ApplicationPool ` -Filter "Name='$appPoolName'" $appPool.Stop()
3. 权限注意事项
- 确保TFS服务器上的代理运行账号,拥有目标Web服务器的IIS管理权限(比如加入目标服务器的IIS Administrators组,或者有特定的WMI/WinRM访问权限)
- 因为TFS服务器在域内,访问同域的Web服务器时,Kerberos认证会自动生效,不需要额外配置WinRM的TrustedHosts,也不会出现你遇到的“ServerNotTrusted”错误
备选方案(如果你不想在TFS服务器装代理)
当然,如果你暂时不想部署本地代理,也可以给Docker里的Windows代理配置TrustedHosts:
在Docker容器内执行命令:
winrm set winrm/config/client '@{TrustedHosts="<server>.<domain>.com"}'
但这个方案需要维护容器的配置,而且TrustedHosts会降低安全性,所以从TFS服务器运行脚本是更稳妥的长期解决方案。
内容的提问来源于stack exchange,提问作者Post Impatica
相关产品推荐
相关产品推荐

