Kir*_*ohn 4 powershell start-process
我了解 PowerShell 作业,但我想使用启动进程并将可序列化的对象传递给新的 powershell 进程。有什么办法可以做到这一点吗?
看来使用启动进程你必须提供一个字符串参数列表,这对我来说不会减少它。我正在尝试从一个进程获取 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
Run Code Online (Sandbox Code Playgroud)
子脚本:
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
Run Code Online (Sandbox Code Playgroud)
是的。正如PetSerAl在评论中所写,您可以使用该类PSSerializer来处理该问题:
$ser = [System.Management.Automation.PSSerializer]::Serialize($credential)
$cred = [System.Management.Automation.PSSerializer]::Deserialize($ser)
Run Code Online (Sandbox Code Playgroud)
我不知道你的进程是否能理解 CliXML 格式;您没有指定要启动的进程。
由于这将生成多行 XML,因此将其作为参数传递给进程可能不起作用,这就是 PetSerAl 包含对生成的 XML 进行 Base64 编码的代码的原因。
您还可以通过 STDIN 而不是 Base64 编码传递 XML,这也可确保您不会意外达到命令行大小限制。
| 归档时间: |
|
| 查看次数: |
13466 次 |
| 最近记录: |