有什么方法可以迫使通常需要管理员特权(通过UAC)的程序在没有它们的情况下运行? (即:没有UAC提示符,也没有系统范围的访问权限。)

添加:无需修改可执行文件本身。


尽管James回答了,但我还是找到了几乎可以完成的几种方法:


通过修改可执行文件,我可以从清单(或整个清单)中删除trustInfo条目,因此我可以使用外部的,允许程序在没有UAC的情况下启动。不幸的是,这会修改可执行文件,因此由于内部校验和测试而很快退出。
通过使用Process Explorer,我可以以受限用户身份启动它。但是,这似乎极大地限制了它(它像保护模式IE一样运行,因此可以访问的数量大大少于我的标准未提升用户的访问权限)。


评论

您指定不修改可执行文件,但是修改.exe是您尝试的方法之一?

@ekaj我只在发现它不起作用后才指定它;)

即使您不再使用它,也可以指定该程序吗?这可能有助于人们了解需要管理员权限的尝试访问的内容

@ekaj不幸的是没有。但是,它并不特别相关:UAC由程序在过程创建期间要求提升的程序触发(通常的方式-在这种情况下-是带有清单的)。进程一旦启动,就无法更改其海拔状态-无论它尝试访问什么受限资源。

如果程序没有清单,并且拒绝以无管理员权限运行,则很可能是由于UAC安装程序检测所致。我发布了这个问题,misha256有一个很好的解决方案。我测试了一下,可以确认它是否有效。 superuser.com/questions/857616/…我进行了一些研究,发现没有理由进行安装程序检测。请注意,如果管理员特权是由于清单中的trustinfo条目引起的,显然这将不起作用。

#1 楼

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\forcerunasinvoker]
@="Run without privilege elevation"

[HKEY_CLASSES_ROOT\*\shell\forcerunasinvoker\command]
@="cmd /min /C \"set __COMPAT_LAYER=RUNASINVOKER && start \"\" \"%1\"\""


将此文本保存在<name_of_file>.reg中,并将其添加到Windows注册表中。 (双击即可解决问题。)

然后,右键单击要在没有管理特权的情况下运行的应用程序,然后选择“在没有特权提升的情况下运行”。

在某些情况下-少量0.1%的程序可能会询问有关UAC提示的两次。

评论


我曾经使用过Application Compatibility Toolkit填充程序,但这对于每个可执行文件来说都是很多工作,并且在每个文件的注册表中也会留下垃圾。这种方法有效,我更喜欢它。

– Ben Voigt
13年4月17日在21:28

接受它似乎是最直接的方法,而且我(最终!)已经能够对其进行验证。还有一个很好的属性,它可以一次性用作命令行(删除外部的“,然后将\”变成“”)。

–安德鲁·罗素(Andrew Russell)
2014年12月29日15:33

我有与@Derek相同的问题,该应用程序似乎不断向UAC索要,我不相信它具有系统范围的访问权限,但我需要它的功能。

– Gizmo
15年3月11日在22:19

通过将以下项更改为以下项,可以将其添加到注册表中,仅适用于当前登录的用户:HKEY_CURRENT_USER \ Software \ Classes * \ shell \ forcerunasinvoker和HKEY_CURRENT_USER \ Software \ Classes * \ shell \ forcerunasinvoker \ command

– GodEater
16 Mar 3 '16 at 11:36



@ jpmc26我认为/ min是错误。没有该解决方案,其工作原理完全相同。 Vom必须混合了cmd和启动开关。似乎cmd.exe没有抱怨错误的开关。例如,尝试使用cmd / whatever。

– cdlvcdlv
17年7月2日,11:50



#2 楼

保存到nonadmin.bat

cmd /min /C "set __COMPAT_LAYER=RUNASINVOKER && start "" %1"


现在您可以将程序拖放到此以在没有管理员的情况下运行它们。

这不需要管理员特权,就像更改该注册表项一样。同样,您也不会弄乱上下文菜单。

基于Vom的回答


更新:现在应该也可以使用名称中带有空格的程序。

评论


我在需要访问我的驱动器的某些程序上进行了尝试,但它无法检测到它们或无法正常工作:/(例如,rufus rufus.akeo.ie)

–keinabel
16年4月11日在19:04

@keinabel这可能是因为他们实际上需要管理员才能工作。该脚本适用于需要管理员特权而无需实际执行需要特权的程序。对驱动器的原始访问是一种典型的管理方式。

– Hjulle
16年4月11日在19:23

很简约!能够使用此方法安装XAMPP。

–克里希那拉(Krishnaraj)
16年8月8日在9:31

对于“ C:\ Program Files \ ...”目录中的任何可执行文件,这似乎都不适合我。我得到Windows找不到'C:\ Program'。确保正确键入了名称,然后重试。我已经几次尝试了此命令,但略有变化,没有运气。有任何想法吗?

–杰克·史密斯(Jake Smith)
16-09-30在18:09

文件在带空格的文件夹中的位置与我有同样的问题。解决了它,删除了一些双引号:cmd / min / C“ set __COMPAT_LAYER = RUNASINVOKER && start”“%1”

– ragnar
17年2月13日在17:30



#3 楼

我希望我参加聚会不是太晚,但我一直在寻找类似的问题,而在这里没有看到答案,我发现Windows内置的RunAs命令在以管理员身份运行时可以通过/trustlevel开关来实现。 />
RUNAS /trustlevel:<TrustLevel> program

/showtrustlevels  displays the trust levels that can be used
                  as arguments to /trustlevel.
/trustlevel       <Level> should be one of levels enumerated
                  in /showtrustlevels.


在我的情况下有效。
具有讽刺意味的是,显式地启动程序而没有提升功能则需要提升的命令提示符。去搞清楚。 :)
希望对您有所帮助。

评论


我可以确认这行不通。我刚刚对其进行了测试,并收到一个错误:“ RUNAS错误:无法运行-(此处为程序名称)。请求的操作需要提升”。

–user1258361
2014年12月28日下午3:21

@ user1258361您必须从提升的提示符下运行此命令,就像我用黑体写的一样。

– Mxx
2014年12月28日下午4:01

在Windows 7上似乎不需要提升提示...

– SamB
2015年9月9日下午1:23

使用提升的提示进行了测试,使用了命令行runas / trustlevel:0x20000(程序),程序仍然以admin身份运行。供参考,0x20000是基本用户。

–user1258361
17年1月15日在23:21

需要提升的命令提示符...当然可以。否则,您已经没有管理员权限,开始的任何过程也将缺少它们。

–我说恢复莫妮卡
18年1月20日在2:24

#4 楼

如果您有一个特定的应用程序要始终在不使用UAC的情况下运行,则可以将其定位为注册表(将文本添加到REG文件中并将其导入到注册表中):

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers]
"C:\example\application.exe"="RunAsInvoker"


与该答案不同,此解决方案不需要单击或更改用户交互。

Microsoft将此过程添加为RunAsInvoker“兼容垫片”。

评论


一个不同但相关的问题的答案为该答案提供了灵感。

–palswim
16-9-09在20:17



非常感谢你!这是唯一对我有用的东西!我有一个从Windows上下文菜单中调用的Application,尽管总是从其他地方正确调用它,但它总是以管理员身份出现。修复之后,该应用程序开始被正确调用。

–用户
17年5月6日在17:55

#5 楼

如果它是需要管理特权的安装(安装)exe文件,那么有一个技巧可以在没有提升访问权限的情况下运行它:

如果文件名包含诸如setupinstall之类的单词,则Windows将以提升的访问权限强制运行该文件即使它不需要提升的访问权限,也是如此:



如果.exe文件中包含清单,则这些提升的启发式方法将不适用。

例如,如果清单文件指示exe不需要提升,甚至在文件名中包含这些单词中的任何一个,都不会使其以提升状态运行。

另一个关键字是patch作为

记录在UAC(用户帐户控制)文档中:


安装程序检测会检测安装文件,这有助于防止安装

安装程序检测仅适用于:


32位可执行文件。
没有请求的执行级别属性的应用程序。
以启用UAC的标准用户身份运行的交互式进程。

在创建32位进程之前,请检查以下属性以确定它是否为安装程序:


文件名包含诸如“安装”,“设置”或“更新”之类的关键字。
...



此处阅读模式:https://docs.microsoft.com/zh-cn/windows/security/identity-protection/user-account-control/how-user-account-control-works

评论


当然,这仅在应用程序清单未明确指定必须提升运行时有效。

–丹尼尔B
19年1月25日在11:57

@DanielB:实际上,此技巧仅在没有清单时有效

– AntoineL
19 Mar 5 '19在15:33

已投票。好观察。官方文档的链接也很好。

–丹尼斯·尼古拉连科
19年7月22日在20:25

@DenisNikolaenko Ty,添加源:)

–沙燕
19年7月22日在20:45

另一个关键字是“补丁”。只适合通过Google搜索的人。

– Mgamerz
19年11月16日在21:23

#6 楼

我今天使用MS应用程序定制工具包解决了这个问题。

我遵循了一篇技术共性文章中的说明。

基本上:

1)您可以从MS这里获得工具包。

2)单击修复

3)选择RunAsInvoker选项

4)右键单击修复并选择安装

评论


您的答案与预期效果完全相反。最初的问题是如何强制要求提升特权的应用程序不提升运行。您的答案仍然使用UAC,但只是禁用了该提示。这个问题的答案是错误的。

– Mxx
2014年1月22日14:07

@mxx实际上没有。如果当前用户受到限制(或您已启用UAC),则该过程将以完全受限的特权启动。

– LogicDaemon
15年3月29日在9:54

@LogicDaemon如果您实际阅读了这篇文章,您将看到它说明,如果您按照这些步骤进行操作,则将以管理员身份运行应用程序而没有UAC提示。这与OP要求的相反。

– Mxx
15年3月29日在14:35

@mxx不。在technet上阅读RunAsInvoker实际做什么。尽管这仅适用于较旧的应用程序,但这确实是topicstarter要求的。

– LogicDaemon
2015年3月30日11:53



只要父级资源管理器,非管理员cmd或任何其他标准进程为父进程,RunAsInvoker将以相同的受限权限运行。 (默认情况下,Explorer运行受限制,否则它将永远不会要求您提升删除文件的权限。)即使对于新应用程序,它实际上似乎也可以使用。 RunAsInvoker表示它继承了完全相同的ACL令牌。

– SilverbackNet
15-10-30在5:59



#7 楼

在他的问题中,安德鲁指出以下内容无法完全发挥作用:


通过修改可执行文件,我可以从
清单(或整个清单)中删除trustInfo条目。我可以使用外部的),
允许程序在没有UAC的情况下启动。不幸的是,这会修改
可执行文件,因此由于内部校验和测试而很快退出。


我能够为该文件修改外部.manifest文件。我正在使用的软件并进行了更改

<ms_asmv2:requestedExecutionLevel level="requireAdministrator" uiAccess="false" />



<ms_asmv2:requestedExecutionLevel level="asInvoker" uiAccess="false" />

原来我使用的软件没有确实需要管理员权限,因此我可以在没有UAC或管理员密码的情况下以标准用户帐户运行它。谢谢!

评论


相反,编辑可执行文件可能会更容易,因为清单可能只是包含在文件中。请注意,名称空间前缀ms_asmv2:也可能被省略。另外,更改嵌入式xml块的大小可能会破坏二进制文件,因此应将“ requireAdministrator”更改为“ asInvoker”,并在uiAccess之前加空格。

– kdb
19年2月13日在16:33



#8 楼

我通过更改包含该程序的文件夹的权限来解决此问题。

我添加了将运行该程序的每个用户,并赋予了他们“完全控制”权限。那解决了这个问题,我没有选择“以管理员身份运行”。

对于要运行该程序的用户,我没有任何安全方面的担忧。

#9 楼

不,如果程序需要UAC,则它正在尝试访问其沙箱之外的内容。如果没有提升的访问权限,该程序将无法正确运行。

如果您只想摆脱通知,则可以禁用UAC。

在Windows Vista上禁用UAC:开始,输入“用户”。点击“用户帐户”。在弹出的窗口中,单击“用户帐户控制设置”,然后关闭UAC。

在Windows 7上禁用UAC:开始,键入“用户”。单击“用户帐户控制设置”。将选择栏一直拖动到底部,直到“从不通知”。

评论


禁用UAC不是我要实现的目标。另外:您对UAC的工作方式的描述仅在一般意义上是正确的。程序在严格不需要UAC时可能会请求UAC。而且,UAC发生在程序启动之前-一旦运行,一旦超出权限,它只会得到权限拒绝的错误。

–安德鲁·罗素(Andrew Russell)
2010年8月4日在14:32

除了语义之外,您不能为特定程序“禁用” UAC通知,同时仍然限制其访问权限。

–詹姆斯·瓦特(James Watt)
2010年8月4日14:47

詹姆斯:实际上-看起来可以-我已经更新了我的问题。

–安德鲁·罗素(Andrew Russell)
2010年8月4日在16:11

除了修改程序代码本身,如果您找到一个可行的解决方案,我将很想知道。

–詹姆斯·瓦特(James Watt)
2010年8月5日,下午5:17