Frage

Dies ist eine Frage an einen WSS/SharePoint-Guru.

Betrachten Sie dieses Szenario:Ich habe einen ASP.Net-Webdienst, der unser Unternehmens-CRM-System und das WSS-basierte Intranet miteinander verbindet.Ich versuche, immer dann eine neue WSS-Websitesammlung bereitzustellen, wenn ein neuer Kunde zum CRM-System hinzugefügt wird.Damit dies funktioniert, muss ich den verwalteten Pfad programmgesteuert zur neuen Websitesammlung hinzufügen.Ich weiß, dass dies über das Objektmodell möglich ist, aber wenn ich es in meinem eigenen Webdienst versuche, schlägt es fehl.Beispielcode-Auszug unten:


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

Dieser Code schlägt mit einer NullReferenceException bei SPUtility.ValidateFormDigest() fehl.Untersuchungen ergaben, dass dies an unzureichenden Berechtigungen liegen könnte. Ich habe versucht, den Code innerhalb eines Blocks mit erhöhten Berechtigungen mit SPSecurity.RunWithElevatedPrivileges(AddressOf AddManagedPath) auszuführen, wobei AddManagedPath eine Sub-Prozedur ist, die das obige Codebeispiel enthält.

Dies schlägt dann mit einer InvalidOperationException fehl: „Der Vorgang ist aufgrund des aktuellen Status des Objekts ungültig.“

Wo mache ich einen Fehler?

Eine Problemumgehung, die ich geschafft habe, besteht darin, STSADM.EXE über Process.Start() aufzurufen und die erforderlichen Parameter bereitzustellen, und das funktioniert.

Aktualisieren: Während ich den Webdienst entwickle, führe ich ihn über den integrierten Visual Studio 2005-Webserver aus. Unter welchem ​​Sicherheitskontext wird er ausgeführt?Kann ich den Sicherheitskontext ändern, indem ich Einträge in web.config einfüge?

Aktualisieren: Ich denke, das Problem liegt definitiv darin, dass der Webdienst nicht im richtigen SharePoint-Sicherheitskontext ausgeführt wird.Ich entschied mich für die von mir vorgeschlagene Problemumgehung und zahlte STSADM aus, allerdings muss die Anwendungspoolidentität, unter der der Webdienst ausgeführt wird, dazu ein Mitglied der SharePoint-Administratoren sein.

War es hilfreich?

Lösung

AktualisierenIch denke, Sie haben bewiesen, dass das Problem nicht am Code liegt.

SPSecurity.RunWithElevatedPrivileges:Normalerweise wird der Code in der SharePoint-Webanwendung mit den Berechtigungen des Benutzers ausgeführt, der die Aktion ausführt.Auf dem RunWitheLevatedPrivilegeges wird der Code im Kontext des SharePoint Web Application Pools -Konto (glaube ich) die Beschreibung auf ausgeführt MSDN könnte noch ein klein wenig mehr ins Detail gehen.

Das Problem mit dem Aufruf kann darin liegen, dass der Webdienst den Code nicht tatsächlich in einem SharePoint-Prozess ausführt, was erklärt, warum er nicht erhöht werden kann (Warnung „Wilde Vermutungen“).

Versuchen Sie, den Benutzer Ihres Webservice-Anwendungspools zu ändern, und sehen Sie, ob das Freude bereitet.


Es handelt sich wahrscheinlich um ein Berechtigungsproblem.Versuchen Sie es vielleicht mit:

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

Dies ist kein exakter Code.

Andere Tipps

Da es sich bei dem obigen Code nicht um den genauen Code handelt, finden Sie hier den genauen Arbeitscode für eine von der Webanwendung erfasste Funktion im Feature Activated-Ereignis:

Bei der Funktionsaktivierung auf der Seite „Webanwendungsfunktionen verwalten“ erstellt die Funktion „Aktivieren“ einen neuen explizit verwalteten Pfad in der angegebenen Webanwendung (ich möchte die harte Codierung ersetzen, möglicherweise durch Properties.Feature.Parent oder etwas Ähnliches).

using (SPSite site = new SPSite("http://dev-moss07-eric/PathHere")) {
    SPWebApplication webApp = SPWebApplication.Lookup(new Uri("http://dev-moss07-eric"));
    if (webApp.Prefixes.Contains("PathHere"))
    {
        //
    }
    else
    {
        webApp.Prefixes.Add("PathHere", SPPrefixType.ExplicitInclusion);
    }
}

Der Code kann wahrscheinlich verbessert werden, aber es ist mein Versuch, den obigen Code zu konvertieren.

Wenn Sie einen verwalteten Pfad (explizit) und eine Websitesammlung in diesem Pfad erstellen möchten, gehen Sie wie folgt vor:

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;
                    }
                }
            }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top