以下是在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
我做错了什么?
2条答案
按热度按时间ebdffaop1#
我只是answered a question,可以使用我在那里提供的脚本找到解决方案,进行一些修改,并以特定的方式调用命令链:
RunAsProxy.ps1
然后以运行用户的身份调用RunAsProxy.ps1如下,然后提升:
它的工作方式与您尝试的差不多,但是使用预定义的脚本来处理提升。但是正如您所发现的,不能在
Start-Process
上的同一个调用中调用-Credential
和-Verb
。因此,这比内联定义代码更容易:1.以目标用户身份运行
RunAsProxy.ps1
cmd.exe
并提升进程。请注意,如果
RunAsProxy.ps1
不在当前目录中,则需要提供它的相对路径或完整路径。hgtggwj02#
您的方法唯一的问题是您忘记将
/c
或/k
与cmd.exe
一起使用以便在启动时 * 执行命令 *:*
/c
:cmd /c $someCommandLine
执行由$someCommandLine
* 表示的命令,然后退出 *。cmd.exe
进程拥有该窗口(这里就是这种情况);& pause
附加到命令字符串将使窗口保持打开状态,直到用户按下一个键,让他们有机会看到输出。*
/k
:cmd /k $someCommandLine
执行命令 *,然后保持会话打开 *,即进入交互式会话。/c
也不使用 */k
,则cmd.exe
* 会忽略 * 它们并直接进入交互式会话(如果您完全不使用参数执行cmd.exe
,则会这样做)。假设代码中的
'value'
是您希望cmd.exe
在提升会话中执行的命令的占位符。这里有一个简单的例子(它使用一个here-string来避免对字符串中嵌入的引号进行转义),它使用
cmd /c
执行一个示例命令,然后使用pause
来保持窗口打开,直到用户按下一个键(从安全的Angular 来看,使用/k
会有更多问题,因为您将以管理员权限进入一个 * 交互式 * 会话)。因为对于其他人来说,为什么你的代码涉及 * 两个 * - nested -
Start-Process
调用并不明显,让我提供context:Start-Process
调用-一个嵌套在另一个内部,因为-Credential
参数(请求特定的用户身份)可以在语法上 * 不 * 与-Verb RunAs
(请求提升)组合:-Credential
作为目标用户启动一个(总是)* 非提升 * 进程。这个进程是一个临时的辅助进程(这就是为什么你用-WindowStyle Hidden
隐藏运行它)。-Verb RunAs
,然后启动一个提升的进程(可见)* 作为该用户 *。