使用NSIS执行Postgre数据库初始化的批处理文件时出现权限被拒绝的错误。

4

根据我之前的问题,我现在正在尝试通过NSIS代码执行批处理文件,以便在解压后成功设置postgres安装。批处理文件包含初始化数据库的命令,但由于权限限制而失败。我使用Win7 x64 PC。我的用户帐户是管理员,并使用以管理员身份运行选项启动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" 此数据库系统所属的文件将由用户"Mandarinite"拥有。

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

数据库群集将使用地区设置为"Bulgarian_Bulgaria.1251"。 initdb:找不到适合的文本搜索配置以供地区"Bulgarian_ Bulgaria.1251"使用 默认的文本搜索配置将设置为"simple"。

数据页校验和已禁用。

创建目录../data ... initdb:无法创建目录"../data":拒绝访问

编辑:在调整了安装程序后,我更深入地了解了问题的根源。无论如何,当安装在Program Files文件夹中时,我都不能执行以下命令:

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

我尝试使用 .bat 文件和 .cmd 文件。我尝试在命令提示符中手动操作并以管理员身份启动。所有尝试都导致了“权限被拒绝”的错误。
编辑2: 我没有找到任何解决问题的方法,所以我想出了一个变通方法。现在我已经预先初始化了 postgres 的数据目录,然后只需要创建服务并启动即可。

你确定你当前的活动目录是什么?相对文件夹引用“..\ data”指向错误的位置,这种可能性存在吗? - MC ND
感谢您提供上一个问题的链接以便了解背景。另外,我在之前的回答中使用了Poker Tracker作为例子,而您说您的用户习惯于其他捆绑PostgreSQL的应用程序,而您的应用程序名为Poker Assistant,这真是太有趣了。 - Craig Ringer
@CraigRinger 真是太有趣了。顺便问一下,你和那位先生对于日志目录有什么看法?我发现它不能使用相对路径。 - Fandi Susanto
1
@FandiSusanto 相对路径应该没问题。根据错误提示,似乎更可能是权限问题。个人建议在 %PROGRAMDATA%\MyApp\postgres\data 或类似位置中创建 datadir,因为这是 Microsoft 表示应将数据共享给机器上所有应用程序用户的位置。%PROGRAMDATA% 是一个环境变量。 - Craig Ringer
1个回答

3

我刚刚意识到这里的问题所在。

如果你将postgres作为管理员运行,它会使用一个特殊的Windows API调用来删除权限(获取受限令牌),以便为了安全性而不具备完整的管理员权限。详见PostgreSQL utilities and restricted tokens on windows

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

为了解决这个问题,只需使用md ..\data来创建空目录,然后使用icacls.exe授予适当的权限,然后再尝试使用initdb。或者,更好的方法是将其存储在更合适的位置,例如%PROGRAMDATA%\MyApp\pgdata或其他位置;应用程序数据不应放在%PROGRAMFILES%中。


谢谢您的解释。我使用icacls.exe成功执行了initdb。但我也认为您关于%PROGRAMDATA%目录的观点是正确的。但由于我需要在卸载时删除数据,所以我不能在那里使用%PROGRAMDATA%。我改用了$APPDATA。它最终位于Windows 8.1操作系统下的C:/Users/somebody/AppData/Roaming。有人还说他们的$APPDATA会到C:/ProgramData。 - Fandi Susanto
1
不要使用%APPDATA%!如果用户启用了漫游配置文件重定向,那么这将是一个CIFS卷,并且可能具有延迟写入和/或同步启用。这最多会导致性能问题,并且很容易创建大量数据损坏。如果您必须使其针对每个用户,请使用%LOCALAPPDATA% - Craig Ringer
不,我真的希望安装到ProgramData文件夹。但我不知道正确的NSIS变量是什么。在NSIS中只有$APPDATA和$LOCALAPPDATA。没有ProgramData文件夹的变量。我应该在安装程序脚本中直接输入C:/ProgramData吗?但我认为这对于双启动系统的用户来说可能会有问题。 - Fandi Susanto
@FandiSusanto http://nsis.sourceforge.net/Get_the_Special_Folders_Directories_(System_plugin), http://stackoverflow.com/q/22470967/398670, - Craig Ringer
我当时找到了那个网站,但是没有找到“ProgramData”。但刚刚我在NSIS中尝试了“SetShellVarContext all”,它起作用了。我从这里得到的:http://forums.winamp.com/showthread.php?t=345537 - Fandi Susanto
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接