欢迎光临 Enjoy IT (ITECN.NET) 登录 | 注册 | 帮助

解决bug,让普通用户也能使用shutdown命令

版权声明:本文改写自Aaron Margosis的《Workaround for Shutdown.exe LUA bug》,添加部分内容,原文UR如下:
https://blogs.msdn.com/aaron_margosis/archive/2006/01/27/518214.aspx

本文假设Admin是管理员帐户,Test是普通用户帐户。

很多用户很喜欢使用shutdown命令,因为不仅可以使用该命令定时关闭本地计算机,还可以很方便地关闭或者重启远程计算机。但是非常奇怪的是,只有普通用户才能充分享用shutdown带来的便利,而普通用户则无此福分。如果企图在普通用户权限下用shutdown关机,就会收到“客户端没有所需的特权”的错误信息。
可能是因为简化开发步骤,shutdown被设计为不管是本地、还是远程关机/重启,都必须同时激活两个特权:一个是“关闭系统”(SeShutdownPrivilege)特权,还一个是“从远端系统强制关机”(SeRemoteShutdownPrivilege)特权。问题就在这里,普通用户没有“从远端系统强制关机”特权,所以无法借助shutdown关机或者重启。

实验查看shutdown必须激活两个特权

可以借助Tokenmon工具来验证shutdown关机需要同时激活两个特权:
(1) 登录到Test帐户环境下,注意这是一个普通用户帐户。
(2) 借助runas命令以Admin身份运行Tokenmon,设置过滤器为“shutdown*”,runas的命令可以是:
     runas /user:admin Tokenmon
(3) 打开cmd命令提示符窗口,运行以下命令:
     shutdown -s

(4) 将会收到“客户端没有所需的特权”的错误信息,这时候查看Tokenmon窗口,将会发现shutdown命令企图激活(enable)两个特权:SeShutdownPrivilege和SeRemoteShutdownPrivilege,如附图所示:

实验结果也能证明shutdown确实需要同时激活两个特权,尽管本地关机/重启原本不需要SeRemoteShutdownPrivilege特权,但是shutdown还是非常“固执”地拒绝执行。

解决方案

到这里,解决思路似乎已经非常明朗了,只需要给users组帐户添加SeRemoteShutdownPrivilege特权即可。这种方法确实能够达到目的,但是Aaron Margosis并不这样认为,他建议的方法是给INTERACTIVE组帐户添加SeRemoteShutdownPrivilege特权,这是为什么?
原来这是为了防止远程攻击,由于只有交互登录用户的访问令牌里才有INTERACTIVE组的SID,所以可以确保远程恶意代码被排除在外。
首先做一个小实验,看看当前登录帐户Test所属的组:
很简单,打开一个CMD命令提示符窗口,运行以下命令:
whoami/groups
命令结果类似如下显示,可见交互登录帐户的访问令牌里有INTERACTIVE组的SID:
C:\>whoami/groups
[Group  1] = "TestLab\None"
[Group  2] = "Everyone"
[Group  3] = "BUILTIN\Users"
[Group  4] = "NT AUTHORITY\INTERACTIVE"
[Group  5] = "NT AUTHORITY\Authenticated Users"
[Group  6] = "LOCAL"

然后介绍如何给INTERACTIVE组添加SeRemoteShutdownPrivilege特权,Aaron Margosis在他的文章里介绍可以在本地安全策略里的本地策略→用户权利指派里找到“从远端系统强制关机”特权,然后在其属性对话框里添加INTERACTIVE组,如附图所示:


这里补充另外一种方法,可以借助Ntrights命令达到目的,只需在命令提示符下运行以下命令即可:
Ntrights -u Interactive +r SeRemoteShutdownPrivilege

给INTERACTIVE组添加了SeRemoteShutdownPrivilege特权后,注销Test帐户并重新登录,该Test帐户的访问令牌会自动获得SeRemoteShutdownPrivilege特权,可以在命令提示符下运行以下命令进行验证:
whoami /all
运行命令的结果如附图所示:

现在尝试在普通用户环境里使用shutdown关闭本地或者远程计算机,应该可以顺利完成了。

工具箱

Tokenmon:http://www.sysinternals.com/Utilities/Tokenmon.html
Whoami:属于Support Tools工具包,位于Windows XP安装光盘的SUPPORT\TOOLS目录下,双击其下的setup程序即可安装
Ntrights:属于Windows Server 2003 Rource Kit Tools工具包,可以到微软官方网站搜索下载。

写在最后:Windows 2000/XP等即将退休的Windows产品,未能充分照顾到LUA的需要,有小部分功能组件可能有不合理的地方,例如本例的shutdown命令,还有修改时区,也需要管理员权限。至于第三方应用程序,也有很多没有考虑到LUA的需要,例如QQ,就不能在普通用户帐户下运行(当然解决办法很多,例如给其安装目录赋予users组Full Control权限)。这种情况在Windows Vista将会得到根本的解决。

已发表 2006年3月23日 13:01 作者 ahpeng

评论通知

如果您想在帖子更新时接到邮件通知,请先登录。这里

订阅帖子评论使用 RSS

评论

2006年3月24日 9:38 by Sucirst

# re: 解决bug,让普通用户也能使用shutdown命令

sysinternals网站的工具确实非常好用哦 呵呵
这篇文章也解决了前两天在新闻组中的一个疑问,就是有人问到是否shutdown命令会被恶意病毒利用,看了这篇文章,我想,关键在于是否病毒能够取SeRemoteShutdownPrivilege特权。而流行的病毒一般会由administrators用户安装或者运行在更高的system权限下,这样看来要取得shutdown的两个特权理论上还是做的到的,
盆盆老师你看我说的对么? :P
2006年3月24日 10:09 by ahpeng

# re: 解决bug,让普通用户也能使用shutdown命令

To Sucirst:你观点的前提是病毒已经通过admin或者system权限侵入系统,这是非常危险的,可以做几乎任何事情。
这和本文是两回事,病毒拿到admin权限的话,不需要任何修改,因为管理员组成员本身具有SeRemoteShutdownPrivilege特权。
2007年1月15日 15:21 by yruoke

# re: 解决bug,让普通用户也能使用shutdown命令

看了彭老师的文章,确实感觉受益非浅,可是我在我的xp pro上试的时候,只要一运行“token monitor”的主程序,机器就会重启,重启后会提示“系统从一个严重错误中恢复”。这是事件日志中的注释,麻烦您看一下。

错误代码 100000be,参数1 804e3784,参数2 004e3121,参数3 f2ec02a8,参数4 0000000b。

有关更多信息,请参阅在 http://go.microsoft.com/fwlink/events.asp 的帮助和支持中心。

说说您的看法?

(必填) 
必填 
(必填)