【问题标题】:Powershell modules and admin privilegesPowershell 模块和管理员权限
【发布时间】:2017-08-21 17:40:08
【问题描述】:

我编写了一个 Powershell 模块,其中包含利用 IIS 的 WebAdministration Powershell 模块的 cmdlet。但是,此模块要求将其加载到管理员 Powershell 会话中,否则将引发异常。您可能知道或猜到,当 Powershell 未以管理员身份首次运行时,我的自定义模块无法加载。

这种行为是可以接受的,也是意料之中的。我的问题是是否有办法在加载此模块时提升 shell 的权限(并遵守 UAC 设置)?

示例:(假设在这种特殊情况下,Import-Module WebAdministration 位于我的 powershell 配置文件中)

  1. 我单击任务栏上的 powershell 快捷方式。
  2. 具有标准用户权限的 powershell shell 打开,并尝试导入模块。
  3. 遇到模块需要提升权限的事实。
  4. 系统会提示用户这样做,并且 powershell 会重新启动。

【问题讨论】:

  • 我认为可以提升自身权限的模块可能会暴露 PowerShell 中的一些主要安全漏洞。您也许可以考虑使用 JEA 创建一个角色/用户,以便在执行具有成功所需的有限权限的脚本时使用:msdn.microsoft.com/en-us/library/dn896648.aspx
  • 一个 PowerShell 脚本可以检查和自我提升(使用Start-Process -Verb RunAs),但是对于 module 来说这样做是不好的形式。在任何情况下,都没有一种方法可以重新启动会话,同时保留迄今为止所做的所有更改(这确实是您从模块中安全地执行此操作所需要的)。

标签: powershell


【解决方案1】:

我的问题是是否有办法在加载此模块时提升 shell 的权限?

如果可以在没有提示的情况下静默提升,那将是一个安全漏洞。但是你可以使用这样的代码来确保如果你没有运行提升模块将引发错误(而不是加载):

$Elevated = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
if ( -not $Elevated ) {
  throw "This module requires elevation."
}

【讨论】:

  • 这不是一个明显的安全漏洞。提升是 Windows 中的一项现有功能,它需要输入管理凭据才能执行。您提到的 #Requires 子句只会导致脚本在执行时出错。它不能在模块(even a script module)中使用,也不能完成 OP 指定的任务。至少,您应该解释它的作用以及 OP 如何发现它有帮助,尽管它没有按照要求做。我的反对意见是基于缺乏信息和错误的判断。
  • @jpmc26 谢谢;我以为我测试了#requires -RunAsAdministrator 在脚本模块中工作;显然我没有。使用以编程方式确定提升并在未提升时引发错误的代码更新了我的答案。
猜你喜欢
  • 2015-04-02
  • 1970-01-01
  • 1970-01-01
  • 2014-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-07
相关资源
最近更新 更多