編集 7:
結局、これは実行できないと思います。何らかのコマンド ライン アプリケーションを使用してこれを実行し、出力を解析する必要があるかもしれませんが、多くの人がアクセスしている場合、これは非常に遅くなる可能性がありますフォルダおよび/または NetBIOS セッションの制限に達しています。
編集 6:
Windows 統合認証 (共有とデータベースにアクセスできるアカウントを使用) を使用すると、ファイル/ディレクトリのリストを取得できます。ただし、ページを更新してUnauthorizedAccessException
. おそらく、NetBIOS または ActiveDirectory の制限です。
5か月、「偽装を使用する」以外の解決策はまだありません(組み込みの.NETの方法が非常に不安定に見えるため、P/Invokeを介してそう思われます)が、それにも同じ問題があります。ユーザー名/パスワードのハードコーディングはオプションではありません。
開発 (Windows 7) ボックス (IIS または Visual Studio を使用) に組み込まれた Web サーバー) は正常に動作します。
編集 5:
インターネットとこの質問で読んだことから、これが機能する唯一の方法は次のとおりです。
- 基本認証
- なりすまし
- Web アプリケーションと同じサーバーにファイルがある
これらはどれもオプションではありません。
- ユーザーは毎回ログインする必要があります - 欠点: 追加の障壁があり、シームレスなエクスペリエンスにする必要があります
- ユーザー名とパスワードがハードコードされている - 欠点: パスワードが変更されると、コード化されたユーザー (asp.net アカウント) はファイルにアクセスできなくなります
- Web サーバーに保存するファイルが多すぎます。ディスク容量が不足しています
UNC 共有ファイルにアクセスできる Windows フォーム アプリケーションが必要なので、これでうまくいくと思っていました。それと、Web サーバーにリモート接続して Windows エクスプローラーを使用すると、ファイルにアクセスできるという事実。
おそらく、ASP.NET/IIS のセキュリティにより、P/Invoke による偽装なしでは機能しなくなります。または、ファイアウォールによってブロックされている可能性がありますか?
編集 4:
機能することの 1 つは、基本認証を使用することです。統合 Windows 認証とダイジェスト認証は機能しません。ただし、パスワードは平文で送信され、ユーザーがページにアクセスするとプロンプトが表示されるため、これは実際にはオプションではありません (私がやりたいことではありません)。
編集3:
何を試しても、UNCパス上のファイルまたはディレクトリのリストを取得できません(これらの組み合わせと個別にオンになっています)
- フォルダーへの「Everyone」フルアクセス (読み取りだけでなく) が与えられます
- ASP.NET アカウントが「オペレーティング システムの一部として機能する」場合
- 指定された IIS_WPG グループが「オペレーティング システムの一部として機能する」
- 使用済み
<authentication mode="Windows" />
- 使用済み
<identity impersonate="true"/>
サイトへのログインに使用するのと同じアカウントでサーバーに (RDP を使用して) リモート接続すると、ファイルに問題なくアクセスできます。コードでは機能しません。
編集2:
私が試したことは次のとおりです:
- Windows 認証をオンにします。ファイルは同じマシン (UNC 共有ではない) にある場合にのみアクセスでき、データベースに接続できません。
- フォーム認証をオンにすると、データベースに接続できますが、ファイルにはアクセスできません (
InvalidCastException
ID が になったためGenericIdentity
)
ロールを追加する方法がないため、Windows 認証を使用できません。ユーザー名/パスワードの入力を求めたくないのは、これは追加の手順であり、安全な接続 (SSL など) を介していないためです。また、ASP.NET アカウントにファイルへのアクセス権を与えることもできません (私はドメイン管理者ではないため)。
編集:
パスは UNC パスであり、ローカル PC 上ではありません。
フォーム認証を使用してWindowsIdentity
、Visual Studio で現在のユーザー ID を にキャストしてデバッグしようとすると、InvalidCastException
. 私は単に持っています:
WindowsIdentity id = (WindowsIdentity)HttpContext.Current.User.Identity;
次に、私が得るエラーは次のとおりです。
Unable to cast object of type 'System.Security.Principal.GenericIdentity' to type 'System.Security.Principal.WindowsIdentity'
ASP.NET アカウントはこれらのファイルにアクセスできないため、偽装を使用してファイルのリストを取得しています。IIS を使用している場合は機能しますが、Visual Studio では機能しません。
WindowsIdentity id = (WindowsIdentity)User.Identity;
using (System.Security.Principal.WindowsImpersonationContext context = id.Impersonate())
{
files = Directory.GetFiles("\\server\share");
context.Undo();
}
に追加<identity impersonate="true" />
してweb.config
も何も実行されませんが、ASP.NET アカウントを使用してデータベースにクエリを実行しているため、実行したくありませんが、ユーザーにはアクセス権がありません (結果としてLogin failed for user 'NT AUTHORITY\ANONYMOUS LOGON'
)。
web.config を介して Windows 認証をオンにするUnauthorizedAccessException
と、リモート共有からファイルのリストを取得しようとすると取得されます (クライアント PC の同じユーザーとして IIS ボックスにリモート接続した場合は、そうでなければアクセスできます)。
さらに、ASP.NET アカウントは Active Directory でセットアップされたアカウントであり、IIS に対してローカルではありません。