SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




"Access Denied" bei Me.SetPersonalizationDirty()

Unbeantwortet Dieser Beitrag hat 5 Antworten

Ohne Rang
17 Beiträge
sharepointkb erstellt 29 März 2010 14:56
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hi,

ich habe ein super einfaches WebPart Projekt (WSPBuilder Standard WebPart Feature) erstellt um mein Problem besser darstellen zu können. Es ist reproduzierbar. Mein Problem: Ich habe in einem WebPart eine Property vom Typ String. In diese Property möchte ich einen Wert aus einem Textfeld, welche im WebPart inkl. eines Speichern-Buttons gerendert wird, ablegen. Ziel ist es. diesen zuvor eingegebenen Wert im WebPart dauerhaft zu speichern.

Also habe ich eine Property meiner WebPart-Klasse hinzugefügt, ein Textfeld und einen Button. Wenn ich nun auf den Button klicke, weise ich der WebPart-Property den Wert aus der Textbox zu und führe den Befehl Me.SetPersonalizationDirty() aus.

Wenn ich am Sharepoint mit einem User angemeldet bin, der in meinem Fall SiteCollection-Admin ist, gibt es keine Probleme! Wenn ich mich jedoch als ein einfacher Benutzer anmelde (Site Gruppe Besucher/Visitors), bekomme ich die Meldung "Access Denied" ...

Ich habe auch, wie man es unten im Code sehen kann, mit RunWithElevatedPrivileges probiert. Was meiner Meinung nach eindeutig laufen müsste funktioniert an dieser Stelle nicht.

Weiß einer woran das liegen kann? Oder ist das ein Bug in Sharepoint?

Hier der Code: 

Imports System
Imports System.Collections.Generic
Imports System.Runtime.InteropServices
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Web.UI.WebControls.WebParts
Imports Microsoft.SharePoint
Imports Microsoft.SharePoint.WebControls

Namespace FirstVMWebPart.WebPartCode
    <Guid("6a046180-8ca7-45e0-a5dc-0cd2e8ba8e1a")> _
    Public Class SamplePart
        Inherits Microsoft.SharePoint.WebPartPages.WebPart
        Private _error As Boolean = False
        Private _myProperty As String = Nothing
        Private pe As PeopleEditor
        Private btn As Button

        <Personalizable(PersonalizationScope.Shared)> _
        <WebBrowsable(False)> _
        <System.ComponentModel.Category("My Property Group")> _
        <WebDisplayName("MyProperty")> _
        <WebDescription("Meaningless Property")> _
        Public Property MyProperty() As String
            Get
                Return _myProperty
            End Get
            Set(ByVal value As String)
                _myProperty = value
            End Set
        End Property

        Public Sub New()
            Me.ExportMode = WebPartExportMode.All
        End Sub

        ''' <summary>
        ''' Create all your controls here for rendering.
        ''' Try to avoid using the RenderWebPart() method.
        ''' </summary>
        Protected Overloads Overrides Sub CreateChildControls()
            If Not _error Then
                Try

                    MyBase.CreateChildControls()

                    ' Your code here...
                    Me.Controls.Add(New LiteralControl(Me.MyProperty))

                    pe = New PeopleEditor
                    pe.SelectionSet = "SecGroup, User, SPGroup"
                    pe.AllowEmpty = True
                    pe.AllowTypeIn = True
                    pe.MultiSelect = True
                    pe.AutoPostBack = False
                    pe.ID = "pe"
                    pe.PlaceButtonsUnderEntityEditor = True
                    Me.Controls.Add(pe)

                    btn = New Button
                    btn.ID = "btn"
                    btn.Text = "speichern"
                    AddHandler btn.Click, AddressOf Save
                    Me.Controls.Add(btn)
                Catch ex As Exception
                    HandleException(ex)
                End Try
            End If
        End Sub

        Private Sub Save(ByVal sender As Object, ByVal e As System.EventArgs)
            SPSecurity.RunWithElevatedPrivileges(AddressOf myupdate)
        End Sub

        Private Sub myupdate()
            Me.MyProperty = pe.CommaSeparatedAccounts
            Me.SetPersonalizationDirty()
        End Sub

        ''' <summary>
        ''' Ensures that the CreateChildControls() is called before events.
        ''' Use CreateChildControls() to create your controls.
        ''' </summary>
        ''' <param name="e"></param>
        Protected Overloads Overrides Sub OnLoad(ByVal e As EventArgs)
            If Not _error Then
                Try
                    MyBase.OnLoad(e)

                    ' Your code here...
                    Me.EnsureChildControls()
                Catch ex As Exception
                    HandleException(ex)
                End Try
            End If
        End Sub

        ''' <summary>
        ''' Clear all child controls and add an error message for display.
        ''' </summary>
        ''' <param name="ex"></param>
        Private Sub HandleException(ByVal ex As Exception)
            Me._error = True
            Me.Controls.Clear()
            Me.Controls.Add(New LiteralControl(ex.Message))
        End Sub
    End Class
End Namespace

Alle Antworten

Ohne Rang
929 Beiträge
Thomas Östreich Als Antwort am 29 März 2010 15:39
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Um Daten innerhalb des WebPart persistent zu machen benutzt dafür das ToolPart und nicht das WebPart selbst.

http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.webpartpages.webpart.gettoolparts.aspx

Ohne Rang
17 Beiträge
sharepointkb Als Antwort am 29 März 2010 16:07
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

In einem anderen WebPart benutze ich die ToolPart bzw. den EditorPart. Das funktioniert auch ganz gut. Nur in diesem Projekt darf der Anwender garnicht erst in die WebPart Properties rein! Denn das kann ich nicht WebPart spezifisch steuern und müsste den Benutzer erlauben alle WebPart Eigenschaften bearbeiten zu dürfen. und das möchte man hier nicht. Daher hatte ich mir überlegt eine Property anzulegen diese aber aus dem WebPart selbst heraus (via Textbox und Button) zu befüllen und mit SetPersonalizationDirty() persistent zu machen.

Würde das etwas bedeuten, dass wenn der Benutzer erst garnicht dieses Recht hat die WebPart Properties zu öffnen und zu bearbeiten, folglich auch meine Funktion nicht das Recht hat die Property der WebPart zu stezen und mit SetPersonalizationDirty persistent zu machen?

Wenn dem so wäre, verstehe ich aber nicht warum es auch mit RunWithElevatedPrivileges ebenfalls NICHT funktioniert!?!? Dann müsste das doch tatsächlich ein Bug sein!

Ohne Rang
929 Beiträge
Thomas Östreich Als Antwort am 29 März 2010 16:38
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="sharepointkb"]

Wenn dem so wäre, verstehe ich aber nicht warum es auch mit RunWithElevatedPrivileges ebenfalls NICHT funktioniert!?!? Dann müsste das doch tatsächlich ein Bug sein!

[/quote]

Kein Bug!

RunWithElevatedPrivileges  funktioniert nur mit einen neuen SPSite und SPWeb Objekt und nicht mit Objekten im Context des Benutzers!

Benutze einfach eine Hidden List für die Properties. 

Ohne Rang
17 Beiträge
sharepointkb Als Antwort am 29 März 2010 16:42
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Folglich heißt das jetzt, nur für mich nochmal in Klartext, dass mein Webpart ein Objekt ist und IMMER im Kontext des aktuell angemeldeten Benutzers läuft. Richtig?

Vielen Dank für die Hilfe und vor allem diese sehr aufschlußreiche Information!

Ohne Rang
929 Beiträge
Thomas Östreich Als Antwort am 29 März 2010 16:51
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="sharepointkb"]Folglich heißt das jetzt, nur für mich nochmal in Klartext, dass mein Webpart ein Objekt ist und IMMER im Kontext des aktuell angemeldeten Benutzers läuft. Richtig?[/quote]

Ja, da du ja Änderungen am eigentlichen Objekt versucht ist dies so nicht möglich.