目次
はじめに
OneDrive上でKeePassを使っていたら、終了時に
「設定の保存中にエラーが発生しました」
というダイアログが出るようになりました。
設定が保存されず、次に起動するとオプションが元に戻っている。
データベース(.kdbx)の保存は正常なのに、設定ファイル(KeePass.config.xml)だけ失敗する——
その原因を知りたくて、実際にソースコードを追いかけてみました。
ソースコードを追う
KeePassはオープンソースのC#アプリケーションです。
設定ファイル保存の起点は AppConfigSerializer.Save()。
この中で FileTransactionEx というクラスを使ってファイルを安全に書き換えています。
CommitWrite() の中を読むと、Windows APIのMoveFileTransacted を呼び出していました。
つまり、ファイルの置き換えに Transactional NTFS (TxF) を使っているのです。
Transactional NTFS(TxF)とは?
TxF は Windows Vista で導入された機能で、
「ファイル操作をトランザクションとして扱う」仕組みです。
普通のファイル書き換えは途中で電源が落ちると壊れることがあります。
TxFはこう動きます。
一見とても安全そうですが、問題は「今はほとんど使われていない」ことです。
MicrosoftはWindows 8以降でTxFを非推奨にしており、
クラウド同期ドライバ(OneDriveやDropboxなど)は
この仕組みをサポートしていません。
そのため、MoveFileTransacted を呼ぶと「アクセスできません」エラーになります。
原因判明
つまり今回の現象は:
KeePassが設定ファイルをTxFで置き換えようとして、
OneDriveの同期ドライバにブロックされていた。
ということでした。
解決方法
解決はとてもシンプルでした。
TxFを使わず通常モードで書き換える設定にすればOK。
KeePass.config.xml に以下を追記します。
KeePassを再起動すると、エラーは消え、設定も正しく保存されます。
この設定は内部的に cfg.Application.UseTransactedConfigWrites をfalseにするもので、
ソースを直さなくても同じ効果が得られます。
なぜ最初からこれでいいのに…
正直、最初は「KeePass.config.xmlの書き込み処理が壊れてる?」と思い、
Visual Studioでブレークポイントを置いてAppConfigSerializer → FileTransactionEx → CommitWrite() の流れを
地道にトレースしました。
その結果、TxFが原因だとわかり、設定一行で直ることを知ったときは少し笑いました。
でも、この過程で
KeePassがいかに「ファイル破損を防ぐ設計」をしているかも理解できて、
結果的には勉強になりました。
まとめ
| 環境 | TxF動作 | 推奨設定 |
|---|---|---|
| ローカルディスク | 有効でもOK | true(既定) |
| OneDrive / Dropbox / NAS | 失敗する | false |
| 組織・複数環境で共通設定したい | KeePass.config.enforced.xml を使用 |
false固定 |
UseTransactedConfigWrites=false は公式に用意された設定で、
安全性を損なわずにTxFを無効化できます。
おまけ:TxFをもう少し掘り下げる
-
API:
CreateFileTransacted,MoveFileTransacted,CommitTransactionなど -
内部的には Kernel Transaction Manager (KTM) を利用
-
Microsoft Docs より:
“Do not use Transactional NTFS in new applications.”
(新しいアプリでは使わないこと)
つまり、TxFは「当時は安全策、今はレガシー」。
KeePassはその安全設計を守りつつ、ユーザーが必要に応じて切れるようにしているわけです。
結論
OneDriveでKeePassが設定保存エラーを出すときは、
<UseTransactedConfigWrites>false</UseTransactedConfigWrites>を入れるだけで直る。でも、もし余裕があれば一度ソースコードを読んでみると、
KeePassの堅牢な設計思想が見えてくるかもしれません。
🔗 関連記事
-
KeePassがOneDriveで設定保存エラー!ソースコードを追って分かったTxFの罠
→ 今回の記事。本体。 -
KeePassをポータブル運用する設定まとめ(USB版で複数PC共有)
→ 複数環境でKeePassを使うときのフォルダ構成や同期設定の注意点を整理。 -
KeePass.config.xmlを手動編集して設定を引き継ぐ方法
→ 設定ファイルの仕組みと編集時の注意点を解説。今回の話と直接関連。