【问题标题】:Starting non-elevated prompt from elevated session从提升的会话开始非提升的提示
【发布时间】:2016-11-29 10:27:43
【问题描述】:

如果从提升的会话中运行,我有一些工具不起作用。

我正在运行提升会话(在管理安装的上下文中,所以这是强制性的),所以这是不可更改的。

除了创建计划任务并执行它,还有什么更快或更友好的吗?

=== 编辑 ===

这是需要不提升运行的命令:vboxmanage list runningvms

我试过了

runas /trustlevel:0x20000 "powershell.exe -noprofile -noexit -command iex 'vboxmanage list runningvms'"

它什么也不返回

此代码有效:

function Run-NonElevated( [string] $cmd ) {
    $task_name = "Run-NonElevated-$(New-Guid)"
    schtasks /Create /RU $Env:USERNAME /TN $task_name /SC ONCE /ST 00:00 /F /TR $cmd
    schtasks /run /tn $task_name
    schtasks /delete /F /tn $task_name
}

Run-NonElevated "powershell -NoProfile -Command 'vboxmanage list runningvms | Out-File $Env:TEMP\re.out'"
cat C:\Users\majkinetor\AppData\Local\Temp\re.out
"test machine" {31409fff-c195-4a83-ab12-96bba020e051}

【问题讨论】:

  • 您是否尝试过使用runas
  • 不,不是,请参阅已编辑的问题。
  • 无变化。 ...

标签: powershell


【解决方案1】:
Function Run-NonElevated([string]$Cmd) {
    $Cmd | Out-File -Encoding AscII -FilePath "$Env:Temp\Run-NonElevated.cmd"
    Explorer "$Env:Temp\Run-NonElevated.cmd"
}

Run-NonElevated "vboxmanage list runningvms"

【讨论】:

  • Explorer 要求可能不再现实。
【解决方案2】:

最后使用这个函数:

function Start-ProcessNonElevated( [string] $Cmd, [switch]$UsePowerShell ) {
    $svc = gsv Schedule -ea 0
    if ($svc -and $svc.Status -ne 'Running') { throw 'Start-ProcessNonElevated requires running Task Scheduler service' }

    $res = @{}

    $tmp_base  = [System.IO.Path]::GetTempFileName()
    $tmp_base  = $tmp_base -replace '\.tmp$'
    $tmp_name  = Split-Path $tmp_base -Leaf
    $task_name = "Start-ProcessNonElevated-$tmp_name"
    Write-Verbose "Temporary files: $tmp_base"

    if ($UsePowershell) {
        @(
            '$r = "{0}"' -f $tmp_base
            ". {{`n{0}`n}} >`"`$r.out.log`" 2>`"`$r.err.log`"" -f $Cmd
        ) -join "`n" | Out-String | Out-File "$tmp_base.ps1"
        $cmd = "powershell -NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -NoLogo -NonInteractive -File '$tmp_base.ps1'"
    }

    Write-Verbose "Creating scheduled task for command:`n$cmd"
    schtasks.exe /Create /RU $Env:USERNAME /TN $task_name /SC ONCE /ST 00:00 /F /TR $cmd *> "$tmp_base.schtasks.log"
    schtasks.exe /run /tn $task_name *>> "$tmp_base.schtasks.log"

    Write-Verbose 'Waiting for scheduled task to finish'
    do {
        $status = schtasks /query /tn $task_name /FO csv | ConvertFrom-Csv | select -expand Status
        sleep 1
    }
    until ($status -eq 'Ready')
    schtasks.exe /delete /F /tn $task_name *>> "$tmp_base.schtasks.log"

    if ($UsePowershell) {
        $res = @{
            out = cat "$tmp_base.out.log" -ea 0
            err = cat "$tmp_base.err.log" -ea 0
        }
    }

    return $res
}

仍然想知道没有任务调度程序的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 2011-01-31
    • 2014-08-20
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    相关资源
    最近更新 更多