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.


Custom Field Types Zugriff verweigert

Geprüfte Antwort Dieser Beitrag hat 13 Antworten

Ohne Rang
58 Beiträge
cwicky erstellt 26 Mrz 2011 10:13
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo zusammen,

ich habe mal wieder ein Problem.

Ich habe auf einer virtuellen Machine (Server 2003 32 bit) ein Custom Field Type entwickelt (3 Drop Down Felder, welche von einerander abhängig sind. Auf der virtuellen Maschine deployed und getestet. Funktioiniert alles wunderbar.

Jetzt wollte ich das Custom Field auf das Live-System(Server 2008 64 bit) installieren. dazu habe ich die UserControls in das entsprechende Verzeichnis kopiert, die fldtypes_NAME XML-Datei in das entsprechende Verzeichnis kopiert und meine .dll in den GAC kopiert.

Nun kommt mein Problem, wenn ich das Feld auswähle (bis hier hin funzt alles, da ich das Feld ja in der bei Spalte hinzufügen auswählen kann), dann aber, nachdem ich das Feld ausgewählt habe, bekomme ich eine Fehlermeldung:

Zugriff verweigert
Bitte beantragen Sie...

Ich bin Administrator auf der Seite!

Hat jemand einen Tipp?

Kann es sein das ich nicht auf den GAC zugreifen kann, denn um Sachen rein zu kopieren brauche ich volle Admin Rechte(Als Admin ausführen etc.)

Vielen Dank im Voraus!

Gruß
cwicky 

Alle Antworten

Ohne Rang
122 Beiträge
Christian Groß Als Antwort am 27 Mrz 2011 14:23
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

kann es vielleicht sein das du beim testsytem die lösung deployed hast, und die Dateien im Live-System nur hinzugefügt hast? Ich vermute das du wahrscheinlich die SaveControlseinträge für die  Usercontrols in der webconfig vergessen hast. Aber nur eine Vermutung.

SharePoint Solutions - www.solutions2share.net

Ohne Rang
58 Beiträge
cwicky Als Antwort am 27 Mrz 2011 20:37
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Danke für den Tipp, den könnte ich wahrscheinlich für meine Webparts gut gebrauchen, kannst Du mir vielleicht noch veraten in welcher web.config und was ich den SaveControls setzen müsste?

Aber CustomFields habe ich eigentlich nicht deployed, sondern per Batch-Datei installieren lassen.

In der Batch mache eigentlich nichts anders als meine User Controls und fldtypes an entsprechende Stellen zu kopieren und die .dll in den GAC zu installieren.

Wie gesagt, in der Auswahl für die Spaltentypen in der Liste sehe ich auch meine Spalte, also scheint auch alles richtig installiert zu sein.

Aber ich denke auch, dass es irgendwas mit Sicherheit von SP zu tun hat. Ich habe mir ein Custom Field Type geschrieben, welchess drei Dropdown-Felder beinhaltet. Das erste listet alle Websites auf, nicht nur aus einer Websitesammlung, sondern ggf. aus mehreren. Das zweite listet alle Listen in der ausgewählten Website auf und das letzte listet alle Felder der Liste.

 

Ohne Rang
122 Beiträge
Christian Groß Als Antwort am 27 Mrz 2011 20:52
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Dann wird der aktuelle Account wohl nicht ausreichend Berechtigung auf die anderen SiteCollections haben. Sollte beim Debuggen aber rauskommen, oder durch das Eventlog. SharePoint Log würde auch Fehler anzeigen.

Beim Auslesen der Webs oder der SiteCollection würde ich es einfach mal mit erhöhten Rechten versuchen:

http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spsecurity.runwithelevatedprivileges.aspx

Gruß

Christian 

SharePoint Solutions - www.solutions2share.net

Ohne Rang
58 Beiträge
cwicky Als Antwort am 28 Mrz 2011 15:07
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Danke für den Tipp.

Scheind mir der richtige Ansatz zu sein. Allerdings habe ich es mit den erhöhten Rechten bislang ohne Erfolg probiert.

Wenn ich mich als Websitesammlungs Admin anmelde, dann funktioniert alles.

Gruß
Christian

Ohne Rang
58 Beiträge
cwicky Als Antwort am 28 Mrz 2011 16:46
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Leider funktioniert dieser Ansatz nicht.

Hat jemand noch eine andere Alternative, Code mit anderer/höhrerer Berechtigung auszuführen?

Ohne Rang
929 Beiträge
Thomas Östreich Als Antwort am 28 Mrz 2011 18:25
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

SPSecurity.RunWithElevatedPrivileges, erlaubt dir die Ausführung als System, wobei System der Account deines ApplicationPools ist somit ist nur der Zugriff auf WebSites der aktuellen WebApplication mit vollen Rechten möglich.

Alternativ kannst du auch den SPUser angeben beim erstellen der SPSite instanz.

Am besten Poste mal ein wenig Code wie du SPSecurity.RunWithElevatedPrivileges implementiert hast, bzw wie du auf die SiteCollection zugreifst.

Ohne Rang
58 Beiträge
cwicky Als Antwort am 28 Mrz 2011 19:52
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich versuche mit folgendem Code auf die Website etc.zu zugreifen:

...
        protected void fillWebDropDown()
        {

            //ddlPropWeb ist mein Dropdown Feld
            ddlPropWeb.Items.Clear();
            SPSecurity.RunWithElevatedPrivileges(delegate()
            {
                using (SPSite oSiteCollection = SPContext.Current.Site)
                {
                    SPWebCollection collWebsite = oSiteCollection.AllWebs;
                    {
                        List<Website> websites = new List<Website>();

                        for (int i = 0; i < collWebsite.Count; i++)
                        {
                            using (SPWeb oWebsite = collWebsite[i])
                            {
                                if (oWebsite.IsRootWeb)
                                {
                                    websites.Add(new Website(oWebsite.Title + "(Root)", oWebsite.ID.ToString()));
                                }
                                else
                                {
                                    websites.Add(new Website(oWebsite.Title, oWebsite.ID.ToString()));
                                }
                            }
                        }

                        websites.Sort();
                        foreach (Website website in websites)
                        {
                            ddlPropWeb.Items.Add(website.titleWebsite);
                        }
                    }
                }

                ddlPropWeb.Items.Insert(0, "-- Auswählen --");
            });
        }

Die Methode fillWebDropDown wird in der CreateChildControls Methode aufgerufen.

Mein Ziel ist es, ein Custom Field zu bauen, welches mir Informationen aus einer bestimmten Spalte aus einer beliebigen Liste einer Website zurückgibt. Das standardmäßige Feld "nachschlagen" ist nur auf Website-Ebene möglich (Wahrscheinlich aus o.g. Grund).

Als Websitesammlungsadmin funktioniert mein Code.

Gruß

Christian

Ohne Rang
66 Beiträge
Sigi Weber Als Antwort am 28 Mrz 2011 19:59
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ersetze:

using (SPSite oSiteCollection = SPContext.Current.Site)

durch:

using (SPSite oSiteCollection = new SPSite(SPContext.Current.Site.ID))


Cheers,

Sigi Weber

Ohne Rang
58 Beiträge
cwicky Als Antwort am 28 Mrz 2011 21:20
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ist leider gleicher Effekt.

Bekomme immer wieder die Meldung "Zugriff verweigert".

Ohne Rang
66 Beiträge
Sigi Weber Als Antwort am 28 Mrz 2011 21:37
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Strange. "AllWebs" erfordert Site Collection Admin Rechte. Daher funktioniert es bei dir auch wenn du es als Admin laufen lässt.

Dein Fehler war dass du innerhalb des "RunWithElevatedPrivileges" ein Objekt verwendet hast welches ausserhalb des "RunWithElevatedPrivileges" instanziert wurde ("SPContext.Current.Site"). Daher lief dein "oSiteCollection"  Objekt mit den Rechten des derzeitigen Users und nicht elevated mit dem Web Application Pool Account.

Mein Tipp war daher ein neues SPSite Objekt zu instanzieren und diesem die GUID des "SPContext.Current.Site.ID" mit zu geben. In 99% aller Fälle hat dies bei mir in den letzten Jahren das Problem gelöst.

Ich könnte mir jetzt nur noch vorstellen dass dein System noch den alten Code/Assembly gecacht hat. Daher mache ich bei solchen Aktionen immer einen IISRESET und starte je nach Anwendungsfall auch noch alle SharePoint Dienste neu.

Probier mal den IISRESET und mach auch den Browser Cache leer...

Cheers,

Sigi Weber

Ohne Rang
929 Beiträge
Thomas Östreich Als Antwort am 28 Mrz 2011 21:42
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Und wie holst du dir dann die Listen? und Felder?

Bist du dir auch sicher das der Fehler in diesem Teil kommt? Den Fehler den ich erkennen konnte hat ja Siegfried schon behoben, aber vielleicht hast du ja genau so einen Fehler beim ermitteln der Listen oder Felder.

http://xgleich8.wordpress.com/tag/spsecurity/

 

Ohne Rang
66 Beiträge
Sigi Weber Als Antwort am 28 Mrz 2011 21:48
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Da hat Thomas natürlich völlig Recht!

Du musst innerhalb eines "RunWithElevatedPrivileges" alle Objekte "frisch" instanzieren. Verwende daher niemals einen SPContext innerhalb eines "RunWithElevatedPrivileges" es sei denn er dient dazu ueber die GUID ein Objekt neu zu instanzieren. Also:

SPSite elevatedSite = new SPSite(SPContext.Current.Site.ID)

SPWeb elevatedWeb = elevatedSite.OpenWeb(SPContext.Current.Web.ID)

SPList elevatedList = elevatedWeb.Lists[SPContext.Current.List.ID]

bis herunter zum SPListItem...

Cheers,

Sigi Weber

Ohne Rang
58 Beiträge
cwicky Als Antwort am 29 Mrz 2011 12:46
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo zusammen,

super vielen Dank für Eure Hilfe, es hat geklappt.

Ich habe gestern einfach mal meinen PC heruntergefahren und als ich heute morgen den PC und die virtuelle Umgbung angemacht habe, hat alles sofort funktíoniert. Wahrscheinlich war irgendwas im Speicher, einen IISRESET hatte ich gemacht.

@Thomas: Es konnte nur an diesem Dropdown-Feld liegen, da ich alle anderen auskommentiert hatte.

Vielen Dank und schöne Grüße

Christian