现在 windows 下管理员权限有被滥用的趋势,很多程序安装时只是解压文件,不需要创建服务,修改驱动等,使用时也不涉及系统底层的操作,可以说是全程都不需要管理员权限,可是却在编译时就加上了 UAC 运行级别。还有一些程序比如一些软件下载网站上下载到的智能下载器,它也是添加了 UAC 运行级别,强迫以管理员身份运行,然后顺便安装一堆流氓软件。这些程序要么以管理员身份运行,然后被它恶心一下,要么无法运行。 那么有没有什么办法让那些带有 UAC 盾标的程序以非管理员身份运行?
PS:顺便吐槽一下,其实 windows 操作系统会根据程序的需要强迫用户以管理员身份运行该程序,这种设计有点为虎作伥的感觉。
1
zhjits 2020-04-24 00:04:40 +08:00
改 manifest
|
2
Cooky 2020-04-24 00:09:46 +08:00 via Android
沙盘
|
3
yanqiyu 2020-04-24 00:12:26 +08:00 via Android
安装程序的话可以直接解压看看能不能用
|
4
shansing 2020-04-24 00:13:02 +08:00 5
试试在 PowerShell 中执行这个再运行程序?
$env:__COMPAT_LAYER = 'RunAsInvoker' ref: https://geelaw.blog/entries/isolate-app/ |
5
szzhiyang 2020-04-24 00:23:45 +08:00 via iPhone
这些应用程序完全可以在拿不到管理员权限时主动拒绝运行,所以即便能以非管理员身份运行它们又有何用?
|
6
szzhiyang 2020-04-24 00:30:24 +08:00 via iPhone
即便应用程序没有在清单中申请管理员权限(也就是它没有盾牌图标),它照样可以强迫你以管理员身份运行它,它在拿不到管理员权限时主动退出不就行了?
|
8
szzhiyang 2020-04-24 00:40:20 +08:00 via iPhone
@ysc3839 绝大多数需要管理员权限才能运行的应用程序即便不主动检测自己是否有管理员权限也照样会在运行过程中崩溃的,因为这些应用程序的开发者一般都不会处理应用程序因没有管理员权限而产生的异常(比如无法写入 Program Files 文件夹或 HKLM 注册表等),而没有处理异常就会造成应用程序的崩溃。
|
9
szzhiyang 2020-04-24 00:49:32 +08:00 via iPhone
不仅仅是 Windows,任何操作系统(包括 iOS )下的应用程序都完全可以在拿不到自己想要的权限时主动退出,iOS 应用程序之所以很少这样做仅仅是因为有 Apple 的审核罢了。
|
10
ysc3839 2020-04-24 01:41:53 +08:00 via Android 1
@szzhiyang 但是楼主所说的是不需要在这些地方写入,但是又申请了管理员权限的程序。
另外,尝试向没有权限写入的地方写入并不会产生异常,Win32 API 是 C 语言风格的,没有异常机制,需要程序主动检查返回值才知道操作是否成功,如果忽略了返回值的话,程序会继续运行。 |
11
redeemer1001 2020-04-24 07:05:31 +08:00
|
12
xingfu0539 2020-04-24 08:42:22 +08:00 via Android
我了解的很多杀毒软件的一个思路,就是后台起一个高权限的服务,用这个服务来启动自己想要启动的进程,也就不用再申请管理员权限了
|
13
fujrkx OP @redeemer1001
你说的搜狗浏览器取消 UAC 请求后还会继续安装,是因为它安装在了家目录下的 appdata 文件夹里。不要把安装软件和管理员权限划上等号。软件安装时需要管理员权限是因为它想安装在所有用户公用的 peogram files 文件夹里或需要创建服务和修改驱动。 你觉得搜狗浏览器通过安装在 appdata 目录下来避开 UAC 提示属于流氓行为,但我不同意。事实上,我希望所有不需要高权限的软件都采取这种安装方式。这样可以确保它的安装过程仅限于解压文件,没有做其他流氓行为,方便清理,同时方便用多用户隔离来运行。 我反对的是很多软件明明只需要解压文件,明明可以安装在 appdata 目录下,却偏要安装在 program files 下,同时为此申请管理员权限。而一旦给了它权限,它就可以顺便做一些流氓行为。 |
15
ysc3839 2020-04-24 09:55:59 +08:00 via Android
@szzhiyang 那是因为语言 /框架封装了系统 API,并主动抛出了异常,不代表这个平台的所有程序都有这种特性。
|
16
szzhiyang 2020-04-24 10:05:06 +08:00 via iPhone
@ysc3839 总之,你所提到的虽然要求了管理员权限但是仍然能在没有管理员权限的情况下完全正常运行的应用程序实在是太少了,楼主的想法几乎没有多少实际应用价值。
|
17
g00001 2020-04-24 10:34:36 +08:00
管理权限的启动警告有一些规避的方法,例如安装一个后台服务,或者以管理权限创建一个计划任务,都能做到下次启动不弹警告,但这样实质上还是有管理权限(但对用户会更友好)。
很多软件功能确实可能要用到管理权限 - 哪个软件开发者都不会无故要讨人厌,Windows 自己判断是不是要管理权限不太靠谱,例如文件名或者版本信息里有疑似安装的字眼 - 都会强迫安装程序以管理权限启动,只要小心避免触发这些规则 - 就可以避免这一问题。 |
18
shansing 2020-04-24 11:07:49 +08:00
@szzhiyang 我来告诉你楼主的想法有什么价值。通过我所发链接的方法,已经成功安装(过):
- 百度网盘 - Chrome (虽然本身也支持普通用户安装) - Firefox (虽然本身也支持普通用户安装) - QQ 音乐 (可以安装,使用时提示提权,不授权好像无大碍) - 阿里旺旺 - 微信 - 腾讯会议 (需要一点小技巧才能运行) 瞧,对付某些喜欢改系统的软件非常有用。你的理论分析很有道理,但也许安装程序本身不会崩溃,只是其调用的对系统进行修改的外部程序会崩溃,而安装程序只是等待外部程序结束而没有判断返回状态呢。确实有些程序仍然不受(那个命令所设置的)环境变量的限制,但其他情况下只要我们设置恰当的安装目录,这个技巧没有那么没用。 |
19
szzhiyang 2020-04-24 11:33:30 +08:00
@shansing 你确实成功以非管理员身份安装了它们,但是不常规的安装方式是出乎它们开发者意料的,对它们功能的干扰也是难以估计的,因此它们运行时会发生什么意料之外的事情是难以确定的。
|
20
Keyes 2020-04-24 11:36:39 +08:00 via iPhone
我是放到 sandboxie 里运行的,包括 qq 、百度网盘什么的
|
21
sleepm 2020-04-24 11:47:04 +08:00
你可以试试用 7zip 解压安装文件,然后运行里面的可执行文件
我试了百度云是可以正常运行的 流氓软件要区别对待,要么不装,要么扔虚拟机或者沙盒里 |
22
Jirajine 2020-04-24 12:07:51 +08:00 via Android
对我来说虚拟机还是首选,这种方式的隔离程度不足,既不能保证卸载的干净,也不能保证数据卷不被读取。
当然还有一种方法,在虚拟机里用管理员权限安装,手动分析并“绿化”,然后打包成 appx 自签名后安装。 |
23
mainjzb 2020-04-24 12:16:56 +08:00
这个背锅人应该是微软。因为系统设计的太乱。
我是做游戏相关的产业。见过太多太多的人,莫名其妙的把游戏文件放在一些只读的或者权限不足的文件夹里。游戏启动各种报错。直接程序设定管理员启动完事大吉。这些小白用户根本就啥都不懂。也不会弄。 |
24
May725 2020-04-24 13:04:47 +08:00
昨天就遇到类似的问题, 我编译一个读写文件的 exe,发现加了自动加了盾牌,后来才查到 由于名称中含有 update 字样,自动加了请求管理员权限, “Installer Detection Technology”,很迷惑的操作。
|
25
laqow 2020-04-24 13:07:00 +08:00 2
if NOT EXIST "%~1" (
goto EOF ) :start call:CHECK "%~1" if (%return%)==(true) ( cmd /min /C "set __COMPAT_LAYER=RUNASINVOKER && start "" %~1" ) :CHECK set "return=false" if ("%~x1")==(".exe") set return=true goto :EOF |
26
shansing 2020-04-24 13:56:58 +08:00
|
27
redeemer1001 2020-04-24 13:58:25 +08:00
@fujrkx #13 我没说它流氓,我说它贱😁
|
28
illl 2020-04-24 14:03:58 +08:00 via iPhone
这是想 bypass 啊
|
29
crella 2020-04-24 14:27:06 +08:00 via Android
windows 上,虽然把在“启动”目录添加程序的快捷方式也可以让程序开机启动,但是大多数非必要程序都是添加到系统服务或者添加到任务计划,而后两者是要管理员权限的,一般用户不用 360 等软件也删不掉这个开机启动。
还是要恰饭啊,windows 上非行业用的桌面软件好像是挺难赚钱的,所以才一个个加开机启动或设置浏览器首页。 |
30
crella 2020-04-24 14:30:46 +08:00 via Android
|
31
LokiSharp 2020-04-24 14:41:07 +08:00
可以按需申请,但是大多数人都不这么干
|
32
shansing 2020-04-24 14:43:01 +08:00
@crella 你忽略了注册表,注册表才是最常用来注册启动项的方式。添加启动项并不一定需要管理员权限。只要在注册表 `HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run` 添加项即可。由于 HKEY_CURRENT_USER 是当前用户相关,并不需要进行提权;我刚试了 reg 命令,和某飞机,添加项时并不提示需要管理员权限。相对于添加注册表项,注册服务或者添加计划任务显得像是“滥用”。
|
33
crazykylin 2020-04-24 18:12:35 +08:00
https://github.com/xyx0826/AsInvoker
你是说这种的降权? |
34
g00001 2020-04-24 18:54:48 +08:00 2
可以写个小程序自动清除 EXE 文件的管理权限,几句代码就可以了,用 aardio 写了个例子:
import fsys.res; //读取 manifest var exePath = "C:\Users\g00001\Desktop\test.exe"; module = ::Kernel32.LoadLibraryExP(exePath,,2) var manifestData = fsys.res.loadRes(1,24,path); ::Kernel32.FreeLibrary(module); //清除管理权限 manifestData = ..string.replace(manifestData ,"\<requestedPrivileges\>.+?\<\/requestedPrivileges\>" ,`<requestedPrivileges><requestedExecutionLevel level="asInvoker" uiAccess="false" /></requestedPrivileges>`) //更新 EXE var resFile = fsys.res.open( exePath ) resFile.update(24,1,manifestData,0 ) resFile.close(); 运行一下 UAC 图标就没有了。 如果要界面也简单,也要不了几句代码: 把 EXE 往里一拖,UAC 图标就没了。 |
35
wxch111vv 2020-04-25 02:00:07 +08:00
所以我能在 scoop 上安装就用 scoop
|