当前位置:首页 > 技术与方案 > Windows应用

Windows Vista的脚本提升PowerToy

(2012-09-15 09:51:37)

在Windows vista引进的诸多安全性功能中,用户帐户控制(UAC)是最重要的功能之一。使用用户帐户控制,即便是管理员用户也使用标准特权来运行大多数应用程序,但是针对特定管理任务和应用程序功能具有“提升权限的可能”。

在使用Windows Vista一段较长的时间后,根据需要来提升任务和应用程序的权限已渐成自然。不过,在Windows Vista中尝试提升某些类型的任务时,我也遇到许多不便之处,令人感到沮丧。

因此,本着以前的Windows PowerToys的精神,我创建了一些脚本提升PowerToy来克服这些限制。您可以在位于TechNet的代码下载中找到我将要讨论的所有PowerToy。您还可以参阅2006年11月AlexHeaton的文章“用'用户帐户控制'实现非管理员操作之梦”,了解UAC是如何工作的(请参阅“更多资源”侧栏)。

下载 Windows Vista的脚本提升PowerToy

提升命令PowerToy

第一件令人不快的事情是无法从命令行或“运行”对话框提升应用程序。因此在Microsoft内部进行了广泛咨询后,我从JohnStephens(Microsoft的软件设计工程师)那里得到了一个示例脚本,提供了我所需要的信息。事实上,如果您将动词“runas”传递给ShellExecuteAPI或其COM等效项(Shell.Application的ShellExecute方法),所启动的应用程序将提示进行提升(有关详细信息,请参阅侧栏)。这就允许我创建了第一个提升PowerToy—提升命令PowerToy。

此工具(由ElevateCommand.inf、elevate.cmd和elevate.vbs文件组成)将向您的系统添加一个elevate命令。这允许您从命令行、脚本或“运行”对话框中启动提示进行提升的应用程序。例如,以下命令将用记事本打开Win.ini(在提示进行提升之后):

elevatenotepadc:WindowsWin.ini在WindowsScriptHost(WSH)、WindowsPowerShell #8482;或其他脚本中使用elevate命令时,需要将脚本宿主可执行文件(如wscript、CScript或powershell)指定为该应用程序。例如,要运行vbs,您需要使用如下代码:

elevatewscript“C:windowssystem32slmgr.vbs”–dli帮助文本对此进行了解释。使用带-?参数或不带任何参数的elevate命令可查看帮助文本。

以管理员身份运行脚本

另一个不便之处是对于大多数Windows脚本类型,没有“以管理员身份运行”上下文菜单选项(当您在资源管理器中右键单击文件时)。命令外壳脚本(那些带有.bat和.cmd文件扩展名的文件)是一个例外。因此我开始对此进行调查。

对于各种文件类型,许多上下文菜单选项都是通过注册表的HKEY_CLASSES_ROOT部分中的“object”类型的命令键控制的(有关详细信息,请参阅侧栏中的“动词和文件关联”)。事实是,如果该命令键名为runas,则所调用的命令将提示进行提升。这就使我可以创建以下PowerToy:

提升HTML应用程序PowerToy(ElevateHTA.inf)

提升WindowsPowerShell脚本PowerToy(ElevatePowerShellScript.inf)

提升WSH脚本PowerToy(ElevateWSHScript.inf、elevate.cmd、elevate.vbs)

这些PowerToy分别为HTA、WindowsPowerShell和Windows脚本宿主文件类型添加了一个“以管理员身份运行”资源管理器上下文菜单项(如图1所示)。

ElevateWSHScript.inf还会添加一个“使用命令提示符以管理员身份运行”菜单项。(请在安装前阅读ElevatePowerShellScript.inf中的说明。)

 

 


“以管理员身份运行”上下文菜单选项
提升其他文件类型

runas命令技术几乎可应用于任何文件类型。例如,Windows vista中的Windows安装程序设计为:当安装某个程序包需要进行提升时“采取正确的措施”。但是,在UAC打开的情况下,某些设计不够精良的程序包(例如,其中未正确标记自定义操作)将无法正确安装,除非在提升的命令提示符下使用msiexec.exe进行安装。

为了能够在资源管理器中直接完成此任务,我创建了ElevateMSI.inf。此工具克隆了Windows安装程序包(.msi)和修补程序(.msp)的默认操作以便为程序包添加“以管理员身份安装”上下文菜单选项,并为修补程序添加“以管理员身份应用修补程序”上下文菜单选项。

以管理员身份在此处打开CMD和PowerShell提示符

最常用的WindowsPowerToy之一就是古老的“在此处打开命令(或CMD)提示符”。安装此PowerToy后,您可以在Windows资源管理器中右键单击某个文件夹或驱动器,然后从上下文菜单中选择“在此处打开命令提示符”。这将以所选文件夹为当前目录打开一个命令提示符。

由于这非常方便,因此我会在一天中频繁使用此PowerToy。当我尝试学习和使用WindowsPowerShell时,我发现自己需要同样的功能。因此,我创建了“在此处打开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_ROOTobjecttypeShell项添加一个runas子项来实现的。

但是,对于某些PowerToy,我希望某些对象类型能有两个上下文菜单项来引起提升(对于Drive和Directory对象类型,为“以管理员身份在此处打开命令提示符”和“以管理员身份在此处打开PowerShell提示符”;对于所有WSH对象类型,为“以管理员身份运行”和“使用命令提示符以管理员身份运行”)。

由于每个对象类型只能有一个runas项,因此我不得不通过调用elevate命令来实现第二个操作。但是,由于我希望每个INF能够独立安装和卸载,所以必须将关联的elevate.cmd和elevate.vbs副本放在不同的位置。(您不能根据原始INF文件递增文件的使用计数。诚然,MSI安装程序会更好些,但我需要的是能够使用文本编辑器创建和修改的安装程序。)这种处理的一个不利方面是只有使用runas项实现的上下文菜单项才会在菜单中显示一行。



我希望您发现这些工具很有用,并能改善您的UAC体验。或许它们还会激发您创建自己的PowerToy的兴趣。(对于那些在Windows Vista上使用其他脚本语言(如Perl或Python)的人们,为那些语言创建“提升脚本”PowerToy也应当不难。)对于所有PowerToy工具,我们不提供相应支持,一切风险自负。不过无论如何,希望您在提升中找到乐趣!

 

更多
关闭窗口 打印 
网站首页    -    联系我们    -   收藏本站    -    网站地图                                                               客户服务热线:0571-85023000
本网站所有网页信息已申请知识产权和著作权保护,版权归四海光纤公司所有,未经授权禁止任何人复制或镜像,违者必究。
公司主营:杭州光纤光缆视频会议系统,是专业的通信网络工程、视频会议系统建设专家

中华人民共和国备案号:浙ICP备10018243号