S_a_k_Uの日記みたいなDB

~サクゥーと呼ばないで~

DirectoryクラスのExistsメソッドなどでの共有リソースの認証

.NET Framework 2.0、Windows XP SP3、Windows 7
共有フォルダのディレクトリの有無を検出している訳ですが。

WindowsXPVisual Studio 2010のデバックで実行しているときには、trueが返ってくる。
WindowsXPのサービス化した.NETのexeで実行しているときには、falseが返ってくる。
Windows7Visual Studio 2010のデバックで実行しているときには、trueが返ってくる。
Windows7のサービス化した.NETのexeで実行しているときには、trueが返ってくる。

共有フォルダのパスは、ホスト名でもIPアドレスでも同じ結果となる。


そもそも、DirectoryクラスのExistsメソッドのAPIを見ると

Exists メソッドは、ネットワーク認証を実行しません。事前に認証を行わずに既存のネットワーク共有を照会すると、Exists メソッドが false を返します。

書いてあるので、「WindowsXPのサービス化した.NETのexeで実行しているとき」のfalseを返す動作が正常にも思える。
多分Directoryクラスの他のメソッドも、Fileクラスのメソッドも同様の動きだろうな。
(追記2011/07/22:他のメソッドAPIを参照したけど、認証に関して明記してない)
各実行環境でのNetBIOSの件といい、なんでこんな動きになってんだろ?

回避策

ということで、マニュアルに書いてある通り、以前に作成していた下記のWNetAddConnection3関数による認証を行った上で、ファイル操作を行うことで解決した。
C#のコードからリモートのリソースにアクセス