ODBCのトレースログの出力はユーザ別かコンピュータ全体かに関わらず常にユーザ別

これに気づかずハマリにはまったのでメモ。

[すべてのユーザー ID のコンピューター全体のトレース]にチェックを入れれば[ログ ファイルのパス]に指定したファイルに全てのユーザのトレースログが出力されると思い込んでいたのですが、どうやら常にユーザ別のパスに出力されるらしい。

f:id:ymkn:20140224012532p:plain

どういうことかというと、ODBCを使ってDBアクセスを行うサービスservice_aをhoge_userというユーザで実行しているときに、メンテナンス用ユーザfuga_userでservice_aのODBCのトレースログを取得しようとして、fuga_userでODBC アドミニストレータを起動して上記画面の[すべてのユーザー ID のコンピューター全体のトレース]にチェックを入れ[トレースの開始]を押下しても、
[ログ ファイルのパス]に一切トレースが出力されない、という話。

どこにログが出ているのかというと、serivce_aを動かしているhoge_userの[ログ ファイルのパス]に指定された場所である。なんてこった。

[ログ ファイルのパス]は通常%TEMP%¥<数字>¥SQL.LOGとなっているので、そこを見に行けば良い。管理上場所を変更したい場合は、hoge_userでログインしてODBC アドミニストレータを起動し、[ログ ファイルのパス]を変更すれば良い。

hoge_userでログインできないときは・・

やっかいなのはhoge_userがサービス実行専用に設計されていて、デスクトップログインを許可していない場合。ODBCアドミニストレータの設定の実体は下記レジストリキーにある。

ユーザ別な設定: HKEY_CURRENT_USER\Software\ODBC\
グローバルな設定: HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\

[ログ ファイルのパス]はユーザ個別の設定なので、HEKY_CURRENT_USERのほうにある。ただ、HEKY_CURRENT_USERは現在ログイン中のユーザのレジストリである。今回修正したいのはログインできないhoge_userのもの。HEKY_USERSからhoge_userのツリーを探す必要があるが、面倒なことにユーザ名ではなくSIDでツリーが分けられている。つまり、hoge_userのSIDを調べる必要がある。

下記サイトのようにして、HKEY_LOCAL_MACHINE以下のキーから各ユーザのSIDを推測し、目的の値を修正すれば良い。

参考:レジストリキーのSIDからユーザアカウントを識別する方法 | Tipstour