扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
在 Windows Vista 引进的诸多安全性功能中,用户帐户控制 (UAC) 是最重要的功能之一.使用用户帐户控制,即便是管理员用户也使用标准特权来运行大多数应用程序,但是针对特定管理任务和应用程序功能具有“提升权限的可能”.在使用 Windows Vista™ 一段较长的时间后,根据需要来提升任务和应用程序的权限已渐成自然.不过,在 Windows Vista 中尝试提升某些类型的任务时,我也遇到许多不便之处,令人感到沮丧.
因此,本着以前的 Windows PowerToys 的精神,我创建了一些脚本提升 PowerToy 来克服这些限制.您可以在位于TechNet的代码下载中找到我将要讨论的所有 PowerToy.您还可以参阅 2006 年 11 月 Alex Heaton 的文章“用'用户帐户控制'实现非管理员操作之梦”,了解 UAC 是如何工作的。
下载:Windows Vista 的脚本提升 PowerToy
提升命令 PowerToy
第一件令人不快的事情是无法从命令行或“运行”对话框提升应用程序。因此在 Microsoft 内部进行了广泛咨询后,我从 John Stephens(Microsoft 的软件设计工程师)那里得到了一个示例脚本,提供了我所需要的信息。事实上,如果您将动词“runas”传递给 ShellExecute API 或其 COM 等效项(Shell.Application 的 ShellExecute 方法),所启动的应用程序将提示进行提升。这就允许我创建了第一个提升 PowerToy — 提升命令 PowerToy。
此工具(由 ElevateCommand.inf、elevate.cmd 和 elevate.vbs 文件组成)将向您的系统添加一个 elevate 命令。这允许您从命令行、脚本或“运行”对话框中启动提示进行提升的应用程序。例如,以下命令将用记事本打开 Win.ini(在提示进行提升之后):
elevate notepad c:\Windows\Win.ini
在 Windows Script Host (WSH)、Windows PowerShell或其他脚本中使用 elevate 命令时,需要将脚本宿主可执行文件(如 wscript、cscript 或 powershell)指定为该应用程序。例如,要运行 vbs,您需要使用如下代码:
elevate wscript “C:\windows\system32\
slmgr.vbs” –dli
帮助文本对此进行了解释。使用带 -? 参数或不带任何参数的 elevate 命令可查看帮助文本。
以管理员身份运行脚本
另 一个不便之处是对于大多数 Windows 脚本类型,没有“以管理员身份运行”上下文菜单选项(当您在资源管理器中右键单击文件时)。命令外壳脚本(那些带有 .bat 和 .cmd 文件扩展名的文件)是一个例外。因此我开始对此进行调查。对于各种文件类型,许多上下文菜单选项都是通过注册表的 HKEY_CLASSES_ROOT 部分中的“object”类型的命令键控制的(有关详细信息,请参阅侧栏中的“动词和文件关联”)。事实是,如果该命令键名为 runas,则所调用的命令将提示进行提升。这就使我可以创建以下 PowerToy:
这些 PowerToy 分别为 HTA、Windows PowerShell 和 Windows 脚本宿主文件类型添加了一个“以管理员身份运行”资源管理器上下文菜单项(如图 1 所示)。ElevateWSHScript.inf 还会添加一个“使用命令提示符以管理员身份运行”菜单项。(请在安装前阅读 ElevatePowerShellScript.inf 中的说明。)
runas 命令技术几乎可应用于任何文件类型。例如,Windows Vista 中的 Windows 安装程序设计为:当安装某个程序包需要进行提升时“采取正确的措施”。但是,在 UAC 打开的情况下,某些设计不够精良的程序包(例如,其中未正确标记自定义操作)将无法正确安装,除非在提升的命令提示符下使用 msiexec.exe 进行安装。
为了能够在资源管理器中直接完成此任务,我创建了 ElevateMSI.inf。此工具克隆了 Windows 安装程序包 (.msi) 和修补程序 (.msp) 的默认操作以便为程序包添加“以管理员身份安装”上下文菜单选项,并为修补程序添加“以管理员身份应用修补程序”上下文菜单选项。
以管理员身份在此处打开 CMD 和 PowerShell 提示符
最 常用的 Windows PowerToy 之一就是古老的“在此处打开命令(或 CMD)提示符”。安装此 PowerToy 后,您可以在 Windows 资源管理器中右键单击某个文件夹或驱动器,然后从上下文菜单中选择“在此处打开命令提示符”。这将以所选文件夹为当前目录打开一个命令提示符。
由 于这非常方便,因此我会在一天中频繁使用此 PowerToy。当我尝试学习和使用 Windows PowerShell 时,我发现自己需要同样的功能。因此,我创建了“在此处打开 PowerShell 提示符 PowerToy”(请参阅侧栏中的“旧的 PowerToy 重获新生”)。
但至此仍然不够:很多时候我 希望能够使用提升的特权打开外壳提示符。这导致了最后两个 PowerToy 的诞生:“以管理员身份在此处打开命令提示符”(CmdHereAsAdmin.inf) 和“以管理员身份在此处打开 PowerShell 提示符”(PowerShellHereAsAdmin.inf、elevate.cmd、elevate .vbs),如图 2 所示。这两个 PowerToy 与其未经提升的对应项(为方便起见,我们将其包含在代码下载中)的工作方式相同。
要安装这些 PowerToy,请右键单击相应的 INF 文件,选择“安装”,并批准提升。要将其卸载,请使用“控制面板”中的“程序和功能”选项。
如 果您深入到 INF 文件之内并想了解为什么这三个 PowerToy 将 elevate.cmd 和 elevate.vbs 安装到不同的位置,我会加以解释。多数 PowerToy 都是通过在注册表中向相应对象类型的 HKEY_CLASSES_ROOT\objecttype\Shell 项添加一个 runas 子项来实现的。
但 是,对于某些 PowerToy,我希望某些对象类型能有两个上下文菜单项来引起提升(对于 Drive 和 Directory 对象类型,为“以管理员身份在此处打开命令提示符”和“以管理员身份在此处打开 PowerShell 提示符”;对于所有 WSH 对象类型,为“以管理员身份运行”和“使用命令提示符以管理员身份运行”)。由于每个对象类型只能有一个 runas 项,因此我不得不通过调用 elevate 命令来实现第二个操作。但是,由于我希望每个 INF 能够独立安装和卸载,所以必须将关联的 elevate.cmd 和 elevate.vbs 副本放在不同的位置。(您不能根据原始 INF 文件递增文件的使用计数。诚然,MSI 安装程序会更好些,但我需要的是能够使用文本编辑器创建和修改的安装程序。)这种处理的一个不利方面是只有使用 runas 项实现的上下文菜单项才会在菜单中显示一行。
总结
我 希望您发现这些工具很有用,并能改善您的 UAC 体验。或许它们还会激发您创建自己的 PowerToy 的兴趣。(对于那些在 Windows Vista 上使用其他脚本语言(如 Perl 或 Python)的人们,为那些语言创建“提升脚本”PowerToy 也应当不难。)对于所有 PowerToy 工具,我们不提供相应支持,一切风险自负。不过无论如何,希望您在提升中找到乐趣!
查看本文来源
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者