我有一个PowerShell脚本/函数,只需要很少的参数并运行它。
Invoke-Expression ".\ScriptFile.ps1 $($Node.Name).xml C:\TempFolder\ $($Node.Name) local"
现在我想以另一个用户身份运行它。
Invoke-Expression
没有固有参数credential
来促进这一点。另一方面,Invoke-Command
具有Credential
(Get-Credential
)参数,便于以其他用户身份运行。我尝试用Invoke-Expression
替换Invoke-Command
但没有运气。
如何处理此问题以将上述表达式作为另一个用户运行?
脚本资源的结构。
Script Deploy
{
SetScript =
@"
Set-Location D:\Deploy
Invoke-Expression ".\ScriptFile.ps1 $($Node.Name).xml C:\TempFolder\ $($Node.Name) local"
"@
TestScript =
{
return $false
}
GetScript = {
return @{
GetScript = $GetScript
SetScript = $SetScript
TestScript = $TestScript
}
}
DependsOn = "[File]CopyMe"
}
P.S。:所有这些都发生在所需状态配置中Script
用户的SetScript内。
答案 0 :(得分:2)
Invoke-Command
确实可以用作在不同用户的本地机器上运行脚本(正如@mjolinor所说,它将是一个不同的会话)。您必须启用PowerShell远程处理(如果您正在使用DSC,几乎肯定会这样做)。该命令看起来像这样(假设您上面的调用的翻译版本):
Invoke-Command -ComputerName . -Credential $cred -File .\ScriptFile.ps1 -ArgumentList "$($Node.Name).xml","C:\TempFolder",$Node.Name,"local"
我怀疑这不会解决你的问题。评论中的错误消息只是一般错误,这意味着出错了。为了获得更多线索,您应该查看xDscDiagnostics PowerShell Module以帮助进行故障排除。
如果你能告诉我们你最终想要做什么,那会是多么美妙。什么。\ ScriptFile.ps1 实际上?
答案 1 :(得分:1)
我认为你不能。要在不同的安全上下文下运行命令,您必须在以这些凭据运行的会话中执行此操作。
如果查看Invoke-Command的参数集,则Credential参数仅在指定另一台计算机或URI的参数集中可用(这将导致创建新会话)。 FilePathRunspace和InSession参数集将导致在本地会话中调用该命令,并且没有Credential参数。
同样,Invoke-Command将在本地会话中运行该命令并且没有Credential参数,因为一旦为会话建立了安全上下文,您就无法更改安全上下文