安全性

针对 Windows Vista 的新提升 PowerToy

Michael Murgolo

 

概览:

  • 以管理员身份运行第三方脚本工具
  • 以其他用户身份运行
  • 以系统身份在此处打开 CMD 提示符和 Windows PowerShell 提示符
  • 拖放式提升小工具

下载本文中所用的代码: Elevation2008_06.exe (197KB)

欢迎使用针对 Windows Vista 的新提升 PowerToy 的另一个版本。在 2007 年 6 月的《TechNet 杂志》期刊中,我曾详细介绍过它。**现在已经过去一年了。此次,我要向您展示如何将“以管理员身份运行”功能应用于

我喜欢的一些第三方脚本工具,并演示如何取代 Windows Vista® 中已取消的一项便捷 Windows® XP 功能,另外介绍提升 PowerToy 中提供的一些便捷工具。

以管理员身份运行其他脚本工具

在上一篇文章(网址为 technet.microsoft.com/magazine/cc162321.aspx)中,我曾介绍过针对本机 Windows 脚本工具启用“以管理员身份运行”选项的主题。在本文中,我为一些第三方脚本工具创建了“以管理员身份运行”PowerToy:

上述每个工具的代码都包含在本文的下载中,可在 technetmagazine.com 中找到。实际使用的文件名分别为 ElevateAutoIt3.inf、ElevateAutoHotKey.inf、ElevatePerlScript.inf 和 ElevateKiXtart.inf。对于 AutoIt v3、AutoHotkey 和 ActivePerl 而言,安装过程非常简单。只需下载相应的应用程序并将其安装在默认位置即可。安装所需的应用程序后,即可为每个工具安装合适的“以管理员身份运行”PowerToy。

遗憾的是,KiXtart 2010 没有提供安装程序。因此,为确保将 KiXtart 安装到标准位置以使我的 PowerToy 正常工作,我提供了一个 INF 文件,此文件用于将 KiXtart 2010 (v 4.60) 安装到 Program Files\KiXtart 下,并注册 .kix 文件扩展名。

请访问 www.kixtart.org/?p=downloads 下载 KiX2010_460.zip,并将其解压到某个文件夹中。将 Install_KiXtart.inf 文件(包含在本文随附的代码下载中)复制到同一文件夹下。然后右键单击 Install_KiXtart.inf 并选择“安装”。这样,您就可以轻松安装 ElevateKiXtart.inf PowerToy 了。

“以其他用户身份运行”PowerToy

创建用户帐户控制 (UAC) 后,用户(甚至是管理员用户)可以使用标准用户权限运行大多数应用程序,从而使操作系统不易被恶意软件破坏。UAC 可以提升管理任务及其他应用程序功能。右键单击可执行文件可找到“以管理员身份运行”选项,通过该选项可实现这种提升。我在 2007 年 6 月刊中讨论的提升 PowerToy 扩展了此项功能,使其可用于其他文件和对象类型。

此功能内置于 Windows Vista 中,对于许多管理任务而言,它确实很有效。但是,Windows Vista 忽略了一种重要情形。许多 IT 部门有这样一项策略:网络管理员使用一个用户帐户执行日常任务(使用电子邮件、创建文档等),而另一个帐户专用于网络管理(或本地计算机管理)。

这样一来,如果网络管理员在执行日常任务时不慎运行了恶意软件,则不会危及整个系统(或管理员所在的域),从而可降低风险。在 Windows XP 上,这可以使用“以...身份运行”右键单击选项实现。但是 Windows Vista 中已取消此选项,而由“以管理员身份运行”选项取代。

不过,Windows Vista 中保留了 runas 命令行工具。遗憾的是,此工具无法用于最常用的双帐户任务 — 运行 Microsoft® 管理控制台 (MMC) 管理单元。例如,假设已委派您在 Active Directory® 中执行一些帐户管理任务。您正在以标准用户身份执行日常任务,并且您的网络管理帐户也是启用了 UAC 的 Windows Vista 计算机上本地管理员组中的一个成员(这样您可以根据需要安装网络管理工具)。现在,您要使用您的 Active Directory 管理帐户启动 Active Directory 用户和计算机 (ADU&C),并尝试使用 runas 命令,如下所示:

runas /user:mydomain\admin
"mmc.exe %windir%\system32\dsa.msc"

遗憾的是,这并不能启动 ADU&C。您会收到一条 runas 错误,显示“请求的操作需要提升”。此时,MMC 可执行文件被标记为以 highestAvailable 权限级别运行。您的网络管理帐户的 highestAvailable 级别是管理员,因此以这种方式启动 ADU&C 需要提升;而 runas 不会引发提升提示,所以就发生了此项错误。

由于 Windows Vista 既没有提供“以...身份运行”上下文菜单项,也没有提供能够以需要提升的其他用户身份运行进程的内置方法,要解决此情形中出现的问题就很困难。

如果没有针对此情形的解决方案,本文会让人感到非常沮丧。幸运的是,我的一个原始的提升 PowerToy 就为解决第二个问题提供了关键的切入点;而关于第一个问题,我已经找到了另一种解决办法。(此解决方案是 Windows AppCompat 团队的 Gov Maharaj 发现的,我可不敢将这份功劳据为己有,呵呵!)

这就证明了提升命令 PowerToy 可以与 runas 命令一起使用。上一个命令无法引发提升提示,但以下命令就可以:

runas /user:mydomain\admin
"elevate mmc.exe%windir%\system32\dsa.msc"

这样,runas 就会以其他用户身份启动 elevate.cmd(从技术角度讲,正在启动的进程是 cmd.exe),而提升命令会使用提升提示启动 mmc.exe。

最后,我将此方法与针对 .exe 和 .msc 文件的文件关联结合使用,并提供了 HTML 应用程序用户界面以创建一个 PowerToy,使用该 PowerToy 即可创建通过右键单击菜单来启用的“以其他用户身份运行”选项。当选择“以其他用户身份运行”时,会出现如图 1 所示的 HTML 应用程序。

图 1 “以其他用户身份运行”工具

图 1** “以其他用户身份运行”工具 **(单击该图像获得较大视图)

此处只需输入用户名和域(使用本地计算机上的帐户),选中“使用本地帐户”复选框。然后,您可以单击“运行”按钮以标准用户身份启动该应用程序,或者单击“以管理员身份运行”按钮使用提升权限启动该应用程序。单击上述任一按钮后,runas.exe 就会运行并提示您输入密码或智能卡 PIN。

此 PowerToy 要用到提升命令 PowerToy,所以需要首先安装它。然后右键单击 RunAs.inf 文件,选择“安装”,并批准提升。要卸载此工具,可使用“程序和功能”控制面板。

您会看到“管理工具”(如“计算机管理”)中的部分 .msc 文件快捷方式将使用此 PowerToy。但请注意,如果您使用 adminpak.msi 安装 Windows Server® 2003 管理工具,则创建的快捷方式不是 .msc 文件的标准快捷方式。此时将显示 Windows Installer 快捷方式,所以 Windows 资源管理器不会显示这些快捷方式的“以其他用户身份运行”选项。

对于这些快捷方式,您必须找到实际的 .msc 文件并且右键单击,或为 .msc 文件创建新的快捷方式。此外,runas 不适用于 Internet Explorer®,这是因为 Internet Explorer 针对 Windows Vista 中的保护模式进行了重新构建(在 support.microsoft.com/?id=922980 中可找到关于此问题的更多信息)。

备注:在完成这些 PowerToy 后到发表本文前的这段时间里,Windows Sysinternals 发布了一个新工具,其功能与我的“以其他用户身份运行”PowerToy 非常相似。此工具称为 ShellRunas,可从 Windows Sysinternals 的网站找到,网址为:technet.microsoft.com/sysinternals/cc300361

因为 Sysinternals 的员工已编写了具体的代码,所以您可能更倾向于使用此工具。我决定将我的方法保留在本文中,作为一个示例,借以展示如何借助脚本代码使用 HTML 应用程序实现此特殊任务以及通常的 shell 扩展。

以系统身份在此处打开 CMD 提示符和 PowerShell 提示符

需要在本地系统上下文中运行程序的情况有多种。例如,多个软件分发工具(如系统中心配置管理器 (SCCM))使用以本地系统身份运行的客户端代理完成任务时。

要在尝试使用 SCCM 等产品进行分发前测试以本地系统身份运行的软件安装程序的行为,使用以本地系统身份运行的命令提示符启动此安装程序将非常有帮助。因此,我决定创建自己的“以系统身份在此处打开 CMD 提示符”和“以系统身份在此处打开 PowerShell 提示符”PowerToy。

在使用 Windows XP 时,我经常使用命令 shell 脚本实现此类功能:

@echo off
sc create CmdAsSystem type= own type= interact
binPath= "cmd /c start cmd /k (cd c:\ ^& color ec ^& 
title ***** SYSTEM *****)"
net start CmdAsSystem
sc delete CmdAsSystem

但是,如果您尝试在 Windows Vista 上从提升命令提示符运行它,将出现以下错误消息,并且不会出现以系统身份运行的命令提示符:

警告:服务 CmdAsSystem 被配置为交互式服务,其服务不受支持。该服务可能无法正常起作用。

问题在于此脚本将尝试创建并启动一项交互式服务,但交互式服务由于 Windows Vista 中的会话 0 隔离而无法正常工作。(有关会话 0 隔离的说明,请参见 microsoft.com/whdc/system/vista/Vista_Services.mspx 中提供的“Windows Vista 中的服务”白皮书。)

为解决此限制,我使用了 Sysinternals 开发的 Psexec 工具(请参见 technet.microsoft.com/sysinternals/bb897553.aspx)。此工具允许在系统上下文中启动进程。遗憾的是,多数 Sysinternals 工具都未提供安装程序。因此,我提供了一个 INF 文件(包含在代码下载中),用于将整个 Sysinternals 套件(包括 Psexec)安装到 Program Files\Sysinternals Suite 下。它还有另一个好处,即此 INF 文件将为套件的图形工具创建开始菜单快捷方式。

要安装套件,首先要从 technet.microsoft.com/sysinternals/bb842062.aspx 下载 SysinternalsSuite.zip,并解压到某个文件夹。将我的 INF 文件 (Install_SysinternalsSuite.inf) 复制到该文件夹,右键单击 Install_SysinternalsSuite.inf,然后选择“安装”。因为这些新的 PowerToy 使用提升命令 PowerToy,所以接下来要安装它。然后,您可以安装 CmdHereAsSystem.inf 和 PowerShellHereAsSystem.inf。安装好这些 PowerToy 后,在 Windows 资源管理器中右键单击文件和驱动器的项目,即可显示“以系统身份在此处打开 CMD 提示符”和“以系统身份在此处打开 PowerShell 提示符”选项,如图 2 所示。

图 2 “以系统身份在此处打开 CMD 提示符”和“以系统身份在此处打开 PowerShell 提示符”选项

图 2** “以系统身份在此处打开 CMD 提示符”和“以系统身份在此处打开 PowerShell 提示符”选项 **

图 3 显示了以系统身份运行的 CMD 提示符。我选择使用亮色来表示此提示符正在以系统身份运行,如果输入了错误的命令,将对系统执行异常(并且具有破坏性)的操作。

图 3 以系统身份运行 CMD 提示符必须小心谨慎

图 3** 以系统身份运行 CMD 提示符必须小心谨慎 **

最后,这些 PowerToy 会向系统添加一些命令,以便在“运行”对话框或 CMD 提示符中启动这些提示符。例如,从“运行”对话框中执行以下命令将在 Windows 文件夹中以系统身份启动 CMD 提示符:

cmdassystem "c:\windows"

Windows PowerShell TM 的等效命令是 psassystem。您应该已经注意到,我还修改了在此处以管理员身份运行 CMD 和 PowerShell 提示符 PowerToy,分别为其安装了类似的命令 cmdasadmin 和 psasadmin。

提升小工具

我的大多数 PowerToy 都要求单击鼠标右键。但此更新还包含一个有用的小工具。这是一个 Windows 边栏小工具,我把它称为提升小工具(如图 4 所示)。它是一个拖放式工具,只需从定义了 runas 操作的 Windows 资源管理器中拖动可执行文件或脚本,它们就会以已提升状态启动。

图 4 拖放式提升小工具

图 4** 拖放式提升小工具 **

如果您安装了我以前提供的提升 PowerToy,那么本次更新将适用于 Windows Script Host 脚本、Windows PowerShell 脚本、HTML 应用程序和 Windows Installer 包及修补程序(以及 Windows Vista 中默认定义了 runas 操作的可执行文件和命令外壳脚本)。此外,您还可以一次拖动多个项目(只尝试向此小工具拖动一个文件夹,观察会发生什么)。

要安装这个小工具,请双击 Elevation.gadget(包含在代码下载中)。若要查看这个小工具的代码,只需在文件名中添加 .cab 扩展名即可。这样您就可以提取 CAB 文件中的内容了。

结束语

本文的下载不仅包含新的 PowerToy,还包含以前的文章中介绍的 PowerToy。我对原来的一些 PowerToy 做了一点改动。例如,原始的“在此处以管理员身份运行 Windows PowerShell Prompt”和“提升 WSH 脚本”都安装了各自的 elevate.cmd 和 elevate.vbs 副本。因为一些新的 PowerToy 也依赖这些文件,所以我对这些工具进行了更改,要求安装提升命令 PowerToy(这样它们就可以共享该副本)。要确定 PowerToy 是否要求安装提升命令 PowerToy,请查看 INF 文件的标题。

一些其他的原始 PowerToy 也进行了细微的非功能性更改。在安装最新版本之前,请务必卸载旧版的 PowerToy。由于此工具集现已扩展为包含 17 个工具,所以我提供了一些命令壳脚本以安装和卸载整个工具集(分别为 InstallAllPowerToys.cmd 和 UninstallAllPowerToys.cmd)。您可以对其进行自定义,使其仅安装和卸载所需的工具。

您应该记住,默认情况下 InstallAllPowerToys.cmd 不会为第三方脚本工具安装“以管理员身份运行”PowerToy。您可以修改此脚本使其仅为您安装了软件的第三方脚本工具安装那些 PowerToy。运行任一工具时,都将重新启动以提升自身。UninstallAllPowerToys.cmd 还会删除这些工具的所有旧版本。

与我的所有 PowerToy 一样,这是一些不受支持、风险自担的工具。它们也不是 Microsoft 官方产品 — 都是我个人开发的。这些产品只有我和其他几位志愿者在默认语言为英语的 32 位 Windows Vista 上进行了测试。最后,其中的部分或全部 PowerToy 可能不适用于将来的 Windows 更新版本、Service Pack 或操作系统版本。

Michael Murgolo 是 Microsoft Consulting Services 的一名高级基础结构顾问。他关注的领域包括操作系统、部署、网络服务、Active Directory、系统管理、自动化和修补程序管理。他是桌面部署和迁移领域的主题事项专家。

© 2008 Microsoft Corporation 和 CMP Media, LLC。保留所有权利;未经允许不得复制本文的部分或全部内容.