为什么我通过Chef以管理员身份获得运行Octopus Tentacle的UnauthorizedAccessException?

时间:2013-09-19 13:52:05

标签: powershell chef windows-server-2012 octopus-deploy winrm

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

我的工作站(Chef客户端)正在运行Windows 7 x64 SP1。该服务器托管在VMware Workstation中,并运行Windows 2012 Server x64 RTM。它是从一个sysprepped基线图像启动的,所有内容都很好用,直到Chef配方尝试创建一个新的Octopus证书。

章鱼.rb厨师食谱包裹了一大块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文件时,它说管理员)所以我不确定八达通的文件/文件夹/资源是什么触手正试图进入。

运行以引导节点的实际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 vs Win2012) - 但是这里的调用链是cmd.exe - > Ruby - > WinRM - > Ruby - > Powershell我对如何补救甚至验证这样的问题感到有点迷失......

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

仍然不太确定为什么会发生这种情况,但是通过让mixlib-shellout做一个假的 - “运行”来解决它似乎运作良好。请注意,这仍然是完全相同的用户,但不知何故在Windows上,您可以以用户身份登录,而无需实际以用户身份完全登录....

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

答案 2 :(得分:1)

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