我正在尝试使用SaferCreateLevel
SAFER_LEVELID_UNTRUSTED
更安全的级别启动流程(任何流程)为“不信任”:
允许程序执行时只能访问授予开放知名群组的资源,阻止访问管理员和高级用户权限以及个人授予的权限。
使用Michael Howards的代码DropMyRights MDSN文章(Browsing the Web and Reading E-mail Safely as an Administrator)伪代码是:
//get a handler on a Safer level
hSaferLevel = SaferCreateLevel(SAFER_SCOPEID_USER, SAFER_LEVELID_UNTRUSTED);
//Create a security token out of the safer level handle
hSecurityToken = SaferComputeTokenFromLevel(hSaferLevel);
//Create process as user
CreateProcessAsUser(hSecurityToken, "myapp.exe");
除了该过程无法启动:
应用程序无法正确启动(0xc0000142)。
这里发生了什么?
注意:在SAFER_LEVELID_NORMALUSER
处启动流程正常工作:
允许程序以没有管理员或高级用户用户权限的用户身份执行。软件可以访问普通用户可访问的资源。
虽然现在每个人都已经作为“普通用户”运行,但它的价值却很小。
我的应用 能够处理以“低”用户身份运行。
最终目标是使用与 MandatoryIntegrity \ Low 进程相同的privelages运行该进程(尽管未标记为“低”)。所以我测试了那个。
我使用icacls
标记my application to run Mandatory Integrity Level\Low:
C:\Develop>icacls RTMS.exe /setintegritylevel Low
processed file: RTMS.exe
Successfully processed 1 files; Failed processing 0 files
我的应用程序正确启动,并且运行在低完整性级别:
虽然我可能能够使用AddMandatoryAce
API,或者自己在安全令牌中使用ACL,但我很好奇UNTRUSTED
更安全的级别 - 以及为什么我可以'得到任何东西发射。
注意:在Windows 7上,如果您将calc
或notepad
标记为/setintegritylevel low
,它们将无法启动(无错误,只是永远不会出现),甚至though this MSDN article talks about using calc as a test of low integrity level:
答案 0 :(得分:1)
0xc0000142
= STATUS_DLL_INIT_FAILED
也许Process Monitor会给你一些线索?
对于大多数事情来说,{p>UNTRUSTED
可能过于严格了。您无法访问自己的个人资料,例如:
你试过CONSTRAINED
吗?
另一种方法是使用CreateRestrictedToken并计算一个足够限制的令牌。
我猜MS在NT6中忘记了Safer * Level功能,我们得到了UAC。 (XP上的RunAs GUI对话框具有保护我的计算机选项,但该对话框现已消失(即使在XP中,大多数情况下都是too restrictive))