关注我的 previous question我现在正在尝试通过 NSIS 代码执行批处理文件,以便在解压缩后成功设置 postgres 安装。批处理文件包含初始化数据库的命令,但由于权限限制而失败。我在 Win7 x64 PC 上。我的用户帐户是管理员,我使用 Run as administrator
选项启动 Setup.exe。这是我得到的错误:
C:\Program Files (x86)\Poker Assistant>cd "pgsql\bin" C:\Program Files (x86)\Poker Assistant\pgsql\bin>initdb -U postgres -A password --pwfile "pwd.txt" -E utf8 -D "..\data" The files belonging to this database system will be owned by user "Mandarinite".
This user must also own the server process.
The database cluster will be initialized with locale "Bulgarian_Bulgaria.1251". initdb: could not find suitable text search configuration for locale "Bulgarian_ Bulgaria.1251" The default text search configuration will be set to "simple".
Data page checksums are disabled.
creating directory ../data ... initdb: could not create directory "../data": Permission denied
编辑: 在对安装程序稍作修改后,我找到了问题的根源。当安装在 Program Files 文件夹中时,我无法以任何方式执行以下命令:
initdb -U postgres -A password --pwfile "pwd.txt" -E utf8 -D "..\data"
我尝试从 .bat 文件。我尝试从 .cmd 文件。我从命令提示符手动尝试。我尝试以管理员身份启动。所有尝试都导致了 Permission denied
错误
EDIT2:我没有找到任何解决问题的方法,所以我做了一个解决方法。现在我分发 postgres,其数据目录已经初始化。然后我只需要创建服务并启动它。
最佳答案
我刚刚意识到这里的问题是什么。
如果您以管理员身份运行 postgres
,它会使用特殊的 Windows API 调用来删除权限(获取受限 token ),这样它就可以在没有完全管理员权限的情况下运行安全。参见 PostgreSQL utilities and restricted tokens on windows .
我怀疑这里发生的事情是 initdb
没有创建目标数据目录并在这样做之前设置它的权限,所以它放弃了权限然后没有没有创建数据目录的权限。
要解决这个问题,只需简单地 md ..\data
创建空目录,然后在尝试 之前使用
。或者,更好的是,将其存储在更合适的位置,例如 icacls.exe
授予适当的权限初始化数据库%PROGRAMDATA%\MyApp\pgdata
或其他地方;应用程序数据不应进入%PROGRAMFILES%
。
关于postgresql - 使用 SIS 执行 postgres dbinit 的批处理文件给出了被拒绝的权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30936467/