首页 > 解决方案 > 在 Windows 10 上运行 PostgreSQL 服务的用户的默认 pgpass.conf 位置是什么?

问题描述

在 Microsoft Windows 上,pgpass 文件的位置如下:

在 Microsoft Windows 上,该文件名为 %APPDATA%\postgresql\pgpass.conf(其中 %APPDATA% 指的是用户配置文件中的应用程序数据子目录)。

来源:https ://www.postgresql.org/docs/current/libpq-pgpass.html

当我创建订阅时,如下所示,我没有在连接字符串中提供密码。

CREATE SUBSCRIPTION alltables
CONNECTION 'host=192.168.1.5 port=5432 user=replicator1 dbname=test1'
PUBLICATION alltables;

相反,我希望将密码存储在pgpass.conf访问受限的文件中。

经过几次尝试,我注意到在创建订阅的情况下,pgpass.conf预计不会在运行该CREATE SUBSCRIPTION命令的 Windows 用户的用户目录中找到 。换句话说,如果我的 Windows 10 用户名是foobar文件,则预计不会是C:\Users\foobar\AppData\Roaming\postgresql\pgpass.conf. 相反,它似乎在运行 PostgreSQL 程序的 Windows 用户的用户目录中。

我通过添加passfile=C:\\Users\\foobar\\AppData\\Roaming\\postgresql\\pgpass.conf连接字符串并向NETWORK SERVICE用户(运行postgres.exe进程的用户)授予读取权限来发现这一点。在这种情况下,将创建订阅。但是,如果我passfile从连接字符串中删除该选项,则会返回简洁的ERROR: could not connect to the publisher: fe_sendauth: no password supplied错误消息。

那么,%APPDATA%\postgresql\pgpass.conf在那种情况下会指向哪里?换句话说,pgpass.conf在这种情况下文件应该在哪里?

标签: windowspostgresqlwindows-servicesappdata

解决方案


正如 Laurenz 所评论的,问题本质上是:什么是%APPDATA%NETWORK SERVICE用户的?

在我的情况下是C:\Windows\ServiceProfiles\NetworkService\AppData\Roaming\.

因此,通过在 中创建 pgpass 文件C:\Windows\ServiceProfiles\NetworkService\AppData\Roaming\postgresql\pgpass.conf,我可以创建一个订阅,如下所示,密码将从文件中成功获取。

CREATE SUBSCRIPTION alltables
CONNECTION 'host=192.168.1.5 port=5432 user=replicator1 dbname=test1'
PUBLICATION alltables;

推荐阅读