使用 PowerShell DSC 安装 exe returns 仅当 运行 通过 LCM 时退出代码

Installing an exe with PowerShell DSC returns exit code only when run through LCM

我正在尝试使用 PowerShell DSC 安装 HPC Pack 2012 R2 U3 安装程序。以下代码 有效 并安装软件:

    $HpcPackName = "Microsoft HPC Pack 2012 R2 Server Components"
    $HpcPackSourcePath = "C:\Temp\HPC2012R2_Update3_Full\setup.exe"
    $sqlServer = "EMEAWINQA15"
    $Arguments = "-unattend -headNode"

    function InstallUsingProcess
    {
        [CmdletBinding()]
        param()

        Write-Verbose "HpcPackSourcePath: $HpcPackSourcePath"
        Write-Verbose "Arguments: $Arguments"

        $startInfo = New-Object System.Diagnostics.ProcessStartInfo
        $startInfo.FileName = $HpcPackSourcePath
        $startInfo.Arguments = $Arguments

        $process = New-Object System.Diagnostics.Process
        $process.StartInfo = $startInfo

        $exitcode = 0
        $process.Start() | Out-Null

        $process.WaitForExit()

        if($process)
        {
            $exitCode = $process.ExitCode
            Write-Verbose "Exit code: $exitCode"
        }
    }

    InstallUsingProcess -Verbose

但是,当我 运行 使用脚本 DSC 配置进行同样的操作时,它成功了,但是 returns 非常快,退出代码为 10:

Configuration TestHpcInstall
{
    Import-DscResource –ModuleName PSDesiredStateConfiguration

    Node $AllNodes.Where({$_.Roles -contains 'HpcHeadNode'}).NodeName
    {
        $HpcPackName = "Microsoft HPC Pack 2012 R2 Server Components"
        $HpcPackSourcePath = "C:\Temp\HPC2012R2_Update3_Full\setup.exe"
        $sqlServer = "EMEAWINQA15"
        $Arguments = "-unattend -headNode"

        Script TestInstall
        {
            GetScript = {
                return @{ "Result" = "$true"}
            }
            TestScript = {
                return $false
            }
            SetScript = {
                Write-Verbose "HpcPackSourcePath: $using:HpcPackSourcePath"
                Write-Verbose "Arguments: $using:Arguments"

                $startInfo = New-Object System.Diagnostics.ProcessStartInfo
                $startInfo.FileName = $using:HpcPackSourcePath
                $startInfo.Arguments = $using:Arguments

                $process = New-Object System.Diagnostics.Process
                $process.StartInfo = $startInfo

                $exitcode = 0
                $process.Start() | Out-Null

                $process.WaitForExit()

                if($process)
                {
                   $exitCode = $process.ExitCode
                   Write-Verbose "Exit code: $exitCode"
                }
            }
        }
    }
}

TestHpcInstall -ConfigurationData $configData -OutputPath "C:\Temp"
Start-DscConfiguration -ComputerName "EMEAWINQA15" -Path "C:\Temp\" -Verbose -Wait -Force

这与 Package 资源使用的代码相同,它失败是因为返回错误代码 10 而不是 0(这是包安装成功时的情况,如最上面的代码示例).安装程序不产生任何输出或日志文件。

有什么想法吗?我被难住了。

我发现了问题。我认为这与权限有关,因为安装程序通常会在 运行 时给出 UAC 提升提示。但是,我之前出于两个原因将其划掉:

  1. LCM 运行s 在 NT AUTHORITY\SYSTEM 帐户下,因此是管理员,并且
  2. 因为我已经像这样向 Package 资源提供了本地管理员凭据

(没用):

Package InstallHpcHeadNode
{
    Ensure = "Present"
    Name = $HpcPackName
    ProductId = ""
    Path = $HpcPackSourcePath
    Arguments = $Arguments
    Credential = (Get-Credential)
}

但这是一个错误。从 docs,凭据 属性 说:

Provides access to the package on a remote source. This property is not used to install the package.

我承认我忽略了这一点。我应该改为使用 PsDscRunAsCredential 属性 来强制使用提供的凭据进行安装。仍然不知道为什么安装程序在 NT AUTHORITY\SYSTEM 下没有 运行。