我在使用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 Creds和Why is this process crashing as soon as it is launched?。那么你究竟是如何解决这类问题的呢? (即使为这类问题编写自定义资源,我也遇到了问题。)
答案 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(),但在我的测试中,这不起作用。