Powershell:Start-Process 不会将参数传递给 cmd.exe

Powershell: Start-Process doesn't pass arguments to cmd.exe

这些是 powershell 控制台中的命令 运行 (Windows 10):

$username = 'Username'
$password = 'Password'
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential $username, $securePassword
Start-Process powershell.exe -Credential $credential -WindowStyle Hidden -ArgumentList "Start-Process cmd.exe -Verb RunAs -ArgumentList 'value'"

这些命令工作正常,除了一旦您通过另一个用户以管理员身份打开 cmd.exe,通过 运行 执行此命令:

echo %1

它给了我回报:

%1

从字面上看。相反,我期望:

value

我做错了什么?

我只是 可以使用我在那里提供的脚本找到解决方案,并进行一些修改,并以特定方式调用命令链:

运行AsProxy.ps1

# First arg should be the script path
$script = $args[0]

# Rest of args should be any script parameters
$scriptArgs = $args[1..$args.Count] -join ' '

$startProcessArgs = @{
  Wait = $true
  Verb = 'RunAs'
  FilePath = 'cmd.exe'
  ArgumentList = "/c ""$script"" $scriptArgs"
}
Start-Process @startProcessArgs

exit $LASTEXITCODE

然后调用运行AsProxy.ps1作为你想要运行的用户,然后提升:

$command = "Command_you_want_to_run_from_cmd.exe"
$arguments = "any arguments to the program"
Start-Process -Cred $credential powershell.exe "-File ./RunAsProxy.ps1 $command $arguments"

它的工作方式与您尝试的差不多,但使用预定义的脚本来处理海拔高度。但是正如您发现的那样,您不能在 Start-Process 上的同一调用中调用 -Credential-Verb。所以这比在线定义代码更容易:

  1. 运行 RunAsProxy.ps1 作为目标用户
  2. 运行AsProxy。ps1 将 运行 cmd.exe 使用提供的参数并提升进程。

请注意,如果 RunAsProxy.ps1 不在当前目录中,您需要提供它的相对路径或完整路径。