質問

SharePoint 2007内のPageLayout内のascxで実行されているコードがあり、リモートサーバー上のファイルにアクセスします。File.Create("\サーバー名\共有名\フォルダー\file.txt")。このコードは、web.config で CAS 信頼が Full に設定されている SharePoint Web アプリケーション内で実行されます。File.Create は次の例外をスローします:-

System.UnauthorizedAccessException

パス「\\サーバー名\共有名\フォルダー\file.txt」へのアクセスが拒否されました。

共有はフル コントロールを持つ全員に共有され、NTFS アクセス許可はフル コントロールを持つ全員に設定されます。Web アプリケーションのアプリ プールは、そのリソースにアクセスするための明示的なアクセス許可を持つドメイン アカウントで実行されています (これは必要ありません)。

リモート マシンでプロセス モニターを実行しましたが、サーバーにヒットは記録されませんでした。このため、SharePoint コード アクセス セキュリティ設定に問題があると考えられます。上で述べたように、web.config の信頼は完全に設定されています。

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)

次に、PageLayout 内で以下を使用してコントロールを参照します。

<%@ 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 サイトにアクセスする権限を持っている限り、サイトへのログオンにどのユーザーを使用しても違いはありません。

何かご意見は?


アップデート

うーん、SharePoint サイトにリモートでアクセスし、SharePoint サイトがローカルで File.Create() を実行しようとすると (つまり、File.Create("C: emp\abc.txt")) であれば機能します。SharePoint ボックスから SharePoint サイトにアクセスし、リモートで 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 が問題を解決します。:-)

役に立ちましたか?

解決

これはダブルホップの問題で、コードが偽装されたユーザーとしてリソースにアクセスしようとしているのではないかと思いますが、NTLM が別のサーバーに偽装しないため (Kerberos は偽装します)、アクセスが失敗します。

SPSecurity.RunWithElevatedPrivileges を試してみましたか?これにより、偽装 (RevertToSelf) が削除され、以前はできなかったアプリケーション プールの所有者が自分 (自分自身?) として振る舞えるようになるかもしれません。

思いついただけなので、試してみることは非常に簡単です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top