同じドメインの一部ではなく、同じネットワーク上の別の Windows マシンからファイルを読み取りたい。(ASP.NET C# アプリ)
FileStream を試して (認証できません)、FileWebRequest を試して (file:/// を使用すると FileStream に戻ります)、偽装 ( support.microsoft.com/kb/306158#4 ) を試しました。私のVistaで偽装に失敗しました。
更新: 「偽装に失敗しました」問題を修正しました。しかし、両方でユーザーを「ミラーリング」していても、他のマシンから「アクセスが拒否されました」と表示されるため、問題は残ります...
このタスクにアプローチする正しい方法は何ですか?
4 に答える
おそらくあなたが探している答えではありませんが、正しい方法を求めたので...ファイルサーバーをドメインに参加させ、ASP.NETのサービスアカウントに共有へのアクセスを許可してください。
"Z:" などのドライブを、コードが実行されているマシンのリモート マシンにマップします。Z:... を使用してファイルにアクセスします。
ウェブクライアントを試してください。これを使用して URI にアクセスできます。これには、「ファイル」プロトコルの使用が含まれると思います (または、HTTP 経由でリモート ファイルを公開することもできます)。
従来のダウンロードには WebClient を使用できます。
WebClient.DownloadFile(Uri address, string localFile)
またはストリームを返します。
WebClient.OpenRead(Uri address)
ただし、認証の問題がまだ残っている可能性があります。「ファイル」プロトコルを使用してできない場合がありますが、標準の Uri の方法で資格情報を提供できます。
試したことはありませんが、web.config で偽装を指定できると思います。
<authentication mode="Windows" />
<identity impersonate="true" username="[user]" password="[password]"/>
これはセキュリティ上のリスクのように思えますが、アプリケーションが匿名ユーザーのデフォルトではなく、ネットワーク ユーザーの資格情報を取得するようにします。
詳細はこちら: How To: Use Impersonation and Delegation in ASP.NET 2.0
これが適切なアプローチかどうかはわかりませんが、それが私のやり方です。そのコンピューターのログインを知っていると仮定すると、IPC$ オブジェクトへの WNetConnection を IP/Invoke してマシンで認証し、自分の作業を行ってから、別の P/Invoke を実行して IPC$ への接続を削除します。