使用凭据

时间:2015-09-14 20:29:50

标签: powershell dsc

我在使用DSC(在PowerShell 4中)以另一个用户启动进程时遇到问题。这是一个示例配置:

$configData = @{
    AllNodes = @(
        @{
            NodeName = 'localhost'
            PSDscAllowPlainTextPassword = $true
        }
    )
}

Configuration DSC_AttribProblem {
    param(
        [Parameter(Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
        [PsCredential] $credential
    )

    Node "localhost" {
        File CreateTestFolder {
            Ensure = "Present"
            Type = "Directory"
            DestinationPath = "C:\DSC_Test"
        }

        Script CreateTestFile {
            SetScript = {
                $sw = New-Object System.IO.StreamWriter("C:\DSC_Test\TestFile.txt")
                $sw.Close()
            }
            TestScript = {
                return Test-Path "C:\DSC_Test\TestFile.txt"
            }
            GetScript = {
            }
            DependsOn = "[File]CreateTestFolder"
        }

        WindowsProcess Attrib {
            Path = "C:\Windows\System32\attrib.exe"
            Arguments = "-A C:\DSC_Test\TestFile.txt"
            Credential = $credential
            DependsOn = "[Script]CreateTestFile"
        }
    }
}

请注意,这只是一个示例,用于演示使用凭据运行可执行文件的问题。 (现实案例还需要重定向标准输出。)

Attrib步骤因此错误而失败:

PowerShell provider MSFT_ProcessResource  failed to execute
Set-TargetResource functionality with error message: Failure starting
process matching path 'C:\Windows\System32\attrib.exe'. Message:
"Failed  to wait for processes to start". 
    + CategoryInfo          : InvalidOperation: (:) [], CimException
    + FullyQualifiedErrorId : ProviderOperationExecutionFailure
    + PSComputerName        : localhost

我在http://powershell.org/wp/forums/topic/running-windowsprocess/发现了一个类似的问题,但没有真正回答。

在幕后,我可以想象这归因于does windows have a limitation when a process started by a scheduled task under one set of creds runs another program under a different set of CredsWhy is this process crashing as soon as it is launched?。那么你究竟是如何解决这类问题的呢? (即使为这类问题编写自定义资源,我也遇到了问题。)

1 个答案:

答案 0 :(得分:0)

为了实现这一点,我的第一次尝试是使用LogonUser然后使用.NET Process类来创建新进程(它很好地支持重定向)。 LogonUser部分基于https://gist.github.com/idavis/856603(用于在脚本块中模拟)和http://poshcode.org/1856(它似乎更好地处理了我的情况下的凭据)。这都包含在自定义资源中。

我后来发现虽然这实现了在本地获取凭据的目标,但它无法通过网络访问文件。那时我在CreateProcessAsUser中使用了DSC powershell xwindowsprocess to execute batch file under different user account替代方法。虽然对该主题的评论对我来说没有结果,但我提出了一个有效的解决方案,并将其发布到this Gist page,包括自定义DSC资源和PowerShell模块。该解决方案还有一个替代实现,可以交换涉及CreateProcessWithLogonW(),但在我的测试中,这不起作用。