リモート サーバー上のファイルにアクセスする SharePoint 2007 内の PageLayout 内の ascx でコードを実行しています。つまり、File.Create("\servername\sharename\folder\file.txt")。このコードは、web.config で CAS 信頼が Full に設定されている SharePoint Web アプリケーション内で実行されます。File.Create は次の例外をスローします:-
System.UnauthorizedAccessException
パス '\\servername\sharename\folder\file.txt' へのアクセスが拒否されました。
共有はフル コントロールを持つ全員に共有され、NTFS アクセス許可はフル コントロールを持つ全員に設定されます。Web アプリケーション アプリケーション プールは、そのリソースにアクセスするための明示的なアクセス許可を持つドメイン アカウントで実行されています (これは必要ではありません)。
リモート マシンで Process Monitor を実行しましたが、サーバーにヒットが記録されませんでした。これは、SharePoint コード アクセス セキュリティの設定に問題があると思われます。上で述べたように、web.config の信頼は Full に設定されています。
CAS がまだリモート アクセスをブロックしている可能性はありますか? レビューする他の領域を考えられる人はいますか?
アップデート
もう少し情報...
アプリ プール アカウント ドメイン管理者を作成しようとしましたが、問題は引き続き発生します。同じ方法を使用してローカル マシン上のドライブにアクセスすると、問題なく動作します。アプリ プール アカウントを使用して、sharepoint の外で SnippetCompiler で同じコードを実行すると、正常に動作します。
これがお役に立てば幸いです。私が試すことができる調査やテストの方法が他に思いつくかどうか教えてください。
アップデート
これが問題に影響するかどうかはわかりませんが、ローカル サーバーは Windows Server 2003 を実行しており、リモート サーバーは Windows 2000 を実行しています。
アップデート
Web パーツを介してコードを実行しようとしましたが、正常に動作します。失敗しているプロジェクトで使用するファイル構造は次のとおりです。
wss
- VirtualDirectories
- SharePointWebApp
- ...sp web app files
- .
- .
- PageLayoutControls
- control.ascx
- .
- .
次に、IIS には次の構造があります。
IIS
- Websites
- SharePointWebApp (pointing to \wss\VirtualDirectories\SharePointWebApp)
- PageLayoutControls (virtual directory pointing to \wss\VirtualDirectories\PageLayoutControls)
次に、PageLayouts 内で、次を使用してコントロールを参照します。
<%@ Register TagPrefix="TEST" TagName="MyControl" Src="~/PageLayoutControls/control.ascx" %>
<asp:Content ContentPlaceholderID="PlaceHolderMain" runat="server">
<TEST:MyControl id="myControl" runat="server"/>
</asp:Content>Let me know if you need more info.
アップデート
謎が深まる…
SharePoint Web フロント エンド サーバー上の Internet Explorer (6 または 7) から sharepoint サイトにアクセスすると、例外が発生しません。
SP Web フロント エンド サーバーから Mozilla Firefox の sharepoint サイトにアクセスすると、例外が発生します。
どのブラウザからでも SharePoint サイトにリモートでアクセスすると、例外が発生します。
また、sharepoint サイトへのアクセス許可を持っている限り、サイトへのログオンに使用するユーザーに違いはありません。
何かご意見は?
アップデート
うーん、リモートで共有ポイント サイトにアクセスし、共有ポイント サイトがローカルで File.Create() を実行しようとすると (つまり、File.Create("C:\temp\abc.txt"))、動作することがわかりました。 . 共有ポイント ボックスから共有ポイント サイトにアクセスし、リモートで File.Create() を実行すると (つまり、File.Create("\ServerName\ShareName\FolderName\file.txt"))、機能します。
SharePoint サイトにリモートでアクセスし、SharePoint サイトに File.Create() をリモートで実行させようとした場合にのみ失敗します。ダブルホップ問題の一種。これは、NTLM / Kerberos の問題であると思われます。
現在、NTLM 認証を使用して実行しています。
他の誰かがこの種の問題を経験しましたか?
アップデート
ええ、これは NTLM の問題であり、ダブル ホップが許可されていないことは確かです。sharepoint サイトの認証を基本認証を使用するように変更したところ、機能しました。統合認証に戻しましたが、失敗しました。
ここで、ファームを移動して Kerberos を使用するか、問題を回避する別の方法を見つけるかを決定します。:-/
アップデート
SPSecurity.RunWithElevatedPrivileges を試してみてください。ただし、RunWithElevatedPrivileges はこのコンテキストで使用されることを意図しているのでしょうか。以前は、ネットワークにアクセスするファイルにアクセスするのではなく、SharePoint 内のリストやライブラリにアクセスするためにのみ使用していました。
何かご意見は?
アップデート
はい、SPSecurity.RunWithElevatedPrivileges は問題を解決します。:-)