これは、WSS/SharePoint の第一人者への質問です。
次のシナリオを考えてみましょう。企業の CRM システムと WSS ベースのイントラネットをリンクする ASP.Net Web サービスがあります。私がやろうとしているのは、新しいクライアントが CRM システムに追加されるたびに、新しい WSS サイト コレクションを準備することです。これを機能させるには、管理パスを新しいサイト コレクションにプログラムで追加する必要があります。オブジェクト モデルを介してこれが可能であることはわかっていますが、自分の Web サービスで試してみると失敗します。以下のサンプルコードの抜粋:
Dim _ClientSiteUrl As String = "http://myintranet/clients/sampleclient"
Using _RootWeb As SPSite = New SPSite("http://myintranet")
Dim _ManagedPaths As SPPrefixCollection = _RootWeb.WebApplication.Prefixes
If Not (_ManagedPaths.Contains(_ClientSiteUrl)) Then
_ManagedPaths.Add(_ClientSiteUrl, SPPrefixType.ExplicitInclusion)
End If
End Using
このコードは、SPUtility.ValidateFormDigest() で NullReferenceException で失敗します。調査によると、これは権限が不十分であることが原因である可能性があることが示唆されました。SPSecurity.RunWithElevatedPrivileges(AddressOf AddManagedPath) を使用して昇格された権限ブロック内でコードを実行しようとしました。ここで、AddManagedPath は上記のコード サンプルを含む Sub プロシージャです。
これは InvalidOperationException で失敗し、「オブジェクトの現在の状態のため、操作は有効ではありません。」
どこが間違っていますか?
私がなんとかした回避策の 1 つは、Process.Start() を介して STSADM.EXE を呼び出し、必要なパラメーターを提供することであり、これは機能します。
更新: Web サービスの開発中に、組み込みの Visual Studio 2005 Web サーバーを使用して実行しています。これはどのセキュリティ コンテキストで実行されますか? web.config にエントリを配置して、セキュリティ コンテキストを変更できますか?
更新:問題は間違いなく、正しい SharePoint セキュリティ コンテキスト内で Web サービスを実行していないことに関係していると思います。私が提案した回避策を採用し、STSADM にシェルアウトすることにしましたが、これを行うには、Web サービスが実行されるアプリケーション プール ID が SharePoint 管理者のメンバーである必要があります。