在第一种情况下,您会出错:您调用 PowerShell 的新实例并传递$cmd
不代表 Powershell 的有效输入的字符串。
你调用:
powershell.exe certutil.exe -addstore TrustedPeople C:\some_path\myCertif.cer
而 PowerShell 需要这样的输入:
powershell.exe .\somescript.ps1
powershell.exe -Command 'some_command'
powershell.exe -EncodedCommand 'base64_command'
... 等等 ...
在第二种情况下,您只需启动一个新的提升的 PowerShell 实例,然后您就可以成功导入证书。
要从 PowerShell 导入证书,我会根据您的示例建议三种解决方案:
1)certutil.exe
直接使用:
$arguments = '-addstore TrustedPeople C:\some_path\myCertif.cer'
$ret = Start-Process 'certutil.exe' -Verb RunAs -ArgumentList $arguments -Wait -PassThru
2)如果出于某种原因(以防万一)你想调用另一个PowerShell实例,你可以使用Command
这样的选项:
$cmd = 'certutil.exe -addstore TrustedPeople C:\some_path\myCertif.cer'
$ret = Start-Process 'powershell.exe' -Verb RunAs -ArgumentList "-Command $cmd" -Wait -PassThru
3)最后为了完整起见,您可以使用EncodedCommand
:
$cmd = 'certutil.exe -addstore TrustedPeople C:\some_path\myCertif.cer'
$bytes = [Text.Encoding]::Unicode.GetBytes($cmd)
$encodedCommand = [Convert]::ToBase64String($bytes)
$ret = Start-Process 'powershell.exe' -Verb RunAs -ArgumentList "-EncodedCommand $encodedCommand" -Wait -PassThru
同样在我的测试环境(Windows 7 Enterprise x64 with PowerShell v.2)中,当以非提升权限运行我的脚本时,我未能certutil.exe
使用 cmdlet 实际获取返回代码。Start-Process
我使用 .Net 函数来解决这个问题:
$pinfo = New-Object System.Diagnostics.ProcessStartInfo
$pinfo.FileName = 'certutil.exe'
$pinfo.UseShellExecute = $true
$pinfo.Verb = 'runas'
$pinfo.Arguments = '-addstore TrustedPeople C:\some_path\myCertif.cer'
$p = New-Object System.Diagnostics.Process
$p.StartInfo = $pinfo
$p.Start() | Out-Null
$p.WaitForExit()
Write-Host $p.ExitCode
我希望这就是你所需要的!