francis bonami - Fotolia

Was das Microsoft Bot Framework heute bereits kann

Mit dem Microsoft Bot Framework können Entwickler eigene Chatbots implementieren und veröffentlichen. So unterstützen die Bots Geschäftsprozesse.

Chatbots sind persönliche Assistenten, die den Alltag erleichtern. Sie finden hohe Akzeptanz bei Anwendern. Denn die intelligenten Systeme ermöglichen eine Interaktion über Sprache – fast wie mit einem realen Menschen. Mit dem Microsoft Bot Framework können Entwickler schnell und einfach eigene Chatbots implementieren, testen und veröffentlichen. Wir stellen Ihnen die Plattform vor und zeigen Ihnen an einem praktischen Beispiel, wie Bots die Umsetzung von Geschäftsprozessen unterstützen oder automatisieren können.

Mit der zunehmenden Automatisierung in der Arbeitswelt entstehen immer mehr kleinere Dienste, die Prozesse starten. Diese sind meist in Form von elektronischen Formularen umgesetzt, ob als Webformular oder Office-Dokument.

Nicht selten sind diese Formulare aber kompliziert aufgebaut – insbesondere, wenn Felder keinen Sinn machen und übersprungen werden können. Häufig enthalten einzelne Felder komplexe Regeln. Verstößt der Anwender beim Ausfüllen gegen die Regel, erhält er keine Fehlermeldung, da zur Verifikation vielleicht erst ein anderer Dienst benötigt wird.

Das alles führt dazu, dass Anwender unsicher sind, wie sie ein Formular im konkreten Fall ausfüllen müssen. Wir alle kennen das zum Beispiel aus unserer Steuererklärung. Doch während hier ein Steuerberater weiterhelfen kann, gibt es für Formulare in Unternehmen meist keinen Ansprechpartner – oder der Help Desk ist überlastet.

Chatbots als komfortable Alternative

Mit Chatbots wird das einfacher. Sie setzen dem Anwender kein großes Formular vor, sondern interagieren mit ihm. Der Nutzer spricht den Bot per Chat-Nachricht an, dieser antwortet mit einer Nachricht.

Das hat mehrere Vorteile. Zum einen ist eine Unterhaltung die natürliche Kommunikationsform für Menschen. Anders als ein großes Formular erzeugen sie keinen bürokratischen Stress. Zum anderen hat der Nutzer die Möglichkeit, Rückfragen zu stellen. Er kann auch von der geplanten Reihenfolge der Fragen abweichen oder gar die Beantwortung abbrechen und später wieder aufnehmen.

Je nach Intelligenz des Bots versteht er die natürliche Sprache des Nutzers und leitet aus den Nachrichten Schlussfolgerungen für nachfolgende Fragen ab. So kann er unpassende Fragen vermeiden. Die Antworten des Chatbots sind dabei nicht nur auf Texte oder einfache Auswahloptionen beschränkt. Er kann zum Beispiel frei formatierten Text mit Hyperlinks, Buttons oder auch Bildergalerien in den Nachrichten kombinieren. So lässt sich jede Nachricht individuell und optimal gestalten. Ferner lässt sich eine Konversation deutlich einfacher implementieren als ein komplexes Formular – insbesondere, wenn die Inhalte dynamisch sind.

Aufbau eines Bots.
Abbildung 1: Aufbau eines Bots.

Einen Chatbot mit dem Microsoft Bot Framework implementieren

Das Microsoft Bot Framework ermöglicht es, Chatbots schnell und einfach zu implementieren. Der Programmieraufwand beschränkt sich auf die Logik: Auf Anfragen eines Nutzers muss der Bot die Eingaben verarbeiten und passende Antworten generieren.

Um die Oberfläche muss man sich nur bedingt Gedanken machen. Denn mithilfe des Bot Connector Services lässt sich ein Bot in bestehende Applikationen einbinden. Die Verbindung zwischen Bot und Applikation erfolgt über einen Channel. Als Applikationen stehen hier vor allem chatbasierte Anwendungen wie Skype, Teams, Slack oder Facebook Messenger zur Verfügung. Praktisch ist, dass ein Bot gleichzeitig mehrere Channels nutzen kann. Es gibt drei Möglichkeiten, den Bot zu implementieren:

  • Am einfachsten ist es, den Azure Bot Service zu nutzen. Dieser hostet den Bot als PaaS. Sie müssen ihn lediglich konfigurieren und ihm einen oder mehrere Channels zuweisen. Die Implementierung kann mit C# oder Node.js entweder direkt in Azure erfolgen oder in Visual Studio beziehungsweise einer anderen Entwicklungsumgebung.
  • Soll der Bot in einer selbst gehosteten Umgebung laufen, können Sie ihn mithilfe eines Bot Builder SDKs kompilieren. Als Entwicklungssprache stellt Microsoft auch hier einen Bot Builder für C# und für Node.js zur Verfügung.
  • Als dritte Option kann ein Bot über eine REST API kommunizieren. Die Bot Connector REST API ermöglicht es Bots, Nachrichten an Channels zu senden und Nachrichten zu empfangen. Die REST API unterstützt dabei HTTPS als Transportprotokoll. Werden die REST-Nachrichten nur singulär abgesetzt, so fehlt für eine Kommunikation mit dem Anwender häufig der Zusammenhang zwischen den einzelnen Nachrichten. Mit der State REST API lassen sich Kontextinformationen speichern. So kann der Bot auf vergangene Chats mit dem gleichen Anwender zurückgreifen und zum Beispiel eine unterbrochene Konversation wieder aufnehmen.

Cognitive Services: Den Bot mit künstlicher Intelligenz ausstatten

Wie bereits dargelegt, liegt einer der Vorteile eines Chatbots darin, dass er über kurze Nachrichten kommuniziert und die Antworten des Anwenders in die eigenen Antworten einbeziehen kann. Daher ist es naheliegend, den Bot mit Intelligenz auszustatten. So wird die Kommunikation für den Nutzer noch natürlicher. Der Erweiterung sind prinzipiell keine Grenzen gesetzt, vom Verständnis des Kontextes über Analyse vorangegangener Kommunikation bis hin zu Sprach-/Bilderkennung und -ausgabe.

Holger Fleck, Axians IT Solutions

„Das Microsoft Bot Framework ermöglicht es, Chatbots schnell und einfach zu implementieren. Der Programmieraufwand beschränkt sich auf die Logik.“

Holger Fleck, Axians IT Solutions

Hierfür bietet Microsoft die Cognitive Services als Teil von Azure an. Dabei handelt es sich um eine Zusammenfassung mehrerer KI-Dienste. Mithilfe des Language Understanding Intelligent Service (LUIS) kann der Bot zum Beispiel die Intention des Anwenders erkennen. Er ist in der Lage, Sprache akustisch zu verstehen oder die eigenen Nachrichten in Sprache umzuwandeln und auszugeben.

Die Chat-Kommunikation beschränkt sich jedoch nicht nur auf Text. Der Anwender kann auch Bilder hochladen. Dadurch ergeben sich Einsatzszenarien, bei denen eine Bilderkennung sinnvoll erscheint. Beispiele könnten sein, dass man mittels Texterkennung einen Barcode, Zählerstand oder eine komplette Rechnung einliest. Der Anwender muss diese dann nicht umständlich abtippen.

Eine Oberfläche für den Bot

Sie können einen Bot in einer Applikation komplett selbst entwickeln oder ihn in verschiedene Applikation einbinden. Für Letzteres muss er im Bot-Framework-Portal registriert sein. Bei der Registrierung haben Sie die Möglichkeit, verschiedene Channels zu konfigurieren, die dann die Kommunikation zwischen dem Bot und der jeweiligen Applikation vermitteln.

Sowohl bei gewerblich betriebenen als auch bei Bots innerhalb eines Unternehmens ist es wichtig, die Bot-Nutzung im Auge zu behalten. Das Portal stellt dafür die Analysedienste von Azure Application Insights zur Verfügung. Sie ermöglichen es, die Kommunikationsdaten von Usern, Nachrichten und Channels auszuwerten.

Microsoft bietet eine Anbindung für verschiedene Dienste über Channels an (siehe Tabelle 1). Bei klassischen Messengern fehlt derzeit noch WhatsApp.

Im Bot-Portal angebotene Channels

Klassische Messenger

GroupMe, Kik, Skype / Skype for Business und Telegram

Komplexere Lösungen

Facebook, Microsoft Teams und Slack

Kommunikationsdienste

Cortana, E-Mail (Office 365) und Twilio (derzeit nur SMS)

Suchplattform

Bing

Eigene Website

Web Chat

Auch in Bing lässt sich ein Bot integrieren. Hier erfolgt die Kommunikation über die Suchzeile – der Bot antwortet in die Suchergebnisliste. Darüber hinaus kann ein Bot über ein E-Mail-Konto kommunizieren (derzeit ist dieses nur mit Office 365 Accounts möglich). Auch ein einfaches Web Chat Control steht zur Verfügung, sofern der Bot im Portal registriert ist. Er lässt als iFrame-Element in eine eigene Webseite einbinden. Auf dieser Webseite erscheint dann ein einfaches Chat Control als Verbindung zum Bot.

Derzeit gibt es keine Möglichkeit, eigene Channels zu entwickeln. Allerdings bietet das Bot Framework auch eine Kommunikation zwischen einem Client und dem Bot über eine API (Direct Line) an: Ein Client sendet Nachrichten an den Bot über HTTP POST und empfängt Daten entweder mit HTTP GET oder einem WebSocket vom Bot.

Textnachrichten und interaktive Aktionen

Viele Applikationen, die ein Bot per Channel nutzt, können neben reinen Texten auch Bilder darstellen und Mausklicks verarbeiten. Das Bot Framework unterstützt diese Optionen durch verschiedene Formen von Nachrichten. Bei der Definition einer Nachricht kann man den Text mit Markdown-Formatierungen (zum Beispiel fett, Überschriften, Listen, Hyperlinks und Bilder) erweitern.

Darüber hinaus lassen sich Nachrichten auch mit Dateianhängen ergänzen (zum Beispiel Videos, Audio-Dateien oder andere Dateien). Diese stehen dann in der Nachricht als Link zum Download bereit. Nützlich sind aber vor allem Buttons, die dem Benutzer das Eintippen einer Antwort abnehmen. Auf eine Ja/Nein-Frage eines Bots kann er dann zum Beispiel antworten, indem er auf die entsprechende Option klickt.

Johannes Wahl, Axians IT Solutions

„Sie können einen Bot in einer Applikation komplett selbst entwickeln oder ihn in verschiedene Applikation einbinden.“

Johannes Wahl, Axians IT Solutions

Darüber hinaus kann der Bot Nachrichten auch per Sprachsynthese vorlesen – sofern der Channel dafür geeignet ist. Eine Übersicht, wie die unterschiedlichen Nachrichten in der jeweiligen Applikation auf einem Smartphone dargestellt werden, zeigt der Channel Inspector.

Dabei gilt zu beachten, dass nicht alle Funktionen in allen Channels verfügbar sind. Das Bot Framework bietet zudem die Möglichkeit, Channel-spezifische Funktionalitäten zu implementieren.

Praxisbeispiel: Entwicklung eines Chatbots

Wer einen Bot entwickeln möchte, findet im Bot Framework ein entsprechendes Software Development Kit: das BotBuilder SDK. Es stellt Bibliotheken und Werkzeuge bereit, um Bots zu erstellen und zu debuggen. Im Folgenden erläutern wir anhand eines Beispiels die grundlegenden Konzepte, die für das Entwickeln von Bots relevant sind. Diese Konzepte sind unter anderem die bereits bekannten Channels, Dialoge, FormFlow und Activities.

Unser Chatbot soll zwei verschiedene Aufgaben ausführen können: Zum einen Besprechungsräume für eine bestimmte Anzahl von Personen suchen, um diese anschließend zu reservieren. Zum anderen Projekträume auf einer Microsoft-SharePoint-Plattform bereitstellen.

Doch woran arbeite ich als Entwickler, wenn ich einen Bot programmiere? Die Bot-Application-Vorlage für Visual Studio erzeugt einen Webservice. Der zentrale Einstiegspunkt ist die Post Methode der MessagesController Klasse:

Listing 1

public async Task<HttpResponseMessage> Post([FromBody]Activity activity)

{

 if (activity.Type == ActivityTypes.Message)

 {

 await Conversation.SendAsync(activity, () => new Dialogs.RootDialog());

 }

 else

 {

  HandleSystemMessage(activity);

 }

 var response = Request.CreateResponse(HttpStatusCode.OK);

 return response;

}

Ende

Wie Listing 1 zeigt, ist alles, was zwischen Bot und Channel hin und her gesendet wird, ein Objekt vom Typ Activity, welches der sogenannte Connector verschickt. Der Connector ist ein zentrales Konzept innerhalb des Bot Frameworks und Bestandteil desselben. Er stellt einen einzigen REST-API-Endpunkt zur Verfügung, über den ein Bot mit verschiedenen Channels wie zum Beispiel Facebook, Slack oder Skype kommunizieren kann.

Wenn ein Benutzer einem Bot eine Nachricht schreibt, versendet der Connector also ein Objekt vom Typ Activity. Es gibt mehrere Arten von Activities. Sie ermöglichen es dem Bot, auf unterschiedliche Ereignisse speziell zu reagieren. Activities vom Typ Message sind die sichtbare Kommunikation im Channel zwischen Bot und Endbenutzer.

Wie in Listing 1 zu sehen, wird in diesem Fall ein neuer Dialog erstellt oder ein bestehender Dialog an einem vorherigen Punkt weitergeführt. Auf eine vollständige Auflistung verzichten wir an dieser Stelle aufgrund des Umfanges. Hier nur ein kurzes Beispiel: Beim Hinzufügen und Entfernen von Kontakten zu einer Unterhaltung wird eine für die Benutzer unsichtbare Art von Activity versendet, damit der Bot gegebenenfalls auf dieses Ereignis reagieren kann. Für solche Fälle erzeugt die Vorlage standardmäßig die Methode HandleSystemMessage.

Unser Beispiel-Bot ist jetzt in der Lage, grundlegend auf Nachrichten zu reagieren. Für die zwei Use Cases fehlt jedoch noch ein wichtiges Konzept: Dialoge. Sie ermöglichen es, einen Gesprächsverlauf zu entwerfen und zu lenken. Dialoge können wiederum aus weiteren Dialogen bestehen. Auf diese Art und Weise lässt sich eine höhere Wiederverwendbarkeit erzielen.

Der Dialog Context enthält den Stack aller aktiven Dialoge zu jedem Zeitpunkt aufrecht. Jede Klasse, die als Dialog verwendet werden soll, muss das Interface IDialog implementieren und als Serializable gekennzeichnet sein. Jeder Dialog muss die Methode StartTask enthalten, die den Konversationsfluss einleitet.

Listing 2

public Task StartAsync(IDialogContext context)

{

 context.Wait(MessageReceivedAsync);

 

 return Task.CompletedTask;

}

 

private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)

{

 var reply = Common.CommonConversation.CurrentActivity.CreateReply("Hallo, wobei kann ich Ihnen helfen? Bitte wählen Sie aus den unten stehenden Optionen.");

 reply.Type = ActivityTypes.Message;

 reply.TextFormat = TextFormatTypes.Plain;

 

 reply.SuggestedActions = new SuggestedActions()

 {

  Actions = new List<CardAction>()

  {

   new CardAction(){ Title = "Besprechungsraum buchen", Type=ActionTypes.ImBack, Value="Besprechungsraum buchen" },

   new CardAction(){ Title = "Projektraum erzeugen", Type=ActionTypes.ImBack, Value="Projektraum erzeugen" }

  }

 };

 

 await Common.CommonConversation.Connector.Conversations.ReplyToActivityAsync(reply);

 

 context.Wait(ProcessRequest);

}

Ende

CommonConversation im Namespace Common ist eine statische Hilfsklasse, die den Connector der aktuellen Konversation enthält. Es ist möglich, aber meistens nicht erforderlich, über den Connector direkt Nachrichten zu verschicken. In Listing 2 ist zu sehen, dass nach der ersten Nachricht des Benutzers die Methode MessageReceivedAsync aufgerufen wird und der Anwender zwei unterschiedliche Optionen erhält: einen Besprechungsraum buchen oder einen Projektraum erzeugen.

Ein Bot kann mit mehr als nur reinen Textnachrichten kommunizieren. Es können Multimedia-Inhalte eingebettet und Hero Cards verwendet werden. In dem Beispiel haben wir der Frage sogenannte vorgeschlagene Antworten mitgegeben. Listing 2 lässt sich entnehmen, dass es CardActions sind, die in der konkreten Darstellung im Channel Buttons ähneln. Nachdem der Benutzer eine Auswahl getroffen hat, wird diese in der Methode ProcessRequest ausgewertet und der entsprechende Dialog eingeleitet.

Listing 3

private async Task ProcessRequest(IDialogContext context, IAwaitable<IMessageActivity> result)

{

 var message = await result;

 if (message.Text.ToLower() == "Besprechungsraum buchen")

 {

  context.Call(new BookRoomDialog(), AfterBookingAndCreatingRooms);

 }

 else if (message.Text.ToLower() == "Projektraum erzeugen")

 {

  context.Call(new CreateRoomDialog(), AfterBookingAndCreatingRooms);

 }

 else

 {

  await context.PostAsync("Das habe ich leider nicht verstanden. Hier noch einmal die Optionen: 'Besprechungsraum buchen' und 'Projektraum erzeugen'");

  context.Wait(ProcessRequest);

 }

}

Ende

Listing 3 zeigt, wie mit der Call-Methode des Kontextes innerhalb eines bestehenden Dialogs neue Dialoge aufgerufen werden können. Der zweite Parameter ist ein Handler, der aufgerufen wird, sobald der neue Dialog geschlossen ist.

Für den Dialog Besprechungsraum buchen fragt der Bot zunächst, wie viele Personen teilnehmen. Anhand dessen erstellt er eine Auswahl, aus der der Benutzer wählen kann.

Für die Antwort kommen die bereits erwähnten Hero Cards zum Einsatz. Dabei kann der Anwender die Ergebnisse durchsuchen, wenn der Bot mehrere Treffer gefunden hat. Die Hero Cards bieten zudem die Möglichkeit, einen Button zu implementieren und einen Webserviceaufruf zu hinterlegen. Um Dialoge zu beenden, verwendet man die Close-Methode des Kontextes. Sie schließt den aktiven Dialog und kehrt zum Aufrufenden zurück. Bei Bedarf kann über die Close-Methode ein Wert zurückgeliefert werden.

Das letzte wichtige Konzept, das wir in diesem Artikel vorstellen wollen, ist FormFlow. Die bisherigen Konzepte erlauben bereits die Steuerung des Konversationsflusses. In Fragebögen werden jedoch meist viele Werte abgefragt. Den Konversationsfluss für jede Frage selbst zu steuern, wird dann schnell unhandlich. Hier kommt der Form Builder ins Spiel: Er ermöglicht es, die Formulare aus den Properties einer Klasse innerhalb einer Konversation automatisiert zu erzeugen.

Für das nächste Beispiel existiert die Klasse ProjectRoom mit den drei Properties: Titel, Beschreibung und Vorlage. Die ersten beiden sind vom Typ String und Vorlage ist eine Enumeration.

Um aus dieser Klasse automatisiert ein Formular zu erzeugen, können Sie den Form Builder wie im folgenden Listing verwenden:

Listing 4

private IForm<ProjectRoom> BuildProjectRoomForm()

{

 return new FormBuilder<ProjectRoom>()

 .Field(nameof(ProjectRoom.Titel))

 .Field(nameof(ProjectRoom.Beschreibung))

 .Field(nameof(ProjectRoom.Vorlage))

 .Confirm("Sind die Eigaben Korrekt? {*} {||}")

 .Build();

}

Ende

Der Form Builder implementiert dabei noch ein weiteres Verhalten als nur das Formular für die drei Properties. Nachdem alle Daten erfasst wurden, kann der Benutzer die Eingabe bestätigen. Hat er etwas falsch erfasst, kann er Nein wählen und gezielt für einzelne Elemente neue Daten eingeben. Wie in Listing 4 zu sehen, wurde ein eigenes Bestätigungsverhalten für das Formular eingerichtet. Mit dem Form Builder ist es zum Beispiel auch möglich, für einzelne Properties eigene Validierungsverfahren zu implementieren.

Bots testen, bereitstellen und veröffentlichen

Um einen Bot zu testen, bietet sich der Bot Framework Emulator an. Er simuliert nicht nur die Kommunikation, sondern zeigt im Log-Bereich auch alle Statusmeldungen an, die zwischen Bot und Channel hin und her gesendet werden. Klickt man auf eine Nachricht im Channel, erscheinen im Details-Bereich allerhand Informationen, etwa die Message ID. Der Channel Emulator ist einfach einzurichten: Sie müssen lediglich den Endpunkt und die Microsoft App ID samt Microsoft App-Kennwort angeben. Die App ID und das Kennwort sind nur erforderlich, falls der Bot bereits registriert ist. Anschließend kann sich der Emulator mit dem Bot verbinden.

Das Deployment eines Bots mit Visual Studio in Azure ist simpel: Einfach mit der rechten Maustaste auf das Projekt klicken und Veröffentlichen anwählen. Innerhalb von fünf Minuten haben Sie die grundlegende Konfiguration für einen neuen App Service erledigt und der Bot wird in der Cloud bereitgestellt. Mit der Domain, unter der er erreichbar ist, können Sie ihn jetzt registrieren.

Hierfür müssen Sie sich mit ihrem Konto auf der Bot-Framework-Seite anmelden. Anschließend können Sie unter Meine Bots einen neuen Bot erstellen oder einen bereits gehosteten registrieren. Ins Registrierungsformular tragen Sie Name, Bot Handle, Beschreibung und Endpunkt ein.

Weiterhin können Sie an dieser Stelle direkt eine Microsoft App ID und ein Microsoft App Kennwort erzeugen. Diese beiden Informationen müssen Sie anschließend noch in die Web.Config-Datei eintragen und den Bot erneut veröffentlichen. Wenn Sie den Endpunkt vorher kennen, können Sie den Bot auch zuerst registrieren. Schließlich können Sie noch Analytics konfigurieren und die zuständigen Administratoren angeben, die den Bot bearbeiten dürfen.

Jetzt können Sie Channels für den Bot konfigurieren. Diese sind mit einem Klick hinzugefügt und der Bot steht danach über den jeweiligen Channel zur Verfügung. Wenn Sie zum Beispiel den Microsoft Teams Channel hinzufügen, kann der Bot aus Teams angeschrieben werden. Hierfür müssen Sie allerdings an die ID des Bots schreiben und nicht an den Namen, denn zu diesem Zeitpunkt ist der Bot nur privat verfügbar und taucht in keinem öffentlichen Verzeichnis auf.

Möchten Sie den Bot veröffentlichen und nicht nur dem eigenen Unternehmen zur Verfügung stellen, müssen Sie den Veröffentlichungsprozess des jeweiligen Channels durchlaufen. Das Portal bietet für jeden Channel in dessen Konfigurationseinstellungen eine entsprechende Hilfestellung an.

Fazit

Das Bot Framework ist eine gute Ergänzung in Microsofts Entwicklungsplattformen. Mit seiner Hilfe können Sie innerhalb kürzester Zeit Chatbots realisieren. Da sich diese in verschiedene Applikationen von Microsoft und anderen Herstellern integrieren lassen, können Mitarbeiter sie ganz bequem aus ihrer täglichen Arbeit heraus nutzen. Denn Anwendungen wie Skype for Business oder Microsoft Teams haben viele Leute ohnehin ständig geöffnet.

Aber auch bei der eigentlichen Implementierung unterstützt das Microsoft Bot Framework durch eine gut gelungene Klassenstruktur. Wenn es darum geht, große Datenmengen von Benutzern zu erfassen, bietet das Framework mit FormFlow und Form Builder einfach zu verwendende Möglichkeiten an, die dennoch ein großes Potenzial bieten.

Dank der zwei existierenden Versionen des Bot Frameworks, einmal für .NET und einmal für Node.js, erreicht Microsoft ein breites Spektrum an Entwicklern. Wer ein paar grundlegende Konzepte erlernt hat, kann sofort loslegen. Die Einstiegshürde für Backend-Entwickler ist gering. Zudem sind das Bot Framework und seine Werkzeuge gut dokumentiert und die zugrunde liegenden Konzepte gut erklärt.

Folgen Sie SearchEnterpriseSoftware.de auch auf Twitter, Google+, Xing und Facebook!

Nächste Schritte

Legacy-Systeme sind ein Hindernis für Chatbot-Entwicklung.

Sicherheit und Datenschutz bei Chatbots beachten.

Chatbots: Was ist bei der Revolution im Kundenservice zu beachten?

Artikel wurde zuletzt im April 2018 aktualisiert

Erfahren Sie mehr über Business-Software

Diskussion starten

Schicken Sie mir eine Nachricht bei Kommentaren anderer Mitglieder.

Bitte erstellen Sie einen Usernamen, um einen Kommentar abzugeben.

- GOOGLE-ANZEIGEN

SearchSecurity.de

SearchStorage.de

SearchNetworking.de

SearchDataCenter.de

Close