V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fujrkx
V2EX  ›  程序员

在 windows 下有没有什么办法让带有 UAC 盾标的程序以非管理员身份运行?

  •  
  •   fujrkx · 2020-04-23 23:41:30 +08:00 · 5579 次点击
    这是一个创建于 1680 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在 windows 下管理员权限有被滥用的趋势,很多程序安装时只是解压文件,不需要创建服务,修改驱动等,使用时也不涉及系统底层的操作,可以说是全程都不需要管理员权限,可是却在编译时就加上了 UAC 运行级别。还有一些程序比如一些软件下载网站上下载到的智能下载器,它也是添加了 UAC 运行级别,强迫以管理员身份运行,然后顺便安装一堆流氓软件。这些程序要么以管理员身份运行,然后被它恶心一下,要么无法运行。 那么有没有什么办法让那些带有 UAC 盾标的程序以非管理员身份运行?

    PS:顺便吐槽一下,其实 windows 操作系统会根据程序的需要强迫用户以管理员身份运行该程序,这种设计有点为虎作伥的感觉。

    35 条回复    2020-04-25 02:00:07 +08:00
    zhjits
        1
    zhjits  
       2020-04-24 00:04:40 +08:00
    改 manifest
    Cooky
        2
    Cooky  
       2020-04-24 00:09:46 +08:00 via Android
    沙盘
    yanqiyu
        3
    yanqiyu  
       2020-04-24 00:12:26 +08:00 via Android
    安装程序的话可以直接解压看看能不能用
    shansing
        4
    shansing  
       2020-04-24 00:13:02 +08:00   ❤️ 5
    试试在 PowerShell 中执行这个再运行程序?
    $env:__COMPAT_LAYER = 'RunAsInvoker'

    ref: https://geelaw.blog/entries/isolate-app/
    szzhiyang
        5
    szzhiyang  
       2020-04-24 00:23:45 +08:00 via iPhone
    这些应用程序完全可以在拿不到管理员权限时主动拒绝运行,所以即便能以非管理员身份运行它们又有何用?
    szzhiyang
        6
    szzhiyang  
       2020-04-24 00:30:24 +08:00 via iPhone
    即便应用程序没有在清单中申请管理员权限(也就是它没有盾牌图标),它照样可以强迫你以管理员身份运行它,它在拿不到管理员权限时主动退出不就行了?
    ysc3839
        7
    ysc3839  
       2020-04-24 00:32:26 +08:00 via Android
    @szzhiyang 但是有的程序就没检测,不试试怎么知道呢?
    szzhiyang
        8
    szzhiyang  
       2020-04-24 00:40:20 +08:00 via iPhone
    @ysc3839 绝大多数需要管理员权限才能运行的应用程序即便不主动检测自己是否有管理员权限也照样会在运行过程中崩溃的,因为这些应用程序的开发者一般都不会处理应用程序因没有管理员权限而产生的异常(比如无法写入 Program Files 文件夹或 HKLM 注册表等),而没有处理异常就会造成应用程序的崩溃。
    szzhiyang
        9
    szzhiyang  
       2020-04-24 00:49:32 +08:00 via iPhone
    不仅仅是 Windows,任何操作系统(包括 iOS )下的应用程序都完全可以在拿不到自己想要的权限时主动退出,iOS 应用程序之所以很少这样做仅仅是因为有 Apple 的审核罢了。
    ysc3839
        10
    ysc3839  
       2020-04-24 01:41:53 +08:00 via Android   ❤️ 1
    @szzhiyang 但是楼主所说的是不需要在这些地方写入,但是又申请了管理员权限的程序。
    另外,尝试向没有权限写入的地方写入并不会产生异常,Win32 API 是 C 语言风格的,没有异常机制,需要程序主动检查返回值才知道操作是否成功,如果忽略了返回值的话,程序会继续运行。
    redeemer1001
        11
    redeemer1001  
       2020-04-24 07:05:31 +08:00
    @ysc3839 #10 如果是.net 的安装器就会崩溃
    PS:我所知的是搜狗浏览器的安装,会弹出 UAC 请求管理员权限,但取消后,它还会继续安装……真是贱
    xingfu0539
        12
    xingfu0539  
       2020-04-24 08:42:22 +08:00 via Android
    我了解的很多杀毒软件的一个思路,就是后台起一个高权限的服务,用这个服务来启动自己想要启动的进程,也就不用再申请管理员权限了
    fujrkx
        13
    fujrkx  
    OP
       2020-04-24 09:40:56 +08:00   ❤️ 1
    @redeemer1001
    你说的搜狗浏览器取消 UAC 请求后还会继续安装,是因为它安装在了家目录下的 appdata 文件夹里。不要把安装软件和管理员权限划上等号。软件安装时需要管理员权限是因为它想安装在所有用户公用的 peogram files 文件夹里或需要创建服务和修改驱动。
    你觉得搜狗浏览器通过安装在 appdata 目录下来避开 UAC 提示属于流氓行为,但我不同意。事实上,我希望所有不需要高权限的软件都采取这种安装方式。这样可以确保它的安装过程仅限于解压文件,没有做其他流氓行为,方便清理,同时方便用多用户隔离来运行。
    我反对的是很多软件明明只需要解压文件,明明可以安装在 appdata 目录下,却偏要安装在 program files 下,同时为此申请管理员权限。而一旦给了它权限,它就可以顺便做一些流氓行为。
    szzhiyang
        14
    szzhiyang  
       2020-04-24 09:54:29 +08:00 via iPhone
    @ysc3839 用 C# 编写的应用程序就会如此。
    ysc3839
        15
    ysc3839  
       2020-04-24 09:55:59 +08:00 via Android
    @szzhiyang 那是因为语言 /框架封装了系统 API,并主动抛出了异常,不代表这个平台的所有程序都有这种特性。
    szzhiyang
        16
    szzhiyang  
       2020-04-24 10:05:06 +08:00 via iPhone
    @ysc3839 总之,你所提到的虽然要求了管理员权限但是仍然能在没有管理员权限的情况下完全正常运行的应用程序实在是太少了,楼主的想法几乎没有多少实际应用价值。
    g00001
        17
    g00001  
       2020-04-24 10:34:36 +08:00
    管理权限的启动警告有一些规避的方法,例如安装一个后台服务,或者以管理权限创建一个计划任务,都能做到下次启动不弹警告,但这样实质上还是有管理权限(但对用户会更友好)。

    很多软件功能确实可能要用到管理权限 - 哪个软件开发者都不会无故要讨人厌,Windows 自己判断是不是要管理权限不太靠谱,例如文件名或者版本信息里有疑似安装的字眼 - 都会强迫安装程序以管理权限启动,只要小心避免触发这些规则 - 就可以避免这一问题。
    shansing
        18
    shansing  
       2020-04-24 11:07:49 +08:00
    @szzhiyang 我来告诉你楼主的想法有什么价值。通过我所发链接的方法,已经成功安装(过):

    - 百度网盘
    - Chrome (虽然本身也支持普通用户安装)
    - Firefox (虽然本身也支持普通用户安装)
    - QQ 音乐 (可以安装,使用时提示提权,不授权好像无大碍)
    - 阿里旺旺
    - 微信
    - 腾讯会议 (需要一点小技巧才能运行)

    瞧,对付某些喜欢改系统的软件非常有用。你的理论分析很有道理,但也许安装程序本身不会崩溃,只是其调用的对系统进行修改的外部程序会崩溃,而安装程序只是等待外部程序结束而没有判断返回状态呢。确实有些程序仍然不受(那个命令所设置的)环境变量的限制,但其他情况下只要我们设置恰当的安装目录,这个技巧没有那么没用。
    szzhiyang
        19
    szzhiyang  
       2020-04-24 11:33:30 +08:00
    @shansing 你确实成功以非管理员身份安装了它们,但是不常规的安装方式是出乎它们开发者意料的,对它们功能的干扰也是难以估计的,因此它们运行时会发生什么意料之外的事情是难以确定的。
    Keyes
        20
    Keyes  
       2020-04-24 11:36:39 +08:00 via iPhone
    我是放到 sandboxie 里运行的,包括 qq 、百度网盘什么的
    sleepm
        21
    sleepm  
       2020-04-24 11:47:04 +08:00
    你可以试试用 7zip 解压安装文件,然后运行里面的可执行文件
    我试了百度云是可以正常运行的
    流氓软件要区别对待,要么不装,要么扔虚拟机或者沙盒里
    Jirajine
        22
    Jirajine  
       2020-04-24 12:07:51 +08:00 via Android
    对我来说虚拟机还是首选,这种方式的隔离程度不足,既不能保证卸载的干净,也不能保证数据卷不被读取。
    当然还有一种方法,在虚拟机里用管理员权限安装,手动分析并“绿化”,然后打包成 appx 自签名后安装。
    mainjzb
        23
    mainjzb  
       2020-04-24 12:16:56 +08:00
    这个背锅人应该是微软。因为系统设计的太乱。
    我是做游戏相关的产业。见过太多太多的人,莫名其妙的把游戏文件放在一些只读的或者权限不足的文件夹里。游戏启动各种报错。直接程序设定管理员启动完事大吉。这些小白用户根本就啥都不懂。也不会弄。
    May725
        24
    May725  
       2020-04-24 13:04:47 +08:00
    昨天就遇到类似的问题, 我编译一个读写文件的 exe,发现加了自动加了盾牌,后来才查到 由于名称中含有 update 字样,自动加了请求管理员权限, “Installer Detection Technology”,很迷惑的操作。
    laqow
        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
    shansing
        26
    shansing  
       2020-04-24 13:56:58 +08:00
    @szzhiyang 你这么说完全不会有错。但是当预料功能是让 TaobaoProtect.exe 自启并常驻后台时,我宁愿不要。
    @Jirajine 如果你使用多用户(“以其他身份运行”),并恰当配置 NTFS 卷相应目录的 ACL (或者干脆就利用现有配置,比如将重要数据放到用户目录),Windows 会帮你阻止隔离程序访问敏感数据的。
    redeemer1001
        27
    redeemer1001  
       2020-04-24 13:58:25 +08:00
    @fujrkx #13 我没说它流氓,我说它贱😁
    illl
        28
    illl  
       2020-04-24 14:03:58 +08:00 via iPhone
    这是想 bypass 啊
    crella
        29
    crella  
       2020-04-24 14:27:06 +08:00 via Android
    windows 上,虽然把在“启动”目录添加程序的快捷方式也可以让程序开机启动,但是大多数非必要程序都是添加到系统服务或者添加到任务计划,而后两者是要管理员权限的,一般用户不用 360 等软件也删不掉这个开机启动。

    还是要恰饭啊,windows 上非行业用的桌面软件好像是挺难赚钱的,所以才一个个加开机启动或设置浏览器首页。
    crella
        30
    crella  
       2020-04-24 14:30:46 +08:00 via Android
    @shansing 我现在把敏感数据放 vhd 了,系统是 win7,要用到的时候就双击一下 bat 脚本挂载它。

    不过 7z 和某些 winPE 常用软件可以直接解压 vhd
    LokiSharp
        31
    LokiSharp  
       2020-04-24 14:41:07 +08:00
    可以按需申请,但是大多数人都不这么干
    shansing
        32
    shansing  
       2020-04-24 14:43:01 +08:00
    @crella 你忽略了注册表,注册表才是最常用来注册启动项的方式。添加启动项并不一定需要管理员权限。只要在注册表 `HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run` 添加项即可。由于 HKEY_CURRENT_USER 是当前用户相关,并不需要进行提权;我刚试了 reg 命令,和某飞机,添加项时并不提示需要管理员权限。相对于添加注册表项,注册服务或者添加计划任务显得像是“滥用”。
    crazykylin
        33
    crazykylin  
       2020-04-24 18:12:35 +08:00
    https://github.com/xyx0826/AsInvoker
    你是说这种的降权?
    g00001
        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 图标就没了。
    wxch111vv
        35
    wxch111vv  
       2020-04-25 02:00:07 +08:00
    所以我能在 scoop 上安装就用 scoop
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1092 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 22:34 · PVG 06:34 · LAX 14:34 · JFK 17:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.