postgresql - 使用 SIS 执行 postgres dbinit 的批处理文件给出了被拒绝的权限

标签 postgresql batch-file permissions nsis

关注我的 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/

相关文章:

python - Django 会是基于权限的网络应用程序的不错选择吗?

django - 允许用户访问管理员中的特定模型

sql - 使用 SQL 检测重叠的日期/时间记录并显示它与哪些记录重叠

postgresql - 如何在 PgAdmin、sql 中使用顺序和组更改行顺序?

sql - 使用 PostgreSQL 快速查找相似字符串

java - 在java中如何判断命令提示符实例何时关闭?

windows - 避免在 Windows 批处理文件中同时调用

Django 。我不能丢东西

python - Cython 包装器使用 cl.exe (windows) 将 .c 文件编译为 .pyd

mysql - 服务 mysql 启动在我的日志文件中留下 "privilege tables: Table ' mysql.user' 不存在“并且服务器失败