Posts mit dem Label Berechtigung werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Berechtigung werden angezeigt. Alle Posts anzeigen

Freitag, 29. August 2008

Berechtigungen für Quicklaunch-Elemente in der Navigation programmatisch vergeben

In unserem aktuellen Projekt ist es u.a. eine Anforderung, dass ein Element der Quicklaunchnavigation nur für bestimmte Benutzergruppen sichtbar ist.

Über die Oberfläche ist dies mit wenigen Klicks durchführbar:



Da die Gruppen, die hier berechtigt werden sollen, allerdings erst beim Erstellen eines neuen Subwebs via FeatureReceiver angelegt werden, muss die Berechtigung des Quicklaunches ebenfalls programmatisch erfolgen:


SPNavigationNodeCollection quickLaunch = web.Navigation.QuickLaunch.Navigation.QuickLaunch;

...

// new link: "Offene Aufgaben"
sb = new StringBuilder(Settings.openTasksUrl);
SPNavigationNode openTasksNode = new SPNavigationNode(Settings.openTasksTitle, sb.ToString());
quickLaunch.AddAsFirst(openTasksNode);
openTasksNode.Update();

openTasksNode = quickLaunch[0];

// set audience only to special groups
if (openTasksNode.Properties.ContainsKey("Audience"))
{
openTasksNode.Properties.Remove("Audience");
}

openTasksNode.Properties.Add("Audience", ";;;;" + Settings.groupNameTechnicansTitle + "," + Settings.groupNameCommercialsTitle + "," + Settings.groupNameBusinessManagerTitle);
openTasksNode.Update();

Im ersten Teil wird ein neues Objekt vom Typ SPNavigationNode erzeugt und der vorhandenen SPNavigationNodeCollection quickLaunch hinzugefügt. Diese kann einfach aus dem aktuellen web gezogen werden.

Da das SDK sich leider etwas ausschweigt was mögliche Properties eines SPNavigationNode-Objektes angeht, war etwas Recherchearbeit nötig und letztenendes das Debuggen und Abfragen eines vorhandenen SPNavigationNode-Objektes (mit über die Oberfläche gesetzten Gruppenberechtigungen) im Visual Studio-Debugger. In den Properties gab es unter anderem den Key "Audience" und seinen Value ";;;;Techniker,Kaufleute,Business Manager".

Das war also das Format, indem die Gruppen dem SPNavigationNode zugewiesen sein müssen.
Das Property wird für das SPNavigationNode-Objekt also gesetzt und dieses dann noch einmal geupdated.

Wichtig hierbei ist, dass die Gruppen irgendwie eindeutig benannt sind. SharePoint sucht nicht nur im Namen einer Gruppe sondern auch in deren Beschreibung. Gibt es mehrere Gruppen in denen z.B. in der Beschreibung "Kaufleute" auftaucht (z.B. "Benutzergruppe Kaufleute" und "Benutzergruppe Logistik Kaufleute"), kann SharePoint dies nicht mehr eindeutig zuordnen und im Zielgruppen-Editor wird derjenige Gruppeneintrag unterkringelt.

Freitag, 11. Juli 2008

Fehler bei Benutzer-Auswahlfeldern, die keine sind

Höchst erfreulich ist es, wenn man zum Feierabend am Freitag noch seltsame "Fehler" gelöst bekommt und dabei sogar noch etwas lernt:

Einer Liste haben wir über unsere Solution ein UserField hinzugefügt welches wir per FeatureReceiver auf eine - vorher in einem anderen FeatureReceiver generierte - Benutzergruppe zeigen lassen um die Suche im Katalog auf diese Gruppe einzuschränken.

Das hat auch wunderbar funktioniert... Wenn ich als SiteCollection-Administrator ein neues Element innerhalb dieser Liste erstellen möchte, sieht das Formular aus, wie erwartet. Als anderer User, egal, welche Rolle (ausser dem SiteCollection-Administrator) er innehat, erscheint die "Fehlermeldung": "Das Steuerelement ist nicht verfügbar, da Sie nicht über die erforderlichen Berechtigungen verfügen."

Googeln hat leider nichts ergeben, auch das Herumspielen mit den Berechtigungen des Users oder der Gruppe, in der er Mitglied ist, blieb erfolglos.

Dann aber fiel der Groschen, als ich mich an ein früheres SharePoint-Projekt von uns erinnerte. Düster erinnerte ich mich, dort mal eine Einstellung gesehen zu haben, die schaltet, wer Mitgliedschaften einer Gruppe anzeigen darf. Und siehe da, nachdem ich über die Oberfläche die Einstellung "Jeder" vornahm, hat es plötzlich funktioniert.

Rot umrandet im unteren Bild: die "Fehlermeldung"
Grün umrandet im unteren Bild: der Soll-Zustand des Auswahlfeldes, nachdem "Jeder" gewählt wurde




Das nächste Bild zeigt die Einstellung in den Gruppeneinstellungen:



Nun galt es noch, das ganze programmatisch umzusetzen, was in drei Zeilen erledigt war:

SPGroup spGroup = siteGroups[groupTitle];
spGroup.OnlyAllowMembersViewMembership = false;
spGroup.Update();
spGroup.OnlyAllowMembersViewMembership = true; würde bewirken, dass die Einstellung "Gruppenmitglieder" gewählt wird.

Fazit: Manchmal sind Fehler gar keine Fehler im herkömmlichen Sinne. Hier muss ich wohl noch etwas mehr in die SharePoint-Denke hineinkommen. ;-)