Nullable Types == != && ||


Schon für Einsteiger in die farbenfrohe Welt des C# wird früh der Bereich der booleschen Algebra interessant, Entscheidungen auf Grundlage von Wahrheitswerten zu fällen ist Essenziell für den strukturierten Ablauf eines Programmes.

Ein interessanter Hinweis zum Thema logischer Operatoren:

Operator

Beschreibung

&&

Logisches Und (es werden nur solange Operanten geprüft bis einer false ist,-> ganzer Ausdruck false)

||

Logisches Oder (es werden nur solange Operanten geprüft bis einer true ist,-> ganzer Ausdruck true)

&

Logisches Und (alle Operanten werden geprüft)

|

Logisches Oder (alle Operanten werden geprüft)


Man bezeichnet das Vorgehen bei && und bei || als shortcircuit-Evaluation, soll heißen die Evaluierung kann abgeschlossen sein ohne das jeder Operant ausgewertet werden musste, was Ressourcen spart.


Für den Vergleich von nullierbaren Datentypen (Nullable Types) ist grundlegend zu beachten dass,

· Bei Verwendung auf ausschließlich Nicht-NULL-Operanten wird der Operator auf die Werte angewendet

· Hat mindestens ein Operant einen Wert und mindesten einer ist NULL ergibt == false und != true

· Sind Alle Operanten NULL ergibt == true und !=false

Das bedeutet:

int? Wert1 = 5;
int? Wert2 = 10;
int? Wert3 = null;
int? Wert4 = null;
int? Wert5 = 10;
bool b1;
b1 = Wert1 == Wert2; // False
b1 = Wert2 == Wert5; // True
b1 = Wert1 == Wert3; // False
b1 = Wert1 != Wert3; // True
b1 = Wert3 == Wert4; // True<BR>b1 = Wert3 != Wert4; // False


wobei int? nullableOfInt32 bedeutet, also “nullierbare” Variante von Int32.

Und wessen Interesse geweckt ist findet hier ein Tor zu dem nötigen Wissen um in C# durch zu starten.

Zählen bis unendlich und zwar 2mal !

 

Ein Enumerator kann so geschrieben werden dass er ein Enumerable indefiniter Länge erzeugen kann.  Der Iterator wird in diesem Fall ausgeführt solange weitere Elemente erfragt werden bzw. eine vordefinierte Grenze erreicht ist.

Dieser C# Iterator hier erzeugt Primzahlen, das Besondere an dieser Stelle ist dass wir den Iterator trotz unendlicher Schleife verwenden können, denn die Schleife wird nur solange ausgeführt wie nötig.

        static void Main(string[] args)
        {
            Console.Write("Gib die Grenze an:");
            int oberesLimit = int.Parse(Console.ReadLine());

            foreach (int p in AllePrimzahlen())
            {
                if (p > oberesLimit)
                    break;
                Console.WriteLine(p);
            }

            Console.ReadLine();
        }

        private static IEnumerable<int> AllePrimzahlen()
        {
            List<int> primzahlen = new List<int>();
            primzahlen.Add(2);
            yield return 2;
            primzahlen.Add(3);
            yield return 3;

            int testPrime = 5;
            while (true)
            {
                bool isPrime = true;
                foreach (int n in primzahlen)
                {
                    if (testPrime % n == 0)
                    {
                        isPrime = false;
                        break;
                    }
                }

                if (isPrime)
                {
                    primzahlen.Add(testPrime);
                    yield return testPrime;
                }
                testPrime += 2;
            }
        }



Wie man hier sieht wird jedes mal wenn eine yield return-Anweisung im Iterator erreicht wird, eine expression returned. So kann AllePrimzahlen sich Stück für Stück aufbauen.
Und für jeden der jetzt denkt:
Iteratoren, yield-Statement… WTH !
Bei der ppedv gibt es auch einen Kurs zum Einstieg in C#.

Azure Web Apps Mail senden

Erst gestern gab es von Scott Guthrie eine Reihe neuer Azure Service Ankündigungen. Azure Websites heißen nun Azure Web Apps. Daneben noch API Apps, mobile Apps und Logic Apps. Ein Problem bleibt aber, wie sende ich eMail aus einer Azure Website App? Einige Blogs und die Suche nach “how to send mail from azure website” deutet auf einen Dienst Namens Sendgrid hin.

Gleich eines vorab. Man kann eMails auch in Azure wie gewohnt mit dem SMTPClient Objekt senden. Folgender .NET Code funktioniert, wenn man einen SMTP Server als Relay Host nutzen kann.

   1:  Dim sc As New SmtpClient
   2:  sc.Host = "mail.ppedv.de"
   3:  sc.Send("xxxx@outlook.com", "hannesp@ppedv.de", "test", "test")

Dabei sind wir auch schon bei den Problem. Azure stellt keinen SMTP Dienst bereit. Jedenfalls bisher nicht, mal sehen was sich in den API Apps noch verbirgt.

Wer über Dienste wie Google Mail oder Outlook live senden möchte, muss sich am SMTP Server authentifizieren um Spammern das Leben zu erschweren. Auch das klappt bei Azure grundsätzlich mit folgendem VB.NET Code Beispiel

   1:  Dim sc As New SmtpClient
   2:  sc.Host = "smtp.live.com"
   3:  sc.EnableSsl = True
   4:  sc.Port = 587
   5:  sc.Credentials = New NetworkCredential("hannesp@ppedv.de", "passwort?")
   6:  sc.Send("xxxxx@outlook.com", "hannesp@ppedv.de", "test", "test")

Allerdings wird vermutlich eine Fehlermeldung in der Website auftauchen ala

Mailbox unavailable. The server response was: 5.7.3 requested action aborted; user not authenticated

Der Grund ist, das diese Website und damit die Anmeldung von einem Azure Web Server kommen. In meinem Fall aus den Niederlanden. Über das Live Portal kann man den Activity Request erkennen und markieren als “von mir stammend”

image

Wenn aber der Mail Server gerade keine Mails entgegen nehmen möchte, wird mein Code Laufzeit Fehler verursachen, die sehr schwer zu behandeln sind. Mail erzeugen und Mail versenden sollten zwei verschiedene Prozesse sein. Vor allem da das Senden asynchron funktioniert, bei Retry versuchen mit mehrstündiger Dauer.

Korrekterweise werden die Einstellungen zum Versand von emals in der Datei Web.Config vorgenommen. Hier im Bereich system.net.  Dort kann man auch festlegen, das die erzeugten Mails in einem Verzeichnis gespeichert werden.

   1:  <system.net>
   2:      <mailSettings>
   3:        <smtp deliveryMethod="SpecifiedPickupDirectory">
   4:          <specifiedPickupDirectory 
pickupDirectoryLocation="D:\home\site\wwwroot\pickup"/>
   5:        </smtp>
   6:      </mailSettings>
   7:   
   8:    </system.net>

Wie erhält man den physikalischen Pfad einer Web Seite die auf Azure läuft. Ganz einfach per Server.MapPath("."). Im Unterverzeichnis Pickup wird dann das email als eml Datei erzeugt.

image

Solche Dateien kann man auf einem Windows System per Doppeltclick öffnen. Auch das enthaltene Text Format ist leicht lesbar.

X-Sender: xxxx@outlook.com
X-Receiver: hannesp@ppedv.de
MIME-Version: 1.0
From: xxxx@outlook.com
To: hannesp@ppedv.de
Date: 24 Mar 2015 18:36:52 +0000
Subject: test
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: quoted-printable

test

 

Wenn man nun diese Dateien in ein Pickup Verzeichnis eines Windows SMTP Servers kopiert, werden diese als eMail versandt. Dazu aber später mehr.

Call4Papers – SharePoint konferenz Wien

Auch dieses Jahr findet wieder die SharePoint konferenz in Wien statt. Heuer wird sie vom 17.-18. Juni 2015 in der Pyramide Vösendorf über die Bühne gehen.

In unserer mobilen Welt ändert sich auch die Arbeitsweise in Unternehmen. Tools wir SharePoint, Lync, Exchange, Office 365 unterstützen Firmen dabei ihren Mitarbeitern neue Arbeitsmethoden zu ermöglichen.

Daher ist das heurige Motto:

New Way Of Work

 

Die Konferenz wird in die Bereiche Business, IT Pro und Development untergliedert. Ich freue mich über Sessionvorschläge die zum Motto der Konferenz und in einen der drei Bereiche passen.  Tools wie Lync, Exchange, O365 aber auch Hyper-V sind heuer gerne gesehen.

Bitte die Vorschläge mit Titel, Abstract, Level (100-400) und Angabe des Bereichs an marting@ppedv.de schicken. Der Abgabetermin ist der 20.4.

Azure Websites Verzeichnis schützen

Microsoft hat ein Geschenk für uns. Azure Websites erlauben das gratis Hosting einer Web Anwendung. Einzig eine Microsoft ID wird benötigt und schon kann man zehn Websites mit bis zu 1GB Speicherplatz nutzen. Bis zu 165MB Datentransfer täglich sind ebenfalls gratis inkludiert. Allerdings ist der Umstieg von einem eigenen IIS zu Azure Websites nicht ganz barrierefrei.

Zu den typischen Aufgaben einer Website gehört der Upload von Dateien durch den Benutzer. In der Regel schreibt der ASP.NET Entwickler einen http Handler (Erweiterung axd) um den Uploadstream entgegen zu nehmen und auf dem Web Server zu speichern. So behält man volle Kontrolle über Größe, Format, Namen und Speicherort. Bisher hat man diese Dateien in einem Verzeichnis der Website gespeichert und möchte das auch weiter so lösen. Alternativ dient dazu auch der Azure Blob Storage.

Fileupload in ein Web Verzeichnis kann ein potentielles Sicherheitsproblem sein. Ein Benutzer kann eine ausführbare Datei (z.B. ASPX) hochladen und somit Code einschleusen. Das Upload Verzeichnis muss also vor ausführbaren Programmcode geschützt werden. Einige ASP.NET Directorys werden out of the box mit besonderen Rechten versehen. So ist alles was in APP_DATA existiert automatisch und zwingend vor Download geschützt. In der Praxis legt man dort seine Datenbanken ab.

Wer einen dedizierten Server mit IIS betreibt hat volle Kontrolle über das NTFS Dateisystem und kann die Rechte dort passend pro User (appool) einstellen.

Beim Publish auf Azure stehen diese Möglichkeiten nicht offen. Man behilft sich mit einer Ausnahmeregel in der Web.config. Sämtliche Datei Handler werden entfernt und mit dem Static File Handler ersetzt so das man nach wie vor Images, Videos oder auch HTML anzeigen bzw. Downloaden kann. Die Ausführung von Code in einer ASPX Datei wird mit einer 404er Fehlermeldung beantwortet.

 

   1:  <location path="app_upload">
   2:      <system.webServer>
   3:        <handlers>
   4:          <clear />
   5:          <add name="StaticFile" path="*" verb="*" 
modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule"
   6:  resourceType="Either" requireAccess="Read" />
   7:        </handlers>
   8:      </system.webServer>
   9:    </location>
  10:  </configuration>

No SQL mit DocumentDB und Azure

Es gibt etwas, was andere total cool finden und Sie nicht den Ansatz einer möglichen Nutzung sehen? Nein ich spreche nicht von der Apple Watch, ich spreche von NoSQL Datenbanken und im besonderen von neuen Azure Dienst DocumentDB. Ein Versuch einer Erklärung für etwas, was die wenigsten vermutlich brauchen werden.

Wenn man wenig weis, hilft immer ein Wikipedia Zitat

NoSQL (englisch für Not only SQL) bezeichnet Datenbanken, die einen nicht-relationalen Ansatz verfolgen und damit mit der langen Geschichte von relationalen Datenbanken brechen. Diese Datenspeicher benötigen keine festgelegten Tabellenschemata und versuchen, Joins zu vermeiden, sie skalieren dabei horizontal. Im akademischen Umfeld werden sie häufig als „strukturierte Datenspeicher“ (engl. structured storage) bezeichnet.

Ein neuer Dokumenten orientierter Vertreter ist documentDB, als Microsoft Azure Service aber nur online Verfügbar. Relativ vereinfacht, werden dabei JSON strukturierte Informationen gespeichert.  Für die Entwicklung steht JavaScript oder auch eine .NET API zur Verfügung.

Abfragen lassen sich mit einer ANSI SQL ähnlichen, reduzierten Syntax oder im .NET Umfeld auch per LINQ durchführen. Sämtliche CRUD Operationen werden unterstützt und lassen sich sogar per REST API ausführen. Unterstützt werden auch Transaktionen, Trigger und Stored Procedures.

Man kann nun stundenlang sinnieren, warum die Aufgabenstellung nicht per RDBMS und SQL Server löst. Microsoft preist documentDB als günstige und skalierbare Lösung. In jedem Fall stößt ein SQL Server bei sehr großen Datenmengen (über 50GB) und/oder vielen Schreiboperationen an Performance Grenzen. In jedem Fall sind Cloud basierte Lösungen für diese Probleme noch anfälliger. Wer rein aus der JavaScript Welt kommt, nutzt documentDB sozusagen als native Datenbank, fern von .net oder SQL.

Stellen wir uns also vor, eine klassische Aufgabenstellung einer Warenwirtschaft mit einer NoSQL Architektur zu lösen. Eine Rechnung stellt dann das Dokument dar. Mit Kopfdaten und Positionen. Die Positionen können sich in der Struktur erheblich unterscheiden. Schrauben haben andere Eigenschaften als Hosen. Einzelne Artikel können sich wiederrum aus Stücklisten zusammen setzen. Alles in einem Dokument und mit erheblich redundanter Datenmenge. Im Ergebnis jedes Document mit unterschiedlicher Struktur innerhalb einer Sammlung.

Zu allererst wendet man sich an das neue Azure Portal und erstellt dort ein documentDB Konto. Das dauert ziemlich lange. Als Ergebnis erhält man einen HTTP Endpunkt und einen Key für die Anmeldung.

documentd4

Als nächstes kann man im Web basierten Management Portal eine oder mehrere Datenbanken hinzufügen. Jede Datenbank enthält Collections (Sammlungen), die auf den ersten Blick Tabellen ähneln- allerdings ohne Struktur. Darin werden die Dokumente gesammelt, z.B. Rechnungen. Aufgrund der Schema Freiheit aber auch gemixt Adressen und Rechnungen.  Eine Sammlung wird immer auf einem Server gehostet, mit Azure typischen zwei zusätzlichen Kopien. Da die Preview Version (stand Feb 2015) ein Limit von 3 Sammlungen aufweist, wird man in der Praxis viel weniger davon nutzen, als bei RDBMS Tabellen und eher um die Daten zu partitionieren.

Auch eine  Sammlung kann man im Portal anlegen. Diese Funktion ist schwer zu finden und erscheint erst nach Auswahl der Datenbank im Azure DocumentDB-Kontobereich. Um den Abschnitt Datenbank zu erreichen, muss man nach unten scrollen.

image

Aber genau das macht NoSQL eben aus, das die Struktur und damit das Datenbank Schema nicht am Anfang steht. Deshalb wird in der Praxis häufig der Code die Aufgabe übernehmen die Collections anzulegen.

Abfragen kann man die Daten direkt im Azure Portal, per Dokument Explorer oder per Abfrage Explorer.

image

Die Abfragen erlauben ähnlich einem SQL Query Tool die Dokumente anhand der Attribute zu selektieren und zeigt die Ergebnisse als JSON an.

image

Hier sieht man das documentDB intern GUID ähnliche ID Werte verwendet.

Wesentliche Part der Struktur geschieht im Code. Wie von mir gewohnt per ASP.NET Webforms und VB.NET. Im Visual Studio Projekt muss per Nuget eine Referenz auf die Documents Clients Assembly eingefügt werden. Da im Stadium Prerelease (oder Preview) nur unter Auswahl der passenden DropDownliste auffindbar.

documentdb7

Es wird ein Client Objekt instanziiert, das später die Methoden für den Datenbank Zugriff kapselt.

 

   1:  Private Url As String = "https://ppedv.documents.azure.com:443/"
   2:  Private key As String = "w9t7JWW...qeZzKMS7pAmbspSKK5gw=="
   3:  Private _client As DocumentClient = New DocumentClient(New Uri(Url), key)

 

So lässt sich die Datenbank und darin die Document Collection per Code erzeugen.

   1:  _client.CreateDatabaseAsync(New Database With {.Id = "miniSAP"})
   2:  ...
   3:    col = Await _client.CreateDocumentCollectionAsync(
   4:                  db.SelfLink,
   5:                  New DocumentCollection With {.Id = "Rechnungen"})

 

Fehlen nur noch Rechnungen. Diese werden im folgenden Code Schnipsel aus zwei TextBoxen und einer passenden Klasse erzeugt.

   1:  Dim p = New rechnung With {
   2:                                   .firma = TextBox1.Text,
   3:                                   .betrag = TextBox2.Text,
   4:                                   .datum = Date.Now}
   5:   
   6:  Await _client.CreateDocumentAsync(col.SelfLink, p)

 

Natürlich will man die Daten auch anzeigen. Webforms hilft per ModelBinding, setzt dann allerdings wieder ein typisierte Liste voraus. Der HTML Code der ASPX Seite.

   1:  <asp:ListView ID="ListView1" ItemType="documentdb1.rechnung" 
   2:              SelectMethod="ListView1_GetData"
   3:               runat="server">
   4:              <ItemTemplate>
   5:                  <%#Item.firma%><br />
   6:              </ItemTemplate>
   7:  </asp:ListView>

 

Etwas komplexer ist die Codebehind Logik. Datenbank abfragen, Rechnungsliste abfragen und dann per SQL das oder die passenden Dokumente laden.

   1:  Public Async Function ListView1_GetData() As Threading.Tasks.Task(Of List(Of rechnung))
   2:          Dim db As Database
   3:          db = _client.CreateDatabaseQuery().Where(
   4:  Function(x) x.Id.Equals("miniSAP")).AsEnumerable().FirstOrDefault()
   5:   
   6:          Dim col As DocumentCollection
   7:          col = _client.CreateDocumentCollectionQuery(db.SelfLink).Where(
   8:  Function(c) c.Id.Equals("Rechnungen")).ToArray).FirstOrDefault
   9:   
  10:          Dim q = _client.CreateDocumentQuery(Of rechnung)
(col.SelfLink, "select * from Rechnungen").ToList
  11:   
  12:          Return q
  13:  End Function

 

Azure DocumentDB  macht die ORM Brücke Entity Framework überflüssig. Die Objekte stecken eben in der Datenbank. Die Programmierung geht leicht von der Hand. Allerdings muss der Entwickler komplett umdenken und das wird das größere Problem darstellen. Zusätzlich stellt sich die Frage was wir gewonnen haben. In diesem Fall nichts. Wenn man aber Amazon ist und pro Sekunde hunderte derartige Transaktionen durchführen will, könnte documentDB das Leben leichter machen. Dieser Azure Service steht  noch am Anfang.

Danke an Rainer Stropek für review.

Excel Tipp – Zinsen berechnen

Mit vorliegendem Beispiel können Sie schnell und zuverlässig mit zwei einfachen Formeln ausrechnen, wie viel Zinsen Ihr Kapital erwirtschaftet. Es handelt sich hierbei um eine Berechnung, bei der ein kontinuierlich gleichbleibender Betrag jeden Monat über 10 Jahre auf ein verzinstes Konto eingezahlt wird.

Auf nachfolgendem Screenshot sind die Formeln eingefügt, um nachzuvollziehen, wie die Berechnung stattfindet.

clip_image002

Mit der Funktion ZW „Zeitwert“ ist die Formel in der Lage, den Zinseszins Effekt zu berücksichtigen.

Abbildung für die zweite einfachere Formel zur Gegenüberstellung, welches Kapital hätte sich angehäuft ohne Zinsen.

clip_image004

Dieses Beispiel berücksichtigt keine Inflation. Die dürfte heute höher liegen, als die nicht unübliche Verzinsung von Guthaben.

Sie möchten mehr zu Excel erfahren? Gerne auch in meinen Office Kurs

Bestätigt: Windows 10 erscheint im Sommer 2015!

Lange hielt sich Microsoft beim Thema Erscheinungstermin für Windows 10 bedeckt. Bisher hieß es immer nur: Im 2. Halbjahr 2015.

Auf der Hardware-Konferenz WinHEC in China verkündete Windows-Chef Terry Myerson nun offiziell die Release-Pläne: Windows 10 wird im Sommer 2015 in 190 Ländern und 111 Landessprachen auf den Markt kommen.

Windows 10 wird für Windows 7/8/8.1-User im ersten Jahr kostenlos sein. Für Enterprise-Kunden wird es kostenpflichtig bleiben. Neben der 64bit-Version wird es weiterhin noch eine 32bit-Version geben.

Bis dahin möchte Microsoft die User in unregelmäßigen Abständen – wie bereits in den letzten Monaten geschehen – mit Previews über die Entwicklungsfortschritte informieren. Die aktuelle öffentliche Preview-Build ist die Version 9926. Gerüchte besagen jedoch, dass noch im März mit einer neuen Version gerechnet werden kann. Die Previews können direkt bei Microsoft heruntergeladen werden.

Win10

Active Directory-Migration von Windows Server 2003 auf Windows Server 2012R2

Am 15. Juli 2015 endet der Support für Windows Server 2003. Dies Betrifft alle Editionen von Windows Server 2003 und Windows Server 2003R2. Viele Unternehmen haben allerdings noch Domänencontroller (DCs) unter Windows Server 2003 laufen. Hier erfahren Sie, wie Sie Active Directory (AD) von 2003 auf 2012R2 migrieren.

Vor Windows Server 2012 war es notwendig, wenn man einen DC mit einer neueren Betriebssystemversion hinzufügen wollte, das AD darauf vorzubereitet. Hierfür stellt Microsoft das Kommandozeilen-Tool adprep.exe zur Verfügung, dass sich auf jeder Installations-DVD von Windows Server befindet (man musste dann immer das adprep von der neuen Windows Server-Version verwenden). Das ist jetzt ab Windows Server 2012 nicht mehr notwendig – das erledigt jetzt der neue Konfigurations-Assistent, der einen Server zu einem DC herauf stuft, automatisch.

Unter Windows Server 2012R2 kann zwar keine Domäne oder Gesamtstruktur mit einer Funktionsebene 2003 mehr eingerichtet werden (nur noch ab Funktionsebene 2008), man kann ihn jedoch als zusätzlichen Domänencontroller einer 2003-Domäne hinzufügen. Dies müssen wir auch als ersten Schritt erledigen:

Im Server-Manager des Windows Server 2012R2-Servers die Serverrolle “Active Directory-Domänendienste” hinzufügen (“Verwalten” –> “Rollen und Features hinzufügen”).

ad_migration1

Wenn die Rolle erfolgreich installiert wurde, muss der “Konfigurations-Assistent für Active Directoy-Domänendienste” gestartet werden, in dem man auf den Link “Server zu einem Domänencontroller heraufstufen” klickt (dieser Assistent löst quasi DCPROMO, das bei früheren Windows Server Versionen noch explizit aufgerufen werden musste, ab).

ad_migration2

Hier wählt man den Bereitstellungsvorgang “Domänencontroller zu einer vorhandenen Domäne hinzufügen” aus, trägt die Domäne ein und hinterlegt noch entsprechende Anmeldeinformationen eines Domänen-Admins.

ad_migration3

Als nächstes müssen die Domänencontrollerfunktionen “DNS-Server” (nur wenn der DNS-Server bisher auch auf einem DC lief) und “Globaler Katalog” ausgewählt werden. Dann noch ein DSRM-Kennwort angeben.

ad_migration4

Die nächsten Punkte “DNS-Optionen”, “IFM-Optionen”und “Pfade” können in der Regel mit “Weiter” übersprungen oder (falls notwendig) angepasst werden. Es folgt ein Hinweis, dass die Gesamtstruktur, das Schema und die Domäne während dem Hochstufen zum DC vorbereitet werden müssen – dieser Automatismus löst die manuelle Vorbereitung via ADPREP ab.

Nachdem Sie die Optionen geprüft haben, wird eine Voraussetzungsüberprüfung vorgenommen. Erscheint links oben ein grüner Haken, dann kann mit der Installation begonnen werden.

Nach dem automatischen Neustart läuft der 2012R2-Server als weiterer DC in der Domäne. Damit jedoch der 2003-Server in “Rente” geschickt werden kann, müssen die FSMO-Rollen (Betriebsmasterrollen) auf den 2012R2-Server verschoben werden. Es gibt insgesamt 5 FSMO-Rollen: PDC-Emulator, RID-Master, Infrastruktur-Master, Domänennamen-Master und Schema-Master. Der Verschiebung der Rollen muss immer an dem DC angestoßen werden, der die Rollen erhalten soll.

Auf dem 2012R2-Server muss das Verwaltungs-Snap-In “Active Directory-Benutzer und –Computer” gestartet werden. In diesem Snap-In lassen sich 3 von den 5 Rollen verschieben. Hierzu macht man einen Rechtsklick auf den Domänennamen und geht im Kontextmenü auf “Betriebsmaster…”.

ad_migration5

Hier stehen die 3 Betriebsmasterrollen “RID-Master”, “PDC-Emulator” und “Infrastruktur-Master” – erreichbar über Registrierkarten – zur Verfügung. Im ersten Eingabefeld wird angezeigt auf welchem DC die Rolle aktuell beheimatet ist. Im zweiten Eingabefeld erhält man die Information mit welchem DC man gerade verbunden ist – hier sollte der Name des 2012R2-Servers aufgeführt sein. Falls das nicht der Fall ist: Im Snap-In Rechtsklick auf “Active Directory-Benutzer und –Computer” (oberster Eintrag in der Ordnerstruktur) –> “Domänencontroller ändern” und dort den 2012R2-Server auswählen.

ad_migration6

Um die FSMO-Rolle zu verschieben, genügt ein Klick von den Button “Ändern…”. Danach steht im ersten Eingabefeld auch der neue Server drin. Diese Aktion führt man bei allen 3 Rollen durch.

Die Betriebsmasterrolle “Domänennamen-Master” kann man im Snap-In “Active Directory-Domänen und -Vertrauensstellungen” verschieben. Statt einen Rechtsklick auf den Domänennamen muss man hier allerdings einen Rechtsklick auf den Namen des Snap-Ins (oberster Eintrag in der Ordnerstruktur) vornehmen, um zum Betriebsmaster zu gelangen.

ad_migration7

Die letzte Betriebsmasterrolle muss über das Snap-In “Active Directory-Schema” verschoben werden. Problem: Dieses Snap-In ist (aus Sicherheitsgründen) standardmäßig nicht installiert. Über die Eingabeaufforderung (cmd) geben wir “regsvr32 schmmgmt.dll” ein. Danach bekommen wir die erfolgreiche Durchführung bestätigt.

ad_migration8

Über die mmc haben wir nun Zugriff auf das Snap-In (in der mmc “Datei” –> “Snap-In hinzufügen” –> “Active Directory-Schema” hinzufügen).

Da man standardmäßig in diesem Snap-In mit dem Schema-Master verbunden wird, müssen wir über einen Rechtsklick auf “Active Directory-Schema” über “Active Directory-Domänencontroller ändern…” den 2012R2-Server als aktuellen DC auswählen. Danach mit einem weiteren Rechtsklick auf den Snap-In-Namen über “Betriebsmaster…” die letzte Rolle verschieben.

Damit wurden alle 5 FSMO-Rollen auf den neuen 2012R2-Server verschoben. Dies kann man sich auch schnell in der Eingabeaufforderung mit “netdom query fsmo” bestätigen lassen.

ad_migration9

Jetzt können wir den 2003-Server als DC in Rente schicke. Als erstes trägt man in der IP-Konfiguration auf dem 2003-Server als bevorzugten DNS-Server den neuen 2012R2-Server ein und startet danach über “Start” –> “Ausführen” DCPROMO.

ad_migration10

Nach dem ersten “Weiter” wird man gefragt, ob dieser Server der letzte DC in der Domäne ist. Die Checkbox darf hier NICHT aktiviert werden! Als nächstes vergibt man noch ein Kennwort für das neue lokale Administrator-Konto, dass während dem Herabstufen angelegt wird. Nach einem Neustart ist der Server zwar noch Mitglied in der Domäne, jedoch kein Domänencontroller mehr.

Falls es noch weitere ältere DCs gibt, diese ebenfalls wie beschrieben als DC herabstufen.

Abschließend muss noch die Domänen- wie auch Gesamtstrukturfunktionsebenen heraufgestuft werden, damit auch alle neuen AD-Funktionen, die nach Windows Server 2003 implementiert wurden, auch zur Verfügung stehen. Dies kann man komfortabel auf dem 2012R2-Server über das neue Verwaltungstool “Active Directoy-Verwaltungscenter” erledigen. Nach dem Start des Tools (im Server-Manager unter “Tools”) einfach in der linken Spalte auf den Domänennamen klicken, dann in der rechten Spalte (“Aufgaben”) auf “Gesamtstrukturfunktionsebene heraufstufen…”.

ad_migration11

Dort als Funktionsebene “Windows Server 2012R2” auswählen. Damit stehen alle neuen Funktionen zur Verfügung. Es lässt sich dann aber auch kein DC mit einer niedrigeren Betriebssystemversion mehr hinzufügen.

ad_migration12

Die Domänenfunktionsebene wird automatisch mit hochgesetzt – dies muss nicht manuell gemacht werden.

Damit ist die Migration abgeschlossen.

InfoPath – Dropdown Liste mit kaskadierenden XML Daten verküpfen

Die Ausgangslage ist einfach. Sie benötigen in Ihrem Formular mehrere Dropdown Auswahlfelder die sich je nach Auswahl des vorherigen Feldes anpassen, bzw. kaskadieren. Hierfür kann mit einer einfachen Vorgehensweise dafür gesorgt werden. Dafür wird eine XML Datei benötigt.

Nachfolgend wird die Umsetzung mit einer XML Datei beschreiben, eine XML Datei erzeugen Sie, sofern Ihnen keine vorliegt, z.B. mit dem kostenfreien Programm „XML Notepad“.

clip_image002

Wie abgebildet, besteht der Aufbau aus zwei Ländern mit zwei Städten und verschiedenen Angeboten, um zu demonstrieren, wie die Kaskadierung funktioniert.

1 Schritt

Schaltfläche hinzufügen -> XML Datei auswählen.

Hinweis: Neue Verbindung erstellen mit: „Daten empfangen“Hinweis

clip_image004

Hinweis: XML-Dokument auswählen

clip_image005

Datenverbindung ist hinzugefügt.

clip_image006

2 Schritt

Als erstes erzeugen Sie ein leeres Formular und fügen dort drei Dropdown-Felder wie abgebildet hinzu.

Erstellen Sie drei Dropdown Felder. Im vorliegenden Beispiel habe ich folgende Felder eingefügt:

· Land

· Stadt

· Angebot

clip_image008

Nachdem Sie die Felder erzeugt und in Ihrem Formular platziert haben, können Sie es noch ggf. formatieren. Sofern Sie normale Textfelder erzeugt haben, können Sie diese nachträglich zu einem Dropdown Feld ändern. Per Rechtsklick klicken Sie auf jedes Feld, ändern es in ein Dropdown-Listenfeld.

clip_image010

Per Rechtsklick klicken Sie auf jedes Feld und rufen die Steuerelemeteigenschaften des jeweiligen Feldes auf. Bitte fangen Sie mit dem Feld Land an.

clip_image012

Für das erste Dropdown „Land“ stellen Sie wie nachfolgend abgebildet die entsprechenden Parameter ein.

clip_image014

Für das zweite Dropdown „Stadt“ stellen Sie wie nachfolgend abgebildet die entsprechenden Parameter ein.

clip_image016

Für das dritte Dropdown „Angebot“ stellen Sie wie nachfolgend abgebildet die entsprechenden Parameter ein.

clip_image018

Das Ergebnis sieht so aus:

clip_image019

Je nach Auswahl des Landes und der Stadt werden verschiedene Angebote ausgegeben.

Viel Spaß damit

Training, Schulung, März Aktion

Month List