Zentrale Steuerung des Vorlagenmanagements über 3 Kontinente hinweg

DOCUNIZE     09.09.2016

Das Kundenunternehmen mit Stammsitz in Deutschland ist einer der führenden internationalen Spezialisten für Finanzierungslösungen und Dienstleistungen, insbesondere in der Immobilienwirtschaft. Zur unternehmensweiten Steuerung Ihres Vorlagenmanagements hat sich das Unternehmen für das Vorlagenmanagement-System DOCUNIZE™ entschieden.

Die Aufgabenstellung
Ca. 1200 User von 21 Standorten auf 3 Kontinenten sollen auf die mehr als 1150 Vorlagen zugreifen können. Insgesamt liegen die Vorlagen in 6 Sprachen vor. Änderungen an den Vorlagen sollen zentral und sofort für alle Standorte verfügbar sein. Anforderungskriterien an das neue Vorlagenmanagement sind Revisionssicherheit, Zuverlässigkeit und Anwenderfreundlichkeit.
Eine weitere Vorgabe war die Einbindung des Vorlagenmanagement-Systems in das Dokumentenmanagement-System Doxis4.

Die Ausgangssituation
Die Vorlagen beim Kunden stammen aus ganz unterschiedlichen Bereichen – aus der Kreditabteilung, der Unternehmenskommunikation, der Organisation, aus Information & Technologie sowie aus dem Bereich Human Resources.
Für die Erstellung der Vorlagen waren die Autoren aus den einzelnen Fachbereichen – unterstützt durch das Vorlagenteam - zuständig. Die Freigabe erfolgte durch die Führungskräfte bzw. Abteilungsleiter. Organisatorisch wurden die Vorlagen jeweils als Dateianhang an das Vorlagenteam versendet. Das Vorlagenteam kümmerte sich um die Qualitätssicherung und technische Bereitstellung. Zur Administration wurde ein hauseigenes Tool auf Basis einer Access-Datenbank eingesetzt.

Integration von Vorlagenmanagement und Dokumentenmanagement
Um die Anforderung zur Unterstützung von Barcodes umzusetzen, erfolgte eine Anbindung an das beim Kunden eingesetzte DMS Doxis4 des Enterprise Management-Spezialisten SER. DOCUNIZE™ und Doxis4 sind über ein Web/HTTP API angebunden. Hierbei werden von Doxis4 Daten im XML-Format geliefert, von DOCUNIZE™ zusammen mit der Vorlage generiert und wieder an Doxis4 zurückgeliefert. Vorlagen werden in Doxis4 mit Vorgängen verknüpft. Der Anwender erfasst die Stammdaten zu diesem Vorgang und erstellt auf Basis dieser Daten diverse Dokumente. Die Generierung erfolgt durch DOCUNIZE™, die Ablage der Dokumente erfolgt in Doxis4.
Für die Zukunft ist auch noch eine Anbindung von DOCUNIZE an SAP geplant.

 

 


Datenversorgungsprozess (DVP)

Allgemein     07.09.2016

Datenversorgungsprozess (DVP) für den digitalen Show Room eines renommierten Automobilherstellers

Mit seinem digitalen Show Room Projekt überträgt ein namhafter Automobilbauer den automobilen Vertrieb konsequent in die digitale Welt . Hierzu betreibt das Unternehmen in  sechs  großen Metropolen der Welt besondere Verkaufs- und Kundenkontaktstandorte.

In  diesen Erlebnis Show Rooms können sich Besucher unter Einsatz modernster Multimedia- und Informationstechnologie die aktuellen Fahrzeugmodelle  nach Wunsch individuell konfigurieren und naturgetreu auf Powerwalls oder über Virtual Reality Brillen darstellen lassen
Um das Kundenerlebnis möglichst optimal und reibungslos zu gestalten, setzt der Automobilhersteller nicht nur bei der Technologie in den Show Rooms, sondern auch bei der Technologie hinter den Kulissen auf innovative Lösungen. Ein entscheidender Aspekt ist die Verwaltung und Steuerung der sich laufend ändernden digitalen Inhalte die in den Show Rooms präsentiert werden, aber auch die kontrollierte Ausbringung von relevanten Software- und Firmware-Updates die für den problemlosen Betrieb der IT-Systeme vor Ort benötigt werden

Dazu wurde ein Projekt  mit der Anforderung,  den Prozess zur Datenversorgung der  in den  Show Rooms eingesetzten Module unter Zuhilfenahme eines softwaregestützten Tool-Sets zu optimieren und zu zentralisieren, ins Leben gerufen. Ziel sollte die zuverlässige, automatisierte Implementierung von Inhalten in Entwicklungs-, Test- und Produktivumgebungen innerhalb des Show Rooms sein.

In enger Zusammenarbeit mit Microsoft Deutschland entwickelte die COC AG ein Proof of Concept (POC) und erhielt den Zuschlag zur Umsetzung. Die im POC gemeinsam mit allen beteiligten Stakeholdern (Entwickler/ Lieferanten, Config- & Release Manager, Betrieb und Lab Verantwortliche) definierten Anforderungen, werden allesamt durch Einsatz von Microsoft Technologie erfüllt.

So erfolgt nun der gesamte Prozess der Datenversorgung, von der Anlieferung der digitalen Inhalte und Inhaltsteile, über die Versionierung und das Deployment bis hin zu Statusreportings und dem Monitoring mit modernen Microsoft Lösungen. Zentrale Plattformen bei der Umsetzung sind dabei Microsoft Visual Studio – Team Fundation Server (TFS) und Microsoft System Center Configuration Manager 2012 (SCCM 2012). Als Basis für den Betrieb dienen die Microsoft System Services auf Microsoft Azure. Mit der Entscheidung für eine Cloud-basierte Lösung wurden von Projektstart an die Weichen gestellt, um zum einen die für den Automobilhersteller sehr wichtigen Punkte Datensicherheit und Integrität vollumfänglich zu adressieren, gleichzeitig aber auch eine möglichst hohe Verfügbarkeit und Skalierbarkeit der Systeme zu gewährleisten.

Der Projektleiter beim Automobilhersteller äußert sich sehr lobend über die Durchführung und das erzielte Ergebnis: „Die COC AG und Microsoft Deutschland überzeugten uns mit einem umfassenden Paket aus langjähriger Erfahrung im Bereich IT-gestützten, industriellen Supply Chain Managements und einem leistungsfähigen Lösungsportfolio, das ideal aufeinander abgestimmt ist. Unser Hautaugenmerk lag von Beginn an auf einer möglichst umfangreichen Funktionalität der Lösung und einem leistungsfähigen Backend. Beide Punkte werden im bisherigen Projektverlauf zu unserer vollsten Zufriedenheit erfüllt und ich bin mir sicher, auch das Ergebnis wird vollends überzeugen. Nach Abschluss des Projekts werden wir über eine hochskalierbare Lösung verfügen, die uns dauerhaft Zukunftssicherheit garantiert und uns die Vorbereitung auf weitere benötigte Cloud-Dienste, die wachsende Projektanforderungen mit sich bringen, immens erleichtern wird.“

Thaddäus Hinterberger, verantwortlicher Projektleiter bei der COC AG: „Wir freuen uns sehr, Teil eines solch zukunftsweisenden Projekts zu sein. Unser Auftraggeber zählt zu den automobilen Pionieren im Bereich Digital Retail und das aktuelle Projekt ist erst der Anfang. Neben den Flag Ship Stores, die aktuell überall auf der Welt entstehen, werden mittelfristig einem größeren Kreis an Händlern sogenannte Handelsmodule zur Verfügung gestellt. Das Projekt bietet also noch genügend Wachstumspotenzial und ich bin stolz, dass wir als maßgeblicher Lieferant verschiedener IT Services das Projekt begleiten dürfen.“

 

 


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.