背景/目标
运动部件:
- 我有一个服务帐户,我们称之为
MyDomain\svcMyService
。 - 我有一个远程服务器,我们称之为
MyDomain\MyServer
。 - 我有一个 Jenkins 服务器,我们称之为
MyDomain\MyJenkins
.
在 Jenkins 中,我有一个部署任务。它抓取一些工件,然后调用msdeploy
以将它们推送到 MyServer。
此部署步骤失败,我想弄清楚原因。
我正在使用的 MSDeploy 命令
该命令由 Jenkins 自动生成,最终结果如下(省略敏感数据):
"C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" -verb:sync -source:iisApp="E:\Jenkins\jobs\NotARealJobName\workspace" -dest:iisApp="MyWebSite/MyWebApp",ComputerName="https://MyServer:8172/MsDeploy.axd",UserName=MyDomain\svcMyService,Password="NotARealPassword" -allowUntrusted
错误
我从 msdeploy 输出看到的错误消息是:
错误代码:ERROR_USER_UNAUTHORIZED 更多信息:使用 Web 管理服务连接到远程计算机(“MyServer”),但无法授权。确保您使用正确的用户名和密码,您要连接的站点存在,并且凭据代表有权访问该站点的用户。了解更多信息:http: //go.microsoft.com/fwlink/ ?LinkId=221672#ERROR_USER_UNAUTHORIZED 。
错误:远程服务器返回错误:(401)未经授权。
我对我必须做什么的理解
这可能是一个不完整或不正确的列表。请告诉我这是否是问题所在。
我想我必须:
- 在 IIS 上安装 WebDeploy(在这种情况下是最新的 3.6)。
- 在 IIS 中启用管理服务。
- 创建一个以
MyDomain\svcMyService
. - 是的,部署的同一个用户名也在运行它。不是最好的,我知道。此刻不在我的手中。
- 为我的 IIS Web 应用程序创建目录。
- 授予对此目录的权限。
- 完全权限
svcMyService
- 完全权限
WDeployAdmin
- 完全权限
NetworkService
(因为这就是 WMSvc 的运行方式)
- 完全权限
- 使用适当的端口创建网站
- 网站应该在服务账户的应用程序池下运行
- 该网站应使用该
svcMyService
帐户连接到该文件夹。
- 在网站下创建一个 Web 应用程序。
- 该网站应使用该
svcMyService
帐户连接到该文件夹。 - 将
svcMyService
帐户添加为站点和应用程序级别的部署管理器。
- 该网站应使用该
- 确保本地
WDeployConfigWriter
和WDeployAdmin
帐户未过期,并且其密码无法更改。 - 如果您更改了这些本地帐户的密码,请确保 IIS 管理委派正在使用帐户并为每个委派更新这些凭据
WDeployConfigWriter
。WDeployAdmin
到目前为止的故障排除
我会在尝试排除故障时更新此列表。
检查 WMSvc IIS 日志 - 看起来我的用户没有发布权限
- 日志示例如下:
#Fields
: date time s-ip cs-method cs-uri-stem c-uri-query s-port cs-username c-ip cs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status time -采取 2015-09-14 17:10:06 [服务器 IP] HEAD /MsDeploy.axd - 8172 - [Jenkins IP] - - 401 2 5 15
我看到所有状态都是 401.2,win32 代码为 5。
根据此故障排除链接,“如果用户已通过身份验证,但没有发布所需的权限,则日志条目将如下所示”(401 2 5
)。
我在 2011 年的这个旧论坛帖子上找到了答案——看起来真的很模糊。
在该论坛帖子中找到的解决方案是:
HKEY_LOCAL_MACHINE\Software\Microsoft\WebManagement\Server
WindowsAuthenticationEnabled
,其值为1
执行这些步骤后,它似乎第一次对我有用。