如何从提升的 PowerShell 控制台以非管理员身份 运行 进程?
How to run a process as non-admin from an elevated PowerShell console?
也许有一种方法可以做到这一点 Start-Process cmdlet that I cannot find? The other related Q/A's I found on Whosebug such as this, this and this 所有人都提供了使用自定义 C# 代码来做到这一点的解决方案。我的问题是,在 PowerShell 中是否有任何直接的方法可以做到这一点?也就是说,您在提升的 PS 控制台中,并且想要 运行 作为非管理员的进程。
在start-process
中存在开关runas
喜欢
start-process powershell -verb runAs
但是 uac 仍然会检查你是否在你的系统中 uac on 你应该首先绕过 uac 绕过 uac 有很多方法,但所有方法都不起作用 windows 喜欢 windows 8
如果您为 运行 进程编写脚本,那么 compile to exe you can use program like runasadmin 对于 运行 作为管理员您的 exe 在系统中但仍然无法在 windows 8
中工作
您可以用 runas.exe
指定 TrustLevel
,有效 运行 "restricted"
runas /trustlevel:0x20000 "powershell.exe -command 'whoami /groups |clip'"
您应该在 whoami
的输出中看到您令牌中的 Administrators
组被标记为 "Used for Deny only"
如链接任务所述,当您深入研究此问题时,无法从提升的进程 运行 UAC "non" 提升的进程。因为这正是我所需要的,而且 运行as 解决方案对我不起作用,所以我将 Microsoft 提供的代码解决方法转换为使用计划任务来启动 "non" 提升的进程。
运行ning powershell.exe 作为 "non" 提升进程的示例,来自提升的 powershell 提示:
$apppath = "powershell.exe"
$taskname = "Launch $apppath"
$action = New-ScheduledTaskAction -Execute $apppath
$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date)
Register-ScheduledTask -Action $action -Trigger $trigger -TaskName $taskname | Out-Null
Start-ScheduledTask -TaskName $taskname
Start-Sleep -s 1
Unregister-ScheduledTask -TaskName $taskname -Confirm:$false
以上 powershell 命令仅适用于 Windows Server 2012 / Windows 8 及更高版本。
或者您可以使用 SCHTASKS.EXE 应用程序来覆盖 windows 的大多数版本:
$apppath = "powershell.exe"
$taskname = "Launch $apppath"
schtasks /create /SC ONCE /ST 23:59 /TN $taskname /TR $apppath
schtasks /run /tn $taskname
Start-Sleep -s 1
schtasks /delete /tn $taskname /F
另一种有限的方法:让 Windows Explorer 为您启动它
PS C:\> explorer.exe "C:\windows\system32\cmd.exe"
只需使用完整路径和扩展名即可。但是它不接受参数。
我尝试创建一个批处理文件。但是资源管理器拒绝启动 .BAT
或 .CMD
.
您可以 运行 通过传递您想要 运行 作为的用户的凭据,从提升的会话中创建非管理进程。如果您想以交互方式 运行,您可以使用 Get-Credential
,或者如果您希望脚本运行无人值守。例如:
$credential = Get-Credential -UserName $Env:USERNAME
# or
$credential = Import-Clixml -Path 'C:\MyCredential.cred'
Start-Process -FilePath pwsh.exe -ArgumentList '-noprofile' -Credential $credential -Wait
也许有一种方法可以做到这一点 Start-Process cmdlet that I cannot find? The other related Q/A's I found on Whosebug such as this, this and this 所有人都提供了使用自定义 C# 代码来做到这一点的解决方案。我的问题是,在 PowerShell 中是否有任何直接的方法可以做到这一点?也就是说,您在提升的 PS 控制台中,并且想要 运行 作为非管理员的进程。
在start-process
中存在开关runas
喜欢
start-process powershell -verb runAs
但是 uac 仍然会检查你是否在你的系统中 uac on 你应该首先绕过 uac 绕过 uac 有很多方法,但所有方法都不起作用 windows 喜欢 windows 8 如果您为 运行 进程编写脚本,那么 compile to exe you can use program like runasadmin 对于 运行 作为管理员您的 exe 在系统中但仍然无法在 windows 8
中工作您可以用 runas.exe
指定 TrustLevel
,有效 运行 "restricted"
runas /trustlevel:0x20000 "powershell.exe -command 'whoami /groups |clip'"
您应该在 whoami
的输出中看到您令牌中的 Administrators
组被标记为 "Used for Deny only"
如链接任务所述,当您深入研究此问题时,无法从提升的进程 运行 UAC "non" 提升的进程。因为这正是我所需要的,而且 运行as 解决方案对我不起作用,所以我将 Microsoft 提供的代码解决方法转换为使用计划任务来启动 "non" 提升的进程。
运行ning powershell.exe 作为 "non" 提升进程的示例,来自提升的 powershell 提示:
$apppath = "powershell.exe"
$taskname = "Launch $apppath"
$action = New-ScheduledTaskAction -Execute $apppath
$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date)
Register-ScheduledTask -Action $action -Trigger $trigger -TaskName $taskname | Out-Null
Start-ScheduledTask -TaskName $taskname
Start-Sleep -s 1
Unregister-ScheduledTask -TaskName $taskname -Confirm:$false
以上 powershell 命令仅适用于 Windows Server 2012 / Windows 8 及更高版本。
或者您可以使用 SCHTASKS.EXE 应用程序来覆盖 windows 的大多数版本:
$apppath = "powershell.exe"
$taskname = "Launch $apppath"
schtasks /create /SC ONCE /ST 23:59 /TN $taskname /TR $apppath
schtasks /run /tn $taskname
Start-Sleep -s 1
schtasks /delete /tn $taskname /F
另一种有限的方法:让 Windows Explorer 为您启动它
PS C:\> explorer.exe "C:\windows\system32\cmd.exe"
只需使用完整路径和扩展名即可。但是它不接受参数。
我尝试创建一个批处理文件。但是资源管理器拒绝启动 .BAT
或 .CMD
.
您可以 运行 通过传递您想要 运行 作为的用户的凭据,从提升的会话中创建非管理进程。如果您想以交互方式 运行,您可以使用 Get-Credential
,或者如果您希望脚本运行无人值守。例如:
$credential = Get-Credential -UserName $Env:USERNAME
# or
$credential = Import-Clixml -Path 'C:\MyCredential.cred'
Start-Process -FilePath pwsh.exe -ArgumentList '-noprofile' -Credential $credential -Wait