DSC 脚本资源的 TestScript 无法 return 布尔值

DSC Script Resource's TestScript failing to return boolean

尝试推送 DSC 我遇到了以下错误:

Failure to get a valid result from the execution of TestScript. The Test script should return True or False.

这是测试脚本:

return (Test-Path -Path "FullPath:\To\File")

我试过的几件事:

  1. 脚本资源具有在 Credential 参数中指定的(非托管)服务帐户的凭据。考虑到它可能没有目录权限,导致 Test-Path 出错,我以目标机器上的用户身份启动了 powershell 并 运行 cmdlet。它返回 False(如预期的那样)。从那以后,我已经确保配置无论如何都会为该文件夹提供帐户权限。
  2. 考虑到返回 cmdlet 可能有些奇怪的特质,我尝试将 cmdlet 分配给一个变量并返回它。没有骰子。

如有任何想法,我们将不胜感激。

编辑:这是完整的资源,供好奇的人使用。基本上只需几行代码即可将脚本从源代码控制中拉出并将其放置在本地,这样我就可以为 运行 所述脚本创建计划任务。将结果转换为 bool 无效(同样的错误)。我想知道此时它是否甚至进入了 TestScript ......检查 get-executionpolicy 显示它对于帐户未定义但在 userpolicy、machinepolicy 和 localmachine 级别它们都被绕过。

Script NameOfScript {
    DependsOn = "[cNtfsPermissionEntry]DirectoryPermissions"
    Credential = $serviceAccountPSCredentialObject
    SetScript = {
        Import-Module -Name Subversion
        New-SvnWorkingCopy -Url "https://svnrepourl/script.ps1" -Path "E:\Scripts\"
    }
    TestScript = {
        [bool]$result
        $result = Test-Path -Path "E:\Scripts\script.ps1" -ErrorAction Stop
        return $result
    }
    GetScript = { }
}

试试这个

return ([bool]$testPath = Test-Path -Path "FullPath:\To\File")

this forum post 的帮助下解决了这个问题。最初我认为这不会有太大帮助,因为我不应该遇到 double-hop 问题,但我将在下面解释为什么它是密切相关的。 @TravisEz13 评论说没有使用 Credential 参数,但这是不正确的。

如果您查看脚本资源,当您指定凭证时,这就是 运行 脚本块的方式:

$scriptExecutionResult = Invoke-Command -ScriptBlock $ScriptBlock -ComputerName . -Credential $Credential

有问题的服务帐户没有远程访问计算机的权限。因此,当我以该用户身份在本地启动 powershell 并 运行 Test-Path cmdlet 时,它可以工作,但是当我尝试 运行 上述 Invoke-Command 使用该帐户的信用时,它 returns 访问被拒绝错误。

我的解决方案是编写一个 module/resource 用于颠覆检查。不仅仅是为了解决这个问题,还因为我在上面使用的颠覆 powershell 模块没有提供将凭据传递给 svn 二进制文件的方法。