【问题标题】:DSC Script Resource's TestScript failing to return booleanDSC 脚本资源的 TestScript 未能返回布尔值
【发布时间】:2017-05-28 01:18:07
【问题描述】:

尝试推送 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 之前是否运行过任何 PowerShell?如果是这样,如果 PowerShell 有自己的输出,它可能会损坏您的输出。见How to return one and only one value from a PowerShell function?
  • 您的整个脚本资源可能有助于理解这个概念。
  • TestScript 就是单行代码,这也是为什么它如此令人困惑以至于它没有得到布尔结果的部分原因。在我测试将结果转换为布尔值时,我将用整个事情编辑问题。
  • credential 未使用。您正在运行哪个版本的 PowerShell?您可以通过运行$PSVersionTable 找到它
  • 4.0.那么 Credential 作为参数存在,但没有为 Script 资源实现?

标签: powershell powershell-4.0 dsc


【解决方案1】:

试试这个

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

【讨论】:

    【解决方案2】:

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

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

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

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

    我的解决方案是为 subversion checkout 编写一个模块/资源。不仅仅是为了解决这个问题,还因为我上面使用的 subversion powershell 模块没有提供将凭据传递给 svn 二进制文件的方法。

    【讨论】:

    • 我对 $credential 参数的评论是关于他的样本的,而不是一般的。你把我的评论断章取义了。
    • 即使您提供了一些额外的上下文,您的评论仍然没有意义。请参阅我对您的回答的回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    相关资源
    最近更新 更多