gpt4 book ai didi

powershell - 有没有办法通过 start-process 将可序列化对象传递给 PowerShell 脚本?

转载 作者:行者123 更新时间:2023-12-02 22:17:43 25 4
gpt4 key购买 nike

我了解 PowerShell 作业,但我想使用 start-process 并将可序列化对象传递给新的 powershell 进程。有没有办法做到这一点?

似乎使用 start-process 你必须提供一个字符串参数列表,它不会为我削减它。我正在尝试将 PSCredential 从一个进程获取到另一个进程(或 SecureString,我将采用其中任何一个)。也许这绕过了安全性。

更新 - 添加我在看到其他人的帮助后使用的解决方案(使用来自@PetSerAl 的解决方案)

我写了两个测试脚本:一个父脚本和一个子脚本。父脚本调用子脚本。

父脚本:

$securePassword = ConvertTo-SecureString "testpassword" -AsPlainText -Force
$cred = New-Object PSCredential("testuser", $securePassword)
$credSerial = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes([Management.Automation.PSSerializer]::Serialize($cred)))

$psFile = "C:\repos\Test\PowerShell Scripts\KirkTestChild.ps1"
$p1 = "-someparam ""this is a test!!!"""
$p2 = "-cred ""$credSerial"""

$proc = Start-Process PowerShell.exe -PassThru:$true -Argument "-File ""$($psFile)""", $p1, $p2
Write-Host "ID" $proc.Id
Write-Host "Has Exited" $proc.HasExited

Start-Sleep -Seconds 15
Write-Host "Has Exited" $proc.HasExited

子脚本:
Param(
$someParam,
$cred
)

Write-Host "someParam: $($someParam)"
Write-Host "cred (raw): $($cred)"
$realCred=[Management.Automation.PSSerializer]::Deserialize([Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($cred)))
Write-Host "cred user: $($realCred.UserName)"
Write-Host "start"
Start-Sleep 5
Write-Host "ending"
Start-Sleep 5

最佳答案

是的。如 PetSerAl在评论中写道,您可以使用 PSSerializer类来处理:

$ser = [System.Management.Automation.PSSerializer]::Serialize($credential)

$cred = [System.Management.Automation.PSSerializer]::Deserialize($ser)

我不知道你的过程是否会理解 CliXML 格式;您没有指定要启动的流程。

由于这将生成多行的 XML,因此将其作为参数传递给进程可能不起作用,这就是 PetSerAl 将代码包含到 Base64 编码生成的 XML 的原因。

您还可以通过 STDIN 而不是 Base64 编码传递 XML,这也确保您不会意外达到命令行大小限制。

关于powershell - 有没有办法通过 start-process 将可序列化对象传递给 PowerShell 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34076478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com