使用NSIS为postgre dbinit执行批处理文件会拒绝权限

时间:2015-06-19 10:59:54

标签: postgresql batch-file permissions nsis

关注我previous question我现在尝试通过NSIS代码执行批处理文件,以便在解压缩后成功设置postgres安装。批处理文件包含用于初始化数据库的命令,但由于权限限制而失败。我在Win7 x64 PC上。我的用户帐户是管理员,我使用Run as adminitrator选项启动Setup.exe。这是我得到的错误:

  

C:\ Program Files(x86)\ Poker Assistant> cd" pgsql \ bin"   C:\ Program Files(x86)\ Poker Assistant \ pgsql \ bin> initdb -U postgres -A   密码   --pwfile" pwd.txt" -E utf8 -D" .. \ data"属于该数据库系统的文件将归用户" Mandarinite"。

所有      

此用户还必须拥有服务器进程。

     

将使用区域设置初始化数据库群集   " Bulgarian_Bulgaria.1251&#34 ;. initdb:找不到合适的文本搜索   区域设置" Bulgarian_ Bulgaria.1251"默认文字   搜索配置将设置为"简单"。

     

禁用数据页校验和。

     

创建目录../data ... initdb:无法创建目录   " ../ data":权限被拒绝

编辑:在使用安装程序修补一下后,我找到了问题的根源。当安装位于Program Files文件夹中时,我无法以任何方式执行以下命令:

initdb -U postgres -A password --pwfile "pwd.txt" -E utf8 -D "..\data"

我试过.bat文件。我试过.cmd文件。我尝试从命令提示符手动。我尝试以管理员身份启动。所有尝试都导致Permission denied错误

EDIT2:我没有找到解决问题的方法,所以我做了一个解决方法。现在我分发postgres,其数据目录已经初始化。然后我只需要创建服务并启动它。

1 个答案:

答案 0 :(得分:2)

我刚刚意识到这里的问题是什么。

如果您以管理员身份运行postgres,它会使用特殊的Windows API调用删除权限(获取受限制的令牌),以便在没有完全管理员安全权限的情况下运行它。请参阅PostgreSQL utilities and restricted tokens on windows

我怀疑这里发生的是initdb创建目标数据目录并在执行此操作之前设置其权限,因此它会删除权限和然后没有权限来创建数据目录。

要解决此问题,只需md ..\data创建空目录,然后在尝试icacls.exe之前使用initdb授予适当的权限。或者,更好的是,将它存储在更合适的地方,如%PROGRAMDATA%\MyApp\pgdata或其他任何地方;应用程序数据应该进入%PROGRAMFILES%