Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 使用NSIS为postgre dbinit执行批处理文件会导致权限被拒绝_Postgresql_Batch File_Permissions_Nsis - Fatal编程技术网

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

Postgresql 使用NSIS为postgre dbinit执行批处理文件会导致权限被拒绝,postgresql,batch-file,permissions,nsis,Postgresql,Batch File,Permissions,Nsis,根据我的建议,我现在正试图通过NSIS代码执行一个批处理文件,以便在解压后成功地安装postgres。批处理文件包含用于初始化数据库的命令,但由于权限限制而失败。我在一台Win7 x64电脑上。我的用户帐户是管理员,我使用以管理员身份运行选项启动Setup.exe。这是我得到的错误: C:\ProgramFiles(x86)\Poker Assistant>cd“pgsql\bin” C:\ProgramFiles(x86)\Poker Assistant\pgsql\bin>initdb-U

根据我的建议,我现在正试图通过NSIS代码执行一个批处理文件,以便在解压后成功地安装postgres。批处理文件包含用于初始化数据库的命令,但由于权限限制而失败。我在一台Win7 x64电脑上。我的用户帐户是管理员,我使用
以管理员身份运行
选项启动Setup.exe。这是我得到的错误:

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

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

数据库群集将使用区域设置进行初始化 “保加利亚(保加利亚)1251”。initdb:找不到合适的文本搜索 区域设置“Bulgarian_u保加利亚.1251”的配置为默认文本 搜索配置将设置为“简单”

数据页校验和被禁用

正在创建目录../data。。。initdb:无法创建目录 “./数据”:权限被拒绝

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

initdb -U postgres -A password --pwfile "pwd.txt" -E utf8 -D "..\data"
我试过使用.bat文件。我试图从.cmd文件。我在命令提示符下手动尝试。我试着以管理员的身份开始。所有尝试都导致
权限被拒绝
错误


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

我刚刚意识到问题所在

如果您以管理员身份运行
postgres
,它将使用一个特殊的Windows API调用来删除权限(获取一个受限制的令牌),这样它就可以在没有完全管理员权限的情况下运行以确保安全。看

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


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

您确定当前的active directory是什么吗?是否可能相对文件夹引用
。\data
指向错误的位置?感谢您链接到前面的问题以了解上下文。另外,在前面的回答中,我以Poker Tracker为例,你说你的用户“已经习惯了其他捆绑PostgreSQL的应用”,你的应用叫做Poker Assistant,这也很好笑。@CraigRinger确实好笑。顺便说一句,你和华语先生,日志目录怎么样?我发现它不能使用相对路径。@fandussanto相对路径应该可以。如错误中所示,更可能是权限问题。就我个人而言,我建议在
%PROGRAMDATA%\MyApp\postgres\data
或类似文件中创建datadir,因为这是Microsoft所说的为计算机上应用程序的所有用户共享的数据的地方<代码>%PROGRAMDATA%是一个环境变量。感谢您的解释。我能够使用icacls.exe成功地执行initdb。但我也认为您对%PROGRAMDATA%目录的看法是正确的。但是,由于我需要在卸载时删除数据,因此无法在那里使用%PROGRAMDATA%。我改用$APPDATA。在Windows 8.1操作系统上,它以C:/Users/someone/AppData/Roaming结束。有人还说他们的$APPDATA会转到C:/ProgramData。不要使用
%APPDATA%
!如果用户已启用漫游配置文件重定向,则将是CIFS卷,并且可能已启用延迟写入和/或同步。这最多会导致性能问题,并且很容易造成大量数据损坏。如果必须按用户设置,请使用
%LOCALAPPDATA%
。否。。。我真的希望安装到ProgramData文件夹。但我不知道正确的NSIS变量。NSIS中只有$APPDATA和$LOCALAPPDATA。ProgramData文件夹没有变量。我应该在安装程序脚本上按字面意思键入C:/ProgramData吗?但我认为这对使用双启动系统的用户来说是个问题。@Fandussanto,我当时找到了那个网站,但在那个里找不到“ProgramData”。但刚才我在NSIS中尝试了“SetHellVarContext all”,效果很好。我是从: