パソコン関連の書籍等を読んで試したりしながらアウトプットしまくります。

アウトプットしながら学ぶ

ツール トラブル対応

KeePassがOneDriveで設定保存エラー!ソースコードを追って分かったTxFの罠

投稿日:

はじめに

OneDrive上でKeePassを使っていたら、終了時に
「設定の保存中にエラーが発生しました」
というダイアログが出るようになりました。
設定が保存されず、次に起動するとオプションが元に戻っている。
データベース(.kdbx)の保存は正常なのに、設定ファイル(KeePass.config.xml)だけ失敗する——
その原因を知りたくて、実際にソースコードを追いかけてみました。

ソースコードを追う

KeePassはオープンソースのC#アプリケーションです。
設定ファイル保存の起点は AppConfigSerializer.Save()
この中で FileTransactionEx というクラスを使ってファイルを安全に書き換えています。

using (FileTransactionEx ft =
new FileTransactionEx(iocPath, cfg.Application.UseTransactedConfigWrites))
{
using (Stream s = ft.OpenWrite())
SaveEx(cfg, s);
ft.CommitWrite(); // ← ここでエラー!
}

CommitWrite() の中を読むと、Windows APIの
MoveFileTransacted を呼び出していました。
つまり、ファイルの置き換えに Transactional NTFS (TxF) を使っているのです。

Transactional NTFS(TxF)とは?

TxF は Windows Vista で導入された機能で、
「ファイル操作をトランザクションとして扱う」仕組みです。

普通のファイル書き換えは途中で電源が落ちると壊れることがあります。
TxFはこう動きます。

Begin Transaction
├─ 一時ファイルに書き込み
├─ Commit → 成功したら反映
└─ Rollback → 失敗したら元に戻す

一見とても安全そうですが、問題は「今はほとんど使われていない」ことです。
MicrosoftはWindows 8以降でTxFを非推奨にしており、
クラウド同期ドライバ(OneDriveやDropboxなど)は
この仕組みをサポートしていません。
そのため、MoveFileTransacted を呼ぶと「アクセスできません」エラーになります。

原因判明

つまり今回の現象は:

KeePassが設定ファイルをTxFで置き換えようとして、
OneDriveの同期ドライバにブロックされていた。

ということでした。

解決方法

解決はとてもシンプルでした。
TxFを使わず通常モードで書き換える設定にすればOK。

KeePass.config.xml に以下を追記します。

<Application>
<UseTransactedConfigWrites>false</UseTransactedConfigWrites>
</Application>

KeePassを再起動すると、エラーは消え、設定も正しく保存されます。
この設定は内部的に cfg.Application.UseTransactedConfigWrites をfalseにするもので、
ソースを直さなくても同じ効果が得られます。

なぜ最初からこれでいいのに…

正直、最初は「KeePass.config.xmlの書き込み処理が壊れてる?」と思い、
Visual Studioでブレークポイントを置いて
AppConfigSerializerFileTransactionExCommitWrite() の流れを
地道にトレースしました。
その結果、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の堅牢な設計思想が見えてくるかもしれません。

🔗 関連記事







-ツール, トラブル対応
-, , , , , , , , , , , , , , , ,

Copyright© アウトプットしながら学ぶ , 2025 AllRights Reserved Powered by AFFINGER4.