none
WebサービスからのSharePointAPI操作とアプリケーションプールの関係 RRS feed

  • 質問

  • お世話になります。

    本番環境:Windows2003Server MOSS2007

    テスト環境:Windows2003Server MOSS2007 180日お試し版

     

    上記環境でVisualStudio 2008で開発したWebサービスを、MOSS上のフォームライブラリからInfoPathを起動し、Webサービスに接続

    フォームライブラリ上のアイテムを取得し、Keyが同一のアイテムが存在しているかしていないかを返す処理を行っております。

     ■ソース■

      <WebMethod()> _
      Public Function ChkKeyNotExsists(ByVal vstrKey As String) As Boolean
        Dim objSite As SPSite = Nothing
        Dim strFolderNm As String = String.Empty
        Dim objDoc As SPDocumentLibrary = Nothing
        Dim objListItemCollection As SPListItemCollection = Nothing
        Dim objDt As DataTable = Nothing
        Dim objRows As DataRow() = Nothing

        Try
          objSite = New SPSite("MOSS URL")
          Using objWeb As SPWeb = objSite.RootWeb
            Using objWebSub1 As SPWeb = objWeb.Webs.Item("サイト名1")
              Using objWebSub As SPWeb = objWebSub1.Webs.Item("サイト名2")
                objDoc = DirectCast(objWebSub.Lists.Item("フォームライブラリ名"), SPDocumentLibrary)
                'アイテムコレクション取得
                objListItemCollection = objDoc.Items
                'コレクションからデータテーブル取得
                objDt = objListItemCollection.GetDataTable

                'データがなければTrueを返す
                If objDt Is Nothing Then
                  Return True
                End If

                'Keyで1アイテム取得
                objRows = objDt.Select("Key = '" & vstrKey & "'")
                If objRows.Count = 0 Then
                  Return True
                Else
                  Return False
                End If
              End Using
            End Using
          End Using
        Catch ex As Exception
          Throw
        End Try
      End Function

    これが、テスト環境だと動いたのですが、本番環境で同じ様に構築したが動きませんでした。

    Webサービスはテスト環境、本番環境共にIISのWeb サイト直下に仮想ディレクトリを作り設定しています。

     

    これまでにこの問題を解決しようと、試した事を順を追って記述してきます。

    ①まず最初は、SPSiteのコンストラクタでFileNotFoundExceptionが発生しました。(テスト環境は通ります、また64bit環境で32bit版だとこのエラーが起こるとのことでしたが、本番環境テスト環境共に32bitです)

     

    ②その問題はWebサービスのアプリケーションプールをDefaultAppPoolからSharePoint - 80のアプリケーションプールへ変更することで解決しました。

     

    ③この状態でサーバーのIIS上から、Webサービスのasmxファイルを直接参照し動かすと正常に動作し、結果が帰ってきましたが、InfoPathからWebサービスを呼ぶとユーザー認証のダイアログが表示されます。

     Administoratorsグループのユーザーとパスワードを入れても、ログインできません。

     (この時、Webサービスの匿名アクセスは無効になっており、認証済みアクセスは統合 Windows認証の状態です。)

     

    ④ここで、匿名アクセスを有効にチェックをつけ、Administoratorsグループに入っているユーザーとパスワードを設定しました。

     すると、ユーザー認証のダイアログは表示されないものの、「次のDataObjectでクエリを実行できません:ChkKeyNotExsists  指定されたクエリを実行できません。」と言うメッセージが出てWebサービスが実行できません。

     

    ⑤その後テスト環境と本番環境の違いを見比べていて、SharePoint - 80のアプリケーションプールの設定で本番環境ではアプリケーションプールIDが構成可能にチェックが有り

     ユーザー名・パスワードが設定されていて、テスト環境は定義済みのNetwork Serviceになっている事に気づいたんですが

     本番環境の設定を変えるわけにはいかないので、テスト環境の定義を変更して行った所、テスト環境のSharePointへの接続で③の時と同じように認証ダイアログが表示され、SharePointが表示されなくなってしまいました。

     また、アプリケーションプールIDと、Webサービスの匿名アクセスのIDとパスを合わせたらどうかとも試したのですが、ダメでした。

     

    ⑥その後調べて行くとhttp://msdn.microsoft.com/ja-jp/library/cc768615.aspx

     上記ページが参考になるのかと、テスト環境を動く状態に戻し、IIS上のWebサイトから_layoutsへ仮想ディレクトリを新規作成し、Webサービスのディレクトリを設定したのですが

     SharePointを触るWebサービスは「ページを表示できません」と言うメッセージで表示されず。

     今まで本番でも動いていたActiveDirectoryを検索するメソッドも「アクセス許可の要求に失敗しました。」と表示され動かなくなってしまいました。

     

     

    IIS関係にまだ慣れておらず、色々とおかしな事をしている点もあるかもしれませんが、何かお気づきの事が有れば教えていただけたら助かります。

    2011年6月1日 9:07

回答

  • こんにちわ。

    たぶんですね、④の匿名アクセスのチェックにより、だれでもIISまでたどり着けるのですが、クライアントPCのログインユーザーがDBへのアクセス権がないためクエリ実行でエラーが出ているのではないかと思います。

    ※一般的にこれを「ダブルホップ問題」といったと思います。

    ※テスト環境と本番環境で、動作が異なるのは、たぶんログインアカウントの権限に差異にあるのではないかと思います。

    この場合の対策を考えますと、WebからDBへの接続をWindows認証でなくSQLServer認証に変更する、またはロジックをSPSecurity.RunWithElevatedPrivileges メソッドでくくって権限昇格する、どちらかの対応が必要ではないかと思います。

    もし、間違っていましたらごめんなさい。

    あと、objSiteはUsingでくくるか、最後に確実にDisposeするようにしてください。

    ※これを忘れると、メモリリークで大量の同時アクセスでIISがダウンします。

    では。

    • 回答としてマーク みすた 2011年6月3日 2:26
    • 回答としてマークされていない みすた 2011年6月3日 2:27
    • 回答としてマーク みすた 2011年6月3日 2:29
    2011年6月2日 23:29

すべての返信

  • こんにちわ。

    たぶんですね、④の匿名アクセスのチェックにより、だれでもIISまでたどり着けるのですが、クライアントPCのログインユーザーがDBへのアクセス権がないためクエリ実行でエラーが出ているのではないかと思います。

    ※一般的にこれを「ダブルホップ問題」といったと思います。

    ※テスト環境と本番環境で、動作が異なるのは、たぶんログインアカウントの権限に差異にあるのではないかと思います。

    この場合の対策を考えますと、WebからDBへの接続をWindows認証でなくSQLServer認証に変更する、またはロジックをSPSecurity.RunWithElevatedPrivileges メソッドでくくって権限昇格する、どちらかの対応が必要ではないかと思います。

    もし、間違っていましたらごめんなさい。

    あと、objSiteはUsingでくくるか、最後に確実にDisposeするようにしてください。

    ※これを忘れると、メモリリークで大量の同時アクセスでIISがダウンします。

    では。

    • 回答としてマーク みすた 2011年6月3日 2:26
    • 回答としてマークされていない みすた 2011年6月3日 2:27
    • 回答としてマーク みすた 2011年6月3日 2:29
    2011年6月2日 23:29
  • ありがとうございました。

    SPSecurity.RunWithElevatedPrivileges を使い権限の昇格を行った所、上手く実行する事が出来ました。

    ダブルホップに目をつけ、シングルサインオンの方へ考えが向かっており、そこでさらに深みにはまっていこうとしていたので

    ほんとに助かりました。

     

    SPSiteの件についてもありがとうございます。

    Usingを利用し解放する形に修正いたしました。

    おかげさまで、リリースを迎える事が出来そうです。

     

    追記:

    回答としてマークを付けたり外したり申し訳ありません。

    返信が出来なくなって、外して再度返信を書かせていただきました。

    2011年6月3日 2:29