現在Postgresをデータベースに採用したC#アプリケーションを開発しています。
データベースのバックアップ機能がアプリケーション側で実装されていて、
cmd
1"C:\Program Files\PostgreSQL\11\bin\pg_dump" -Fc -h localhost -p 5432 -U postgres -w -d dbnameabc
上記のようなコマンドをpg_dumpに対して実行しバックアップを実行していますが、
開発環境では成功するけど実行環境では失敗するということで調査したところ、
Postgres側でパスワード必須設定がされており、パスワード入力を省く
「-w」のオプションが意味を成していない感じで、
この場合、Postgresは作成されたパスワードファイル「pgpass.conf」を見に行く
とPostgres公式にもあったので、読みに行く先に設定されているAPPDATA/Roamingの下に
パスワードファイルが作成されているであろう…と見に行くと、存在していませんでした。
このパスワードファイルはアプリケーション側で以下のような感じで作成されています。
C#
1// アプリケーションデータフォルダパス 2string appDataPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); 3string folderPath = appDataPath + @"\postgresql"; 4 5// 指定フォルダー作成 6if (!File.Exists(folderPath)) 7{ 8 Directory.CreateDirectory(folderPath); 9} 10 11// パスワードファイル作成 12string filePath = folderPath + @"\pgpass.conf"; 13using (FileStream fs = File.Create(@filePath)) 14{ 15 StreamWriter sw = new StreamWriter(fs); 16 sw.WriteLine("localhost:5432:dbnameabc:postgres:postgres"); 17 sw.Close(); 18}
最終的な原因としては、このアプリケーション自体をAdministrator権限ではなくSystem権限でサービスとしてバックグラウンド起動していることから、
C#
1string appDataPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
で取得しているAPPDATAフォルダのパスが、
開発環境:C:\Users\nonki\AppData\Roaming
実行環境:C:\Windows\System32\config\systemprofile\AppData\Roaming
と差がある上、System32フォルダ下なのでファイルやフォルダが権限的に作成できない状況にあることが原因だと判断しました。
上記のことから「pgpass.confの作成場所をどこか別の場所に変えよう」という案が出ていますが、pgpass.confを見に行くところを変更する方法が調べても見つからず、手詰まりになった…という状態です。
質問したい内容としては、
①Postgressがpgpass.confを見に行く場所を変更できますか?
②そもそも①の手段が正しいのでしょうか? 一般的にはどのように解決すべきなのでしょうか?
という点です。
開発環境はWindows10Pro
実行環境はWindowsServer2019
です。
つたない説明ですみませんが、ご助力いただけると幸いです。
あなたの回答
tips
プレビュー