☰
管理员账户下 PostgreSQL 起不来,我顺手改了个 UAC 设置,然后翻车了
2026/10/7 3:52:59 网站建设 项目流程

跑本地项目的开发环境,内置的 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 策略:EnableLUA=1、FilterAdministratorToken=0,已经回到原样;
  • 目录权限:icacls "E:\soft\FSCapture",Administrator明明有完全控制(F)。

按这个状态,没有任何理由打不开。直到我对文件本身敲了一条:

icacls "E:\soft\FSCapture\FSCapture.exe" → 拒绝访问。

连管理员都读不了这个文件的安全描述符。到这儿才算找到真正的病根:问题不在文件夹,在这个 exe 自己的 NTFS 权限上。前面改 UAC 只是个插曲,这个文件的问题是独立存在的,刚好在那几天一起冒出来。

为什么会这样?看目录 ACL 里那一串陌生的S-1-5-21-...就明白了——这个软件目录是从别的机器/别的账户复制过来的,权限清单跟着一起搬了过来。而 NTFS 的访问检查有两条很容易被忽略的规则:

  1. 拒绝优先。DACL 里只要有一条匹配你的Deny,哪怕同时存在Allow,照样拒绝。
  2. 读权限也需要权限。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 截图工具就已经可以正常打开了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询