远程执行命令避免UAC提示
Workaround: Run commands remotely bypassing UAC prompt
前言
使用WindowsVista/7的用户都有这样的经历,每当你安装程序,或者变更被系统保护的资源——很多时候你也不知道到底哪些东西是被系统保护的,甚至一个没有有效签名的程序运行的时候,即便你是管理员用户登陆, Windows默认地都会暂时阻止该程序运行,并弹出一个提示框提示用户是否继续,直到用户人为确定后,才会继续运行该程序,这就是User Access Control(也就是UAC)的作用。
UAC的初衷是给系统安全带来了一层人为保障,通过引入电脑操作人员的人为参与,来提供“有效”的系统安全保护。UAC这个设计的原意是“好”的,而且的确提供了系统内置的保护措施,所以除非需要不要关闭它。但是过多的用户提示,确实也影响了用户的使用体验。在不关闭UAC的前提下,对于系统管理员,尤其是远程管理多台电脑时,带来了一定的不便。在不增加管理费用、购置昂贵管理软件的前提下,如何绕过UAC的提示,顺利完成批量管理任务,是一个挑战。
Runas为什么不适合?有人不禁会想到ruanas命令,虽然runas命令可以让管理员提升一个程序的运行权限并绕过UAC的提示窗口,但是不适合远程批量的执行,因为它依然要求在Command Prompt中输入管理员密码,而不能像类Unix系统的类似命令那样灵活,这意味着什么?当使用命令完成同一任务部署到多台电脑的时候,管理员需要登陆到每台机器手动操作,这样既低效又易出错。
虽说在大型网络管理环境中,可以使用诸如SCCM等的昂贵的管理软件进行软件管理或者通过Group Policy等方式对电脑和用户管理,不过一个免费便捷的并适合小任务部署的操作,提供给管理员以灵活和快捷的途径。我们这里实现一种免费而且完全使用Windows内置功能无需多余软件安装的方案,这样可以方便管理员远程部署任务。
目的和条件
我们的目的就是,在远程电脑上顺畅运行一个通常被 UAC 拦截的程序或命令文件。比如:执行命令 md %WinDir%\tmp ,这在普通的 Command Prompt 中会显示 Access is denied 。只有运行 runas 或者使用 Run as administrator 打开 Command Prompt 才能顺利完成,因为 %WinDir% 是被 UAC 保护的。如果使用诸如 psexec 来控制远程电脑执行上面的命令,也会执行失败。
这个方法的基本要求是:
- 管理员账户:至少具有远程电脑 管理 员权限的用户和密码,可以是 AD 上的 Workstation 的管理员组成员,或者是 Workstation 本地的管理员账号。
- DOS 命令:还有就是熟悉基本的 DOS 命令,因为后面会看到,我们的确需要命令行的操作,这样才能最大化的实现自动完成管理任务。
操作过程:
在一台测试机上,实现下面的各个步骤操作,
命令文件:
为了方便演示,我们使用下面的命令文件作为例子。使用任何文本编辑器,输入下面的命令,并保为C:\ProgramData\WinVer.cmd--C:\ProgramData文件夹相当于XP中的All Users:
systeminfo| find "OS Name" | find "Windows 7" if %ERRORLEVEL% NEQ 0 goto Other echo Windows 7 > C:\Windows\WinVer.txt goto END :Other Echo Other Windows > C:\Windows\WinVer.txt :END该批命令在C:\Windows中生成一个WinVer.txt文件。
尝试运行它,由于UAC保护下,该文件无法生成。
在实际操作中,可以是一个程序等,也可以有命令行参数。
创建一个Task模板 :
在Start菜单中输入Task,并选择运行Task Scheduler,或者在Control Panel的Administritive Tools中运行Task Scheduler程序。
在Actions中选择CreateTask…,在General标签中,在Name处填上一个名字,确定选择”Runwith highest privileges”和"Run whether user is logged on or not",见下图:
在Actions标签中,创建一个新的Action,选择Action为Start a Program,在Program/Script中选择上面我们创建的命令文件C:\ProgramData\WinVer.cmd。见下图:
点击OK按钮后确认保存。
因为新创建的Task不会被立刻显示,所以需要重新运行Task Scheduler程序,找到刚才创建的新Task,在Actions里面选择Export…,把这个Task保存为一个.xml文件,这个就是Task模板。下面使用test.xml文件名为例。
注意,一个在根下面的Task可能不能被有效运行,所以需要把它移动到一个目录中,比如可以移动到Microsoft下面。
测试Task模板
为了保证这个Task可以正常运行,我们需要先来测试有一下。运行下面的命令:
schtasks.exe /run /tn "\Microsoft\Test"
如果运行成功后,在C:\Windows\文件夹中应该有一个WinVer.txt文件。测试成功后就可以进行下一步了。
远程创建Task
前面的准备工作最罗嗦,从这里开始使用命令行最多。
上面,我们在本地机创建了一个Task,为了可以远程控制,我们需要把这个模板在远程机上创建一个相同的Task。很简单使用下面的命令:
schtasks.exe /create /S COMPUTER /U ADMINISTRATOR /P ADMIN_PASSWORD /RU R_ADMINISTRATOR /RP R_ ADMIN_PASSWORD /TN ”\Microsoft\Test“ /XML %USERPROFILE%\Desktop\Test.xml /F把其中的:
COMPUTER 换成远程电脑的名称
ADMINISTRATOR 和 ADMIN_PASSWORD 换成本地电脑管理员的用户名和密码
R_ADMINISTRATOR 和 R_ADMIN_PASSWORD 换成远程电脑管理员的用户名和密码
远程运行该Task
远程运行该Task使用下面的命令:
schtasks.exe/run /S COMPUTER /RU R_ADMINISTRATOR /RP R_ ADMIN_PASSWORD /tn "\Microsoft\Test"各参数说明见上创建Task。
远程删除该Task:
schtasks.exe/delete /S COMPUTER /RU R_ADMINISTRATOR /RP R_ ADMIN_PASSWORD /tn "\Microsoft\Test" /F各参数说明见上创建Task。
结束语:
有关schtasks的命令行参数详细解释参见有关说明。
我们这里只不过使用了Windows的Task服务的一个内置功能, 其实,一个具有相当权限的客户化的系统服务,同样是绕过UAC的一个思路 。
在危害Windows系统的病毒蠕虫木马等等多不胜堵的今天,杀毒防毒软件成了日常可以安全运行Windows系统不可或缺的一个部分,微软也出了自己的一个软件对付病毒,安全问题已经成为Windows继续发展的第一障碍。微软应该对此相当重视,不过有趣的是,Microsoft的技术人员发现,这不是他们技术人员可以控制的,他们的系统是无懈可击的,而是最终用户的责任和义务,最终用户应该具有慧眼识珠地辨别什么是对系统有危害的,什么是安全的操作,并可以清醒地理智地作出相应的反应,否则作为最终用户就负有对自己不负责任的行为负担相应后果的责任。于是,UAC闪亮登场了,用户被强行改变自己的操作行为参与到这个安全防护游戏中。
Windows系统的这种越来越依赖于用户GUI干预的安全设计思路,已经背离了电脑网络系统高效快捷安全的初衷。它在处理用户/程序/服务/设备等等系统相关权限的时候混乱的思路,不仅给用户带来了操作不便,也让自己走上了背离用户体验的道路。这与Apple注重用户体验的设计思路,完全不同。在如今Apple方式获得更多用户和市场认同的形势中,Microsoft是否也应该反思一下,提高用户体验度。
Tony Liu
June 20, 2012