【问题标题】:How To Pass User Credentials from One Powershell Script to Another?如何将用户凭据从一个 Powershell 脚本传递到另一个?
【发布时间】:2019-08-09 06:51:54
【问题描述】:

我有一个主菜单脚本,我要求用户输入管理员凭据,并且我想在主菜单调用的其他脚本中使用它们。

这是我对其他脚本的调用,它们可以正常启动新脚本并运行被调用的脚本。

Start-Process PowerShell.exe -ArgumentList "-noexit", "-command &$ScriptToRun -UserCredential $UserCredential"

在被调用的脚本中,我接受这样的参数

#Accept User Credentials if sent from Main menu
param(
[parameter(ValueFromPipelineByPropertyName=$true,ValueFromPipeline=$true,Mandatory=$false)]
  [PSCredential]$UserCredential
)

不过,它不是接受凭据,而是启动提示,要求在用户字段中输入带有对象名称的凭据。

任何帮助都将不胜感激,因为我正在用头撞墙。

【问题讨论】:

  • 为什么要使用Start-Process 来调用powershell.exe 的新实例?

标签: powershell scripting credentials


【解决方案1】:

你不能像那样直接跨进程边界传递非字符串对象,新进程的输入参数总是将是裸字符串。

可以做的是使用$UserCredentials 来简单地启动新进程:

Start-Process PowerShell.exe -Credential $UserCredential -ArgumentList "-noexit", "-command &$ScriptToRun" 

...或者,最好从调用脚本调用Invoke-Command,而不是启动一个新进程:

Invoke-Command -ScriptBlock $scriptBlockToRun -Credential $UserCredential

【讨论】:

  • 因为 PowerShell 可能完全有能力解决您的问题,而无需增加启动多个进程的复杂性(+ 没有启动多个进程的性能开销) - 现在您可以在脚本之间有意义地传递数据(不限于凭据),无需手动来回转换字符串。简而言之 - 你可以真正利用所有让 PowerShell 变得更好的东西 :)
  • 如果您想要一个更简洁或更有意义的答案,我建议您使用 what 您需要凭据来更新问题 - 您需要提升或模拟什么样的操作为了? :)
  • @ToddWelch 如果您的命令没有双引号会打乱命令行解析,那么 Start-Process 方法就可以工作。在这种情况下,请调查 -EncodedCommand 参数。 Invoke-Command 方法仅在您包含 -ComputerName 参数并启用 PSRemoting 时才有效,即使您想在 localhost 上执行也是如此。
【解决方案2】:

使用凭据启动进程的一种简单方法是使用 Jobs。

$UserCredential = Get-Credential
$ScriptBlock = {param($x) "Running as $(whoami).  x=$x"}
& $ScriptBlock 10          # Just check it works under current credentials
$Job = Start-Job -Credential $UserCredential -ScriptBlock $ScriptBlock -ArgumentList 20
Receive-Job -Job $Job -Wait -AutoRemoveJob

使用作业的一个优点是您可以将输出、错误、详细和警告流传递回调用者,而这在使用 Start-Process 时是不可能的。

在使用作业时,所有参数和返回值都被隐式序列化,这在传递复杂对象时有局限性,但可以很好地处理所有基本类型。

【讨论】:

    猜你喜欢
    • 2019-02-03
    • 1970-01-01
    • 2012-02-19
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 2014-07-01
    相关资源
    最近更新 更多