2

これは、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 管理者のメンバーである必要があります。

4

3 に答える 3

1

更新 問題がコードにないことを証明したと思います。

SPSecurity.RunWithElevatedPrivileges: 通常、SharePoint Web アプリケーションのコードは、アクションを実行するユーザーの権限で実行されます。RunWithElevatedPrivileges は、SharePoint Web アプリケーション プール アカウントのコンテキストでコードを実行します (私はそう思います) 。MSDNの説明では、もう少し詳細を説明できます。

呼び出しの問題は、Web サービスが実際には SharePoint プロセス内でコードを実行していないため、昇格できない理由を説明している可能性があります (推測アラート)。

Web サービス アプリケーション プールのユーザーを変更してみて、それが楽しいかどうかを確認してください。


権限の問題である可能性があります。多分試してください:

Dim clientSiteUrl As String = "http://myintranet/clients/sampleclient"
Using SPSite = new SPSite(clientSiteUrl) 
    webApp As SPWebApplication = SPWebApplication.Lookup(new Uri(clientSiteUrl));
    If Not (webApp.Prefixes.Contains(clientSiteUrl)) Then
        webApp.Prefixes.Add(clientSiteUrl, SPPrefixType.ExplicitInclusion)
    End If
End Using

これは正確なコードではありません。

于 2008-12-09T21:14:43.547 に答える
0

管理パス (明示的) とそのパスにサイト コレクションを作成する場合は、次の手順を実行します。

using (SPSite site = new SPSite("http://dev-moss07-eric")) {
                SPWebApplication webApp = SPWebApplication.Lookup(new Uri("http://dev-moss07-eric"));
                if (webApp.Prefixes.Contains("ManagedPathHere"))
                {
                    //
                }
                else
                {
                    webApp.Prefixes.Add("ManagedPathHere", SPPrefixType.ExplicitInclusion);
                }
                using (SPWeb web = site.OpenWeb())
                {
                    SPWebApplication webApplication = web.Site.WebApplication;
                    try
                    {
                        webApplication.Sites.Add("ManagedPathHere","Site Title Here","This site is used for hosting styling assets.", 1033, "STS#1", "6scdev\\eric.schrader", "Eric Schrader", "eric.schrader@6sc.com");
                    }
                    catch (Exception ex)
                    {
                        //ex.ToString;
                    }
                }
            }
于 2011-02-21T23:41:02.513 に答える