使用模拟用户

时间:2017-03-15 01:43:30

标签: windows powershell chef test-kitchen

我正在尝试以编程方式加密文件夹(使用Windows EFS)。以下的PowerShell代码在通过ISE powershell控制台运行时效果很好。

$obj = New-Object -TypeName System.IO.FileInfo 'D:\Temp'      
$obj.Encrypt()

然而,通过带有测试厨房的厨师食谱在模拟用户下运行此操作会产生以下错误

powershell的配方包装器:

ruby_block 'Enable encryption on folder' do
  block do
 command = <<-EOH
   # Encrypt the folder
   $obj = New-Object -TypeName System.IO.FileInfo 'D:\\Temp'      
   $obj.Encrypt()
   EOH
   powershell_out!(command, { user: username, password: pwd,
                           domain: domain})
  end
end

以下堆栈跟踪结果:

PSMessageDetails      : 
Exception             : System.Management.Automation.MethodInvocationException:
                     Exception calling "Encrypt" with "0" argument(s): 
                    "The parameter is incorrect.
                    " ---> System.IO.IOException: The parameter is 
                    incorrect.

                       at System.IO.__Error.WinIOError(Int32 errorCode, 
                    String maybeFullPath)
                       at System.IO.File.Encrypt(String path)
                       at CallSite.Target(Closure , CallSite , Object )
                       --- End of inner exception stack trace ---
                       at System.Management.Automation.ExceptionHandlingOps
                    .CheckActionPreference(FunctionContext funcContext, 
                    Exception exception)
                       at System.Management.Automation.Interpreter.ActionCa
                    llInstruction`2.Run(InterpretedFrame frame)
                       at System.Management.Automation.Interpreter.EnterTry
                    CatchFinallyInstruction.Run(InterpretedFrame frame)
                       at System.Management.Automation.Interpreter.EnterTry
                    CatchFinallyInstruction.Run(InterpretedFrame frame)
TargetObject          : 
CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
FullyQualifiedErrorId : IOException
ErrorDetails          : 
InvocationInfo        : System.Management.Automation.InvocationInfo
ScriptStackTrace      : at <ScriptBlock>, <No file>: line 5
PipelineIterationInfo : {}

注意:被模拟的用户是Administrators组的一部分,并且对D:\ Temp具有完全控制权。另一个关键的观察是,如果我在通过测试厨房运行厨师之前执行交互式登录(RDP会话),上面的配方成功没有任何问题,文件夹在本地加密就像在控制台中以交互方式运行powershell一样。

异常似乎表明System.IO.File.Encrypt的路径参数没有在某处设置/传递,但我不知道为什么这会工作一次而不是另一次。我确实尝试通过让配方针对localhost运行针对localhost的Invoke-Command来创建用户配置文件,并且它确实创建了配置文件,例如(C:\ users \ ...被创建),但是Encrypt()调用仍然出错,但具有与上面相同的异常。 这似乎不是厨师或测试厨房问题,而是在加密文件系统错综复杂的powershell / windows端错过了一些东西,非常感谢任何帮助。

谢谢

1 个答案:

答案 0 :(得分:1)

不幸的是,我不相信你可以通过远程会话加密文件。如果您要在本机Windows PowerShell远程会话上尝试相同的操作,则会得到UnauthorizedAccessException。如果您使用的是Test-Kitchen,请尝试使用Elevated winrm transport。

示例yaml:

platforms: - name: eval-win2012r2-standard os_type: windows transport: name: winrm elevated: true

这会模拟本地登录会话,并可能解决此错误。