2

我正在使用 Chef 配置 Windows 2012 Server (RTM),包括安装 Octopus Tentacle 服务,这样我就可以使用 Octopus Deploy 将软件部署到该实例上。

我的工作站(Chef 客户端)运行的是 Windows 7 x64 SP1。该服务器托管在 VMware Workstation 中,并运行 Windows 2012 Server x64 RTM。它是从 sysprep 的基线映像启动的,并且在 Chef recipe 尝试创建新的 Octopus 证书之前,一切都运行良好。

octopus.rb Chef 配方包装了一大块 Powershell,实际安装 Octopus Tentacle 的部分如下所示:

$wc = New-Object System.Net.WebClient
$wc.DownloadFile("#{source_path_tanticle}", "#{install_path_tanticle}")
Start-Process -FilePath msiexec -ArgumentList /i, "#{install_path_tanticle}", /quiet -Wait  | out-file -filepath C:\\Octopus.log -append
netsh advfirewall firewall add rule name="Octopus" dir=in action=allow protocol=TCP localport=#{tanticle_port}  | out-file -filepath C:\\Octopus.log -append

cd "C:\\Program Files (x86)\\Octopus Tentacle\\Agent"
.\\tentacle.exe configure --appdir="C:\\Applications" --port=#{tanticle_port} --trust="#{octopus_server_Thumbprint}" | out-file -filepath C:\\Octopus.log -append
.\\tentacle.exe new-certificate | out-file -filepath C:\\Octopus.log -append
.\\tentacle.exe register-with --server=$octopusServer --publicHostname=$publicDnsName --environment=$environment --role=web --apikey=$octopusServerApiKey | out-file -filepath C:\\Octopus.log -append

当这个脚本调用tentacle.exe new-certificate它时,它会抛出一个UnauthorizedAccessException

Generating and installing a new cetificate...
System.UnauthorizedAccessException: Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
   at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo)
   at Octopus.Shared.Security.CertificateGenerator.Generate(String fullName, Boolean exportable) in c:\w\e6923628be6eaf72\source\Octopus.Shared\Security\CertificateGenerator.cs:line 25
   at Octopus.Tentacle.Commands.NewCertificateCommand.Execute() in c:\w\e6923628be6eaf72\source\Octopus.Tentacle\Commands\NewCertificateCommand.cs:line 31
   at Octopus.Shared.Startup.CommandProcessor.Process(String[] args) in c:\w\e6923628be6eaf72\source\Octopus.Shared\Startup\CommandProcessor.cs:line 40

Chef 客户端服务以管理员身份运行(至少,当我将 $env:username 转储到安装期间创建的 octopus.log 文件中时,它显示为管理员)所以我不确定 Octopus 触手正在尝试什么文件/文件夹/资源访问。

正在运行以引导节点的实际 Chef 命令是:

 knife bootstrap windows winrm 192.168.202.137 -x Administrator -P p@ssw0rd -r 'role[web_server]'

其中 192.168.202.137 是新启动的 Win2012 服务器的 IP 地址,p@ssw0rd 是该服务器上的本地管理员密码。

以管理员身份登录时在服务器上手动运行相同的命令可以完美运行,因此这与 chef/winrm/powershell 远程处理有关。

一种理论是,我遇到了某种 DCOM/WinRM 安全边缘案例,因为我在客户端和服务器上运行不同的操作系统(Win7 x64 与 Win2012) - 但考虑到这里的调用链是 cmd.exe -> Ruby - > WinRM -> Ruby -> Powershell 我对如何补救甚至验证这样的问题有点迷茫......

4

3 回答 3

2

当您通过 WinRM 调用 PowerShell 时,是否有可能没有加载管理员用户的配置文件?您可以强制加载用户配置文件吗?

于 2013-09-19T23:11:20.790 回答
2

仍然不太清楚为什么会发生这种情况,但是通过让mixlib-shellout执行伪“运行方式”来解决它似乎效果很好。请注意,这仍然是完全相同的用户,但不知何故,在 Windows 上,您似乎可以以用户身份登录,而无需实际以用户身份完全登录......

理论上,start-process应该能够做同样的事情(不需要用户的密码),但是让它可靠地运行是一个痛苦的世界,所以目前我们坚持使用 mixlib-shellout。

于 2013-09-30T15:02:28.213 回答
1

如果是权限问题,请尝试使用 MMC 的站点和服务管理单元向所有人授予读取和注册写入访问权限。您可以通过展开以下项目在安全选项卡上设置访问权限:服务、公钥服务、证书模板。请注意,必须在“查看”菜单上选中“显示服务节点”复选框才能看到“服务”选项卡。

于 2013-09-20T08:45:01.587 回答