
跑本地项目的开发环境内置的 PostgreSQL 直接给我甩了一句Execution of PostgreSQL by a user with administrative permissions is not permitted. The server must be started under an unprivileged user ID to prevent possible system security compromises.翻译过来就是PostgreSQL 不允许以管理员权限启动。我看了看自己的账户好家伙是系统内置的 Administrator。UAC 开着但这个内置账户默认不走管理员批准模式登录之后就是一份完整的管理员令牌它拉起来的任何进程都是提权的所以 PostgreSQL 死活不认。按规矩这时候正确姿势应该是换一个非管理员会话或者干脆用外部数据库。但我当时想的是能不能让这个账户也能跑非提权的进程于是我去动了一个 UAC 策略在管理员 PowerShell 里执行Set-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System -Name FilterAdministratorToken -Value 1 -Type DWord把它设成了1让内置管理员也遵循管理员批准模式默认用标准权限跑东西。设完重启PostgreSQL 那边是能继续折腾了——但整个系统开始不对劲了。一堆平时闭着眼都能打开的程序开始报错。最典型的是 FastStone Capture双击就弹Windows 无法访问指定设备、路径或文件。你可能没有适当的权限访问该项目。原因也简单这个策略一开整个登录会话都变成标准用户令牌了那些默认靠管理员权限运行的程序集体失能。这显然不是我想要的赶紧把值改回0重启。大部分程序恢复正常。但 FSCapture 还是打不开。这就有点意思了。我没有继续瞎猜先确认了几件事当前会话是不是管理员IsInRole(Administrator)返回True令牌是完整的UAC 策略EnableLUA1、FilterAdministratorToken0已经回到原样目录权限icacls E:\soft\FSCaptureAdministrator明明有完全控制(F)。按这个状态没有任何理由打不开。直到我对文件本身敲了一条icacls E:\soft\FSCapture\FSCapture.exe → 拒绝访问。连管理员都读不了这个文件的安全描述符。到这儿才算找到真正的病根问题不在文件夹在这个 exe 自己的 NTFS 权限上。前面改 UAC 只是个插曲这个文件的问题是独立存在的刚好在那几天一起冒出来。为什么会这样看目录 ACL 里那一串陌生的S-1-5-21-...就明白了——这个软件目录是从别的机器/别的账户复制过来的权限清单跟着一起搬了过来。而 NTFS 的访问检查有两条很容易被忽略的规则拒绝优先。DACL 里只要有一条匹配你的Deny哪怕同时存在Allow照样拒绝。读权限也需要权限。icacls要读 DACL需要READ_CONTROL被拒绝项挡住就只能报拒绝访问。好消息是 Windows 留了个后门文件的所有者永远可以修改 DACL。所以修复思路很清楚先拿回所有权再干掉那份坏掉的权限清单takeown /f E:\soft\FSCapture /r /d y icacls E:\soft\FSCapture /reset /t /c拆开说。takeown就是 take ownership把所有者改成当前登录用户/f E:\soft\FSCapture指定目标路径/r递归子目录和文件一起处理/d y递归过程中遇到没权限列出的目录、命令要问是否继续的时候自动回答 Yes免得卡住。它靠的是令牌里的SeTakeOwnershipPrivilege特权管理员默认就有所以必须用管理员身份跑。另外如果加/a所有权会交给 Administrators 组而不是当前用户我这次没加。icacls是管 DACL 的全称 Integrity Control ACLs/reset把对象上自己设置的ACL 全部删掉改成从父目录继承的默认权限/t递归整棵目录树/c个别文件出错也继续最后统一报错。真正治病的是reset这一步那堆带着外来 SID 和拒绝项的旧权限被整体抛弃目录重新跟随上级目录的干净权限访问自然就通了。为什么必须两条一起只reset不改所有者旧权限拒绝你写入你根本改不动只takeown不reset你是所有者了但拒绝项还在照样打不开。先用 takeown 夺回所有权拿到改权限的资格再用 icacls /reset 重置权限清单缺一不可。跑完这两条FSCapture 截图工具就已经可以正常打开了。