【问题标题】:Running Powershell with elevated privileges以提升的权限运行 Powershell
【发布时间】:2014-01-03 14:13:11
【问题描述】:

在尝试以提升的权限运行进程时,我遇到了非常奇怪的错误。我编写了一个获取命令和用户凭据的 PS 函数,它应该在这些凭据下执行命令。它类似于 Start-Process cmdlet,但我编写了该函数,因为我需要捕获已执行命令的输出。关键是当我将ProcessStartInfo 的属性Verb 设置为应该启动UAC 的“runas”时。

我的功能在这里:

Function Grant-ElevatedPrivileges {
    [cmdletBinding()]
    param(
        [Parameter(Mandatory=$true)]
        [String]$command
        ,
        [Parameter(Mandatory=$true)]
        [System.Management.Automation.PSCredential]$credential
    )
    Write-Verbose -msg "EXECUTING COMMAND WITH ELEVATED PRIVILEGES: $command"
#   Write-Host "$command"
    $result = @{'result' = $false; 'output' = $false; 'error' = $false};
    $psi = New-object System.Diagnostics.ProcessStartInfo
    #$psi.CreateNoWindow = $true 
    $psi.UseShellExecute = $false 
    $psi.RedirectStandardOutput = $true 
    $psi.RedirectStandardError = $true 
    $psi.FileName = 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe' 
    $psi.Arguments = @"
-ExecutionPolicy Bypass -noprofile $command
"@
    $psi.UserName = $credential.GetNetworkCredential().UserName
    if ($credential.GetNetworkCredential().Domain -ne "") { $psi.Domain = $credential.GetNetworkCredential().Domain }
    $psi.Password = $credential.Password
    $psi.Verb = "runas"
    $process = New-Object System.Diagnostics.Process 
    $process.StartInfo = $psi
    try {
        $result['result'] = $process.Start()
        $process.WaitForExit()
        $result['output'] = $process.StandardOutput.ReadToEnd()   
        $result['error'] = $process.StandardError.ReadToEnd()
    } catch [System.ComponentModel.Win32Exception] {
        if (($_.Exeption.NativeErrorCode) -eq 1326) {
            Write-Verbose "USUARIO O CONTRASEÑA INCORRECTA"
            $result['error'] = "BADUSER"
        } else {
            $result['error'] = $_.Exception.Message
        }

        $result['result'] = $false
    } catch {
        $result['result'] = $false
        $result['error'] = Write-Error $_.Exception.Message
    }

    if ($result['error'] -ne '') {
        Write-Verbose $result['error']
        $result['result'] = $false
    }
    $result
}

我通过调用函数来检查我提到的行为:

Grant-ElevatedPrivileges -command "([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator')" -credential $creds -Verbose

如果在管理员权限下执行的命令应该返回 True...

关于我缺少什么的任何想法?

感谢您的建议或想法;)

【问题讨论】:

  • 对于它的价值,我测试了你的代码,并且能够发现它没有从非提升提示中请求提升。你从这里得到你的代码想法吗? codeproject.com/Articles/105506/…
  • 你的问题是什么?它不返回true吗?它是否返回错误?
  • @TrevorSullivan,我写了大约 3 个月的函数,所以我不记得确切的来源,但可能是我的来源之一。尽管如此,据我记得 MSDN 上的文档,如果我将动词设置为“runas”,它应该会提升 UAC 窗口,不是吗?
  • @LarsTruijens,我的问题是,如果我用我提到的代码测试我的函数,它总是返回 false,当它应该返回 true 时,因为它应该在管理员上下文中执行。
  • @SantiFdezMunoz MSDN 文档没有明确指出“runas”动词。它指出Verb 属性应匹配只读Verbs 属性输出的值之一。查看Verbs 的文档,它说返回的值是基于为FileName 属性指定的值的扩展。 msdn.microsoft.com/en-us/library/…

标签: powershell uac


【解决方案1】:

似乎是not possible 以不同的用户身份运行并一次性提升(作为管理员)。所以要么:

  • 以不同的用户身份运行,但不能通过提供凭据、无 runas 动词和 UseShellExecute = false 来提升权限。您已经拥有该代码
  • 使用 runas 动词、无凭据和 UseShellExecute = true 以当前用户身份运行。有关示例,请参阅 here
  • 以不同的用户身份运行,并通过组合上述两个选项分两步进行提升。有关示例,请参阅here
    1. 以其他用户身份启动进程
    2. 从该进程启动一个进程并将其提升

【讨论】:

  • @LarsTrujiens,你的方法似乎合乎逻辑,让我重写函数,测试它,我会让你知道结果。谢谢!
  • 呸,我感觉它与ShellExecute 有关......但是,是的,除非你没有指定凭据,否则它不会让你使用ShellExecute
  • @LarsTrujies,我刚刚测试了你的方法,我意识到它有一个缺点,如果我设置 UseShellExecute = false,我无法重定向 StandardOutput 或 StandardError。因此,似乎不可能以可行的方式执行具有提升权限、当前凭据和重定向输出的命令(这实际上与以提升权限运行命令一样重要)
猜你喜欢
  • 2013-05-31
  • 1970-01-01
  • 2021-06-22
  • 2020-05-21
  • 1970-01-01
  • 2011-12-16
  • 2015-11-24
  • 2013-08-14
  • 1970-01-01
相关资源
最近更新 更多