Powershell 为什么我要通过Chef以管理员的身份运行Octopus Attracle时出现未经授权的访问异常?

Powershell 为什么我要通过Chef以管理员的身份运行Octopus Attracle时出现未经授权的访问异常?,powershell,chef-infra,windows-server-2012,octopus-deploy,winrm,Powershell,Chef Infra,Windows Server 2012,Octopus Deploy,Winrm,我正在使用Chef来配置Windows 2012服务器(RTM),包括安装Octopus触手服务,这样我就可以使用Octopus deploy将软件部署到这个实例上 我的工作站(Chef客户端)正在运行Windows 7 x64 SP1。该服务器托管在VMware Workstation中,运行的是Windows 2012 server x64 RTM。它是从一个sysprepped的基线映像启动的,在厨师尝试创建一个新的八达通证书之前,一切都非常顺利 octopus.rb厨师配方包装了一大块P

我正在使用Chef来配置Windows 2012服务器(RTM),包括安装Octopus触手服务,这样我就可以使用Octopus deploy将软件部署到这个实例上

我的工作站(Chef客户端)正在运行Windows 7 x64 SP1。该服务器托管在VMware Workstation中,运行的是Windows 2012 server x64 RTM。它是从一个sysprepped的基线映像启动的,在厨师尝试创建一个新的八达通证书之前,一切都非常顺利

octopus.rb厨师配方包装了一大块Powershell,实际安装octopus触手的部分如下所示:

$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
当此脚本调用
attracle.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文件中时,它会显示为Administrator),因此我不确定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 vs Win2012)-但鉴于这里的调用链是cmd.exe->Ruby->WinRM->Ruby->Powershell,我有点不知道如何补救,甚至验证,这样的问题…

在WinRM上调用PowerShell时,是否可能未加载管理员用户的配置文件?您可以强制加载用户配置文件吗?

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

仍然不太清楚为什么会出现这种情况,但通过开始执行psuedo来解决这个问题-“运行方式”似乎很好。请注意,这仍然是完全相同的用户,但在Windows上,您似乎可以以用户身份登录,而不必以用户身份完全登录


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

这似乎是您需要做的。最后我用“跑步方式”来解决这个问题。从理论上讲,这在start process/process.start中也是可行的,但在Powershell和Chef中,这将是一个痛苦的世界