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
。所以这比在线定义代码更容易:
- 运行
RunAsProxy.ps1
作为目标用户
- 运行AsProxy。ps1 将 运行
cmd.exe
使用提供的参数并提升进程。
请注意,如果 RunAsProxy.ps1
不在当前目录中,您需要提供它的相对路径或完整路径。
这些是 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
。所以这比在线定义代码更容易:
- 运行
RunAsProxy.ps1
作为目标用户 - 运行AsProxy。ps1 将 运行
cmd.exe
使用提供的参数并提升进程。
请注意,如果 RunAsProxy.ps1
不在当前目录中,您需要提供它的相对路径或完整路径。