Website Users Webpart

Enterprise Information     23.11.2015

Website Users Webpart

In einem zurückliegenden Projekt war eine der Anforderungen die aktuell berechtigten Personen auf einer Website anzuzeigen. Im Sinne einer schnellen und einfachen Lösungsfindung fiel die Wahl auf das Site Users Webpart. Dieses zeigt – je nach Konfiguration – Gruppen oder Personen an, die auf der jeweiligen Website Berechtigt sind. Besonderer Vorteil: Wählt man die Option „Personen und Gruppen mit direkten Berechtigungen“ auf die Website, werden auch Personen angezeigt, die losgelöste Berechtigungen z.B. direkt auf Listenelemente haben. Dadurch bekommt man eine schöne und einfache Übersicht welche Personen auf der jeweiligen Seite berechtigt sind, ohne dass man über die Site Actions in das passende Untermenü wechseln muss.

Schöne SharePoint Welt
Bis zu dieser Stelle war alles in bester Ordnung. Wir haben ein Website-Template erzeugt und dieses entsprechend für das erstellen von Sub-Websites verwendet. Bei weiteren „Real-World-Tests“ stellte sich nun leider heraus, dass die Berechtigungen von Personen zwar richtig dargestellt werden, wenn neue Personen hinzugefügt werden, nicht aber aktualisiert werden, wenn Berechtigungen entfernt wurden.

 
Wie jetzt?!
Nach einiger Recherche-Arbeit stellt sich heraus, dass die SharePoint interne User Information List nicht aktualisiert wird. Das Webpart „Site Users“ greift direkt auf diese Liste zu. Schnell war klar, dass letztlich diese Liste aktualisiert werden muss. Die Frage war nur, wie erreicht man das?
Szenario
Im vorliegenden Fall ging es darum, Berechtigungen innerhalb einer Website anzuzeigen. Die expliziten Berechtigungen konnten nur in einer bestimmten Dokumentenbibliothek vergeben werden (Das Beispiel kann aber ohne Probleme auf andere Szenarien übertragen werden). Das Hinzufügen von neuen Personen hat – wie bereits erwähnt – problemlos funktioniert. Wurden die Berechtigungen aber entfernt, wurde die interne User Information List nicht weiter aktualisiert. Zwar hatten die Betreffenden Benutzer keine Rechte mehr die Website bzw. die entsprechenden Listenelemente aufzurufen, sie wurden aber dennoch als Berechtigt angezeigt.

Lösung:

Erste Idee war das Problem mit einem Event Receiver zu lösen – guter Versuch – es gibt leider kein Event welches eine „Rechte Änderung“ trackt. Nächste Überlegung: ein JavaScript Event an die Formular-Action hängen. Auch nicht Ideal da die User Information List nicht über das Client OM bearbeitet werden kann (Administrationsberechtigungen notwendig). Das REST Interface fällt mit dieser Erkenntnis ebenfalls aus. Somit bleibt nur noch C# Code.
Schlussendlich bin ich bei einer Lösung gelandet die eher ein Workaround ist. Ich habe einen TimerJob erstellt, der in regelmäßigen Abständen die Inhalte überprüft ob die Website Benutzer noch mit den Berechtigungen übereinstimmen.

Um Benutzer Berechtigungen zu Tracken habe ich eine einfache Klasse Erstellt:
class UserPermission
    {
        public int userId { get; set; }
        public string loginName { get; set; }
        public List<int> itemsWithPermission { get; set; }

        public UserPermission()
        {
            itemsWithPermission = new List<int>();
        }
      
    }

Zunächst müssen alle User für das aktuelle Web abgerufen werden:
SPUserCollection col = web.Users;
List<UserPermission> UserIds = new List<UserPermission>();

In meinem Fall wurden anschließend die Personen aus bestimmten Gruppen ausgefiltert, es waren nur Personen gesucht die über direkte Berechtigungen verfügten:
foreach (SPUser user in col)
{
if (web.Groups.GetByName(<groupName>).Users.GetByID(user.ID) == null)
{
       UserPermission userC = new UserPermission();
       userC.loginName = user.LoginName;
       userC.userId = user.ID;
       UserIds.Add(userC);
}
  
  }
Im Projekt gab es nur eine Liste die gesonderte Berechtigungen enthalten kann. Daher wird diese geholt und nun die Elemente geprüft. Es wird über alle Elemente mit expliziten Berechtigungen iteriert. Diese werden wiederum mit den bekannten User verglichen – somit wird sichergestellt, dass keine Benutzer entfernt werden die noch über Berechtigungen verfügen. In der UserPermissions-Klasse gibt es eine Eigenschaft „itemsWithPermissions“ hier werden sämtliche Elemente festgehalten, für die der aktuell geprüft Benutzer Berechtigt ist.
SPList li = web.Lists.TryGetList(<ListName>);
            if(li == null)
            {
                return;
            }

            Collection<SPListItemInfo> info = li.GetItemsWithUniquePermissions();
            foreach (SPListItemInfo inf in info)
            {
                SPListItem item = li.GetItemById(inf.Id);
                foreach (UserPermission user in UserIds)
                {
                    SPPermissionInfo perm = item.GetUserEffectivePermissionInfo(user.loginName);
                    if (perm.Permissions.HasFlag(SPBasePermissions.EditListItems))
                    {
                        user.itemsWithPermission.Add(item.ID);
                    }
                }
            }

Abschließend muss noch geprüft werden, ob einer oder mehrere Benutzer noch aktuelle Berechtigungen haben. Sollten hier keine Berechtigungen mehr vorliegen kann dieser Benutzer entfernt werden.
foreach (UserPermission user in UserIds)
            {
                if (user.itemsWithPermission.Count == 0)
                {
                    web.Users.RemoveByID(user.userId);
                }
            }

Wenn jemand eine Bessere Möglichkeit sieht - oder kennt – mit der eben dieses Szenario eleganter oder einfacher zu lösen ist (abgesehen von einem 3. Anbieter), würde ich mich über einen Kommentar freuen.


Nachbericht: System Center Universe (SCU) Europe 2015

System Management, Microsoft, On The Road     15.09.2015

In diesem Jahr fand zum dritten Mal das Community Event System Center Universe (SCU) Europe statt. Veranstaltungsort war 2015 das schöne Basel. Die Themen der Veranstaltungsreihe drehen sich stets um System Management, Virtualisierung, Cloud und Datacenter. Bei den Referenten handelt es sich durch die Bank um Microsoft MVPs und andere Experten aus den jeweiligen Bereichen. In den Vorträgen wird aber nicht nur präsentiert, sondern auch rege diskutiert.

Natürlich lag dieses Jahr ein besonderer Fokus auf Windows 10, Azure und Automation. Daneben wurde das Publikum mit auf Ausflüge in Richtung Internet of Things, neue Server und System Center Versionen und Powershell genommen. Zwischen den Vorträgen hatte man auch immer die Möglichkeit mit den Sprechern in so genannten „Ask an Expert“ Zeiten, Probleme zu besprechen und über neue Technologien zu diskutieren.


SharePoint Anekdote: Mehrzeilige Textfelder, die Funktion „Text anfügen“ und Workflows

IT Anekdoten, Enterprise Information     06.07.2015

SharePoint bietet ein äußerst praktisches Feature: das "Versionieren" eines einzelnen Feldes. Diese Funktion ermöglicht es, innerhalb von Formularen direkt zu sehen, wer wann welche Einträge im aktuellen Feld vorgenommen hat. Das Interessante dabei: Möchte man diese Werte innerhalb eines Workflows verwenden, sieht es leider düster aus. Dadurch, dass das Listenelement versioniert wird, wird bei jeder Änderung eine neue Version des Elementes erzeugt. Soweit so gut. Leider arbeitet die Funktion "Text anfügen" standardmäßig mit einem leeren Feld. Wird also eine neue Version des Elementes erzeugt, ist dieses Feld von Haus aus leer.

Und jetzt kommt's: Ein Workflow der direkt am Element hängt erzeugt immer eine neue Version, da er seinen Status über die entsprechende Spalte reportet. Damit ist das Multiline-Feld für den Workflow allzeit leer. Was also tun? Der Kunde bestand auf dieser Funktion! Ich habe mir in diesem Fall mit einem Event Receiver und einer Hilfsspalte beholfen. Der Receiver schreibt die aktuellen Inhalte des Multiline-Felds in das Hilfsfeld, welches wiederum im Workflow verwendet wird. Somit wäre auch diese Falle umgangen.


Geschichten, die das IT-Leben schreibt

IT Anekdoten     03.06.2015

In unserer neuen Kategorie "IT Anektoden" wollen wir Beiträge unserer Kollegen sammeln, die zu den unterschiedlichsten Themen Ihre ganz besonders amüsanten und zum Schmunzeln verleitenden Erfahrungen, Fehler und Problemchen beschreiben.

Lesen Sie hier ab sofort Geschichten aus dem täglichen (IT-)Leben unserer IT-Entwickler, IT-Berater, IT-Admins und IT-Strategen. Haben Sie ebenfalls eine IT-Anekdote? Schreiben Sie uns gerne direkt per Mail oder als Kommentar!

Und nun viel Spaß bei der Lektüre!


Mehr als 15.000 ITIL Schulungsunterlagen verkauft

25 Jahre COC AG     21.05.2015

Seit 25 Jahren planen, konzeptionieren und organisieren wir komplexer Kundenprojekte im Bereich IT Service Management. Daraus ist neben der Entwicklung eines IT Service Management Modells auch ein Trainingsangebot zu im Bereich ITIL entstanden.

Als offizielle Aus- & Weiterbildungseinrichtung für IT Service & Support sind wir natürlich auch Autor offizieller ITSM Fachliteratur die im HERDT Verlag erscheint.

Und eben diese hat sich seit 2001 mehr als 15.000 mal verkauft!