Samstag, 31. Dezember 2011

Dezember 2011 / C#: Multithreading & ShowWindow aus WinAPI

Multithreading in C#

Was ist Multithreading und wann wir es gebraucht?
Unter Multithreading versteht man das abarbeiten mehrerer Threads gleichzeitig innerhalb eines Prozesses. Dadurch können mehrere arbeiten Parallel und auf einander abgestimmt ausgeführt werden.
Das heisst innerhalb eines Programmes können 2 Threads Daten austauschen aber auch gleichzeitig unabhängig voneinander arbeiten.

Dazu ein Beispiel:
Ich erstelle ein GUI mit einem grossen Textfeld, in welches der Benutzer irgendeinen Text eingeben kann. Ebenfalls kann man über das Menu die Farben des Form- und des Textbox-Hintergrundes ändern. Per Knopfdruck soll das Programm dann den eingegebenen Text mit dem Bubblesort(sehr langsam) alphabetisch sortieren.
Bei einem langen Text kann das schon einige Sekunden dauern. Möchte der Benutzer nun das Programm schliessen oder die Hintergrundfarben ändern, kann er das nicht, da die gesamte Rechenleistung des Threads beim Sortieren gebraucht wird.
Hier kommt das Multithreading zum Einsatz. Wird die Sortierung in einem 2. Thread erledigt, kann der Benutzer parallel dazu das GUI bedienen.

Multithreading in C#:
In C# kann ziemlich einfach ein weiterer Thread erstellt & gestartet werden.
Zuerst sollte man das using von System.Threading hinzufügen:
using System.Threading;

Sobald das gemacht ist kann man direkt mit Thread arbeiten und einen neuen Thread instanziieren:
Thread neuerThread = new Thread(this.Methode)

Als Parameter muss eine Methode mitgegeben werden, welche im neuen Thread ausgeführt werden soll.
Wichtig ist dabei, dass man keine Klammern hinter die Methode stellt, sonst gibt es eine Fehlermeldung.

Nun muss der neue Thread noch gestartet werden und auch das ist ganz simpel:
neuerThread.Start();

ShowWindow aus WinAPI

Die Windows API(Windows-Anwendungs-Programmierschnittstelle) bietet Windows-Programmierern viele Funktionen welche in DLL-Dateien gespeichert sind.
Eine solche Funktion ist ShowWindow, welche dazu verwendet wird Fenster zu Maxi-/Minimieren, zu verstecken, wieder anzuzeigen usw.
Ich stiess auf diese Funktion, als ich nach einer Möglichkeit gesucht habe, einen Virtuellen Computer dauerhaft versteckt im Hintergrund laufen zu lassen.
Um diese Funktion nutzen zu können muss die DLL user32.dll eingebunden werden und einer Variabel zugewiesen werden:
[System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
private static extern bool ShowWindow(IntPtr hwnd, int nCmdShow);
 
Wie man sieht hat ShowWindow 2 Parameter ein IntPtr Objekt und ein int.
IntPtr enthält in diesem Fall ein Window Handle, welches durch eine Zahl repräsentiert wird.
Mit dem int wird übergeben, was mit dem Fenster gemacht werden soll. Diese werden am besten direkt als globale Konstante deklariert. Die Liste der Möglichkeiten befindet sich am Ende des Posts.
 
Nun muss man natürlich das Window Handle von dem Prozess haben, auf dessen Fenster man Einfluss nehmen möchte. In meinem Fall war das der VMPlayer.
Dazu gäbe es eine GetWindow-Funktion, welche ebenfalls von der WinAPI bereitgestellt wird.
Besser ist es jedoch, das Window Handle über den Prozess zu holen und das funktioniert so:
IntPtr vmWindow = IntPtr.Zero;
 
Process[] processes = Process.GetProcessesByName("vmplayer");
 
foreach (Process p in processes)
{
    vmWindow = p.MainWindowHandle;
}
 
Zuerst wird hier vmWindow als IntPtr instanziiert.
Anschliessend wird an processes alle Prozesse mit dem Namen vmplayer übergeben. Da bei mir nur 1 virtueller PC läuft, wird auch nur 1 Prozess zurückgegeben.
Anschliessend wird das MainWindowHandle des gefundenen Prozesses an vmWindow übergeben.
 
Nun kann man über ShowWindow das Fenster verstecken, maximieren usw.
Hier wird das Fenster versteckt, vorausgesetzt SW_HIDE wurde als Konstante mit dem Wert 0 deklariert:
ShowWindow(vmWindow, SW_HIDE);
 
Hier noch die Liste mit den Möglichkeiten:
  • private const int SW_HIDE = 0 ' Versteckt das Fenster
  • private const int SW_SHOWNORMAL = 1 ' Zeigt das Fenster und aktiviert dies
  • private const int SW_SHOWMINIMIZED = 2 ' Zeigt das Fenster an und Minimiert es
  • private const int SW_MAXIMIZE = 3 ' Maximiert das Fenster
  • private const int SW_SHOWNOACTIVATE = 4 ' Zeigt das Fenster an ohne es zu aktivieren
  • private const int SW_SHOW = 5 ' Zeigt das Fenster an, auch wenn es versteckt ist
  • private const int SW_MINIMIZE = 6 ' Minimiert das Fenster
  • private const int SW_SHOWMINNOACTIVE = 7 ' Minimiert das Fenster aber aktiviert es nicht
  • private const int SW_SHOWNA = 8 ' Zeigt das Fenster an aber aktiviert es nicht
  • private const int SW_RESTORE = 9 ' Stellt das Fenster wieder her

Montag, 28. November 2011

November 2011 / C# Anwendung mit SQL-Datenbank

C# Anwendung mit SQL-Datenbank

Mithilfe von Visual Studio kann sehr einfach eine Applikation mit integrierter SQL-Datenbank erstellt werden. Ich zeige euch hier, wie das geht.

Projekt & SQL-Datenbank erstellen:
Zuerst wird ein neues C#-Projekt erstellt, eine Windows Forms-Anwendung.
Als nächstes wird direkt eine SQL-Datenbank ins Projekt hinzugefügt:
Dazu klickt man auf das Projekt, wählt Hinzufügen und dann Neues Element. Im geöffneten Fenster wählt man nun Dienstbasierte Datenbank aus. Den Assistenten zum Konfigurieren von Datenquellen bricht man ab.

Tabelle hinzufügen:
Nun muss man auf die vorhandene Datenbank im Projektmappen-Explorer klicken, damit sich auf der linken Seite der Datenbank-Explorer öffnet.
Dort fügt man per rechtsklick auf den Ordner Tabellen eine neue Tabelle hinzu.
Als nächstes muss man die benötigten Spalten einfügen, die passenden Datentypen auswählen und am besten einen Primärschlüssel definieren.
Beim Primärschlüssel sollte der Datentyp Integer sein, das Häkchen bei "NULL zulassen" darf nicht gesetzt sein und die Eigenschaft Identitätsspezifikation muss auf Ja sein, damit der Wert automatisch gesetzt wird.
Sobald alle Spalten erstellt und angepasst sind muss die Tabelle gespeichert werden.

Datenbankdiagramm erstellen:
Per Rechtsklick auf Datenbankdiagramme im Datenbank-Explorer wird ein neues Diagramm der soeben erstellten Tabelle hinzugefügt. Das ermöglicht dem Visual Studio mit der Tabelle zu arbeiten.
Die Messagebox die auftaucht muss mit ja bestätigt werden.
Anschliessend muss man die erstellte Tabelle auswählen und Hinzufügen & Schliessen klicken.
Jetzt muss man das Diagramm nur noch abspeichern.

Optional Daten einfüllen:
(Möchte man nun Daten in die Tabelle einfügen geht das über Rechtsklick/Tabellendaten anzeigen auf die erstellte Tabelle im Datenbank-Explorer.)

Datenquelle hinzufügen:
Nun muss der Anwendung eine neue Datenquelle hinzugefügt werden. Zuerst sollte die Form geöffnet und dann auf Daten/Neue Datenquelle geklickt werden.
Datenbank auswählen --> Weiter
Erstellte Datenbank auswählen --> Weiter
Häkchen bei Verbindung Speichern setzen --> Weiter
Häkchen bei Tabellen setzen --> Fertig stellen

Daten anzeigen(GUI):
Jetzt kann man auf Daten/Datenquellen anzeigen klicken. Nun sollte man die Datenquelle, welche gerade hinzugefügt wurde sehen können. Per Klick auf die Tabelle kann zwischen einem DataGridView oder Details ausgewählt werden. Anschliessend kann die Tabelle auf das Formular gezogen werden und sie wird angezeigt.

Die Anwendung sollte jetzt fähig sein Daten zu speichern, zu löschen und zu manipulieren.

Donnerstag, 27. Oktober 2011

Oktober 2011 / Man in the middle-Angriff

Man in the middle

In unserem Englischunterricht bekamen wir den Auftrag in 2er Gruppen eine Präsentation über ein IT-Thema zu halten.

Ich und mein Kollege entschieden uns für den "Man in the middle"-Angriff.

Ich selbst hatte mit solchen Dingen noch nie zu tun und habe eigentlich keine Ahnung wie so etwas geht, aber das Interesse ist da.


Beim Man in the middle-Angriff geht es als Angreifer darum, den Netzwerkverkehr zu "überwachen", bzw. sich Zugriff auf die Daten im Netzwerkverkehr zu beschaffen.

Das macht man indem man sich physikalisch oder logisch zwischen die Kommunikationspartner innerhalb des Netzwerks "hängt" so dass der gesamte Netzwerkverkehr über den eigenen Rechner läuft. Der Angriff

Bei älteren Netzwerkstrukturen wie einem Bus-System, in denen alle Daten an jeden Teilnehmer im Netzwerk gesendet werden, ist das ziemlich einfach.

In diesem Fall muss man nur noch ein Netzwerksniffer-Programm wie z.B. Wireshark installieren & starten, womit man den Datenverkehr aufzeichnen & Anschauen kann.

In einem "normalen" Netzwerk, indem alles über Switches läuft, ist das ganze natürlich "ein wenig" komplizierter. Ich habe auch zum jetzigen Zeitpunkt noch keine Erfahrungen damit gemacht, sondern das Ganze erst gelesen. Es scheint aber erstaunlich einfach zu sein.

Abgesehen von einem Netzwerksniffer-Programm braucht man hier ein Programm, welches dem Angreifer ermöglicht, den Netzwerkverkehr über sich laufen zu lassen.

Ein solches Programm wäre z.B. Cain, welches eigentlich dazu entwickelt wurde, "verlorene" Passwörter, welche irgendwann mal z.B. auf einer Website gespeichert wurden, wieder zu finden.

Es ist also auch möglich Verschlüsselte Passwörter zu entschlüsseln und dadurch hat man wirklich vollen Zugriff auf alle Passwörter - auch aus Access- oder SQL-Datenbanken.


Mit Cain kann man nun ein ganzes Subnetz, oder auch nur ein Teil davon, nach MAC-Adressen Scannen.

Sobald man alle Adressen hat, welche man möchte kann man mit dem sogenannten ARP-spoofing beginnen.

Dazu muss man mindestens 2 Adressen (also PCs) auswählen und Cain erledigt dann die Arbeit:

In der ARP-Tabelle eines Computers sind alle nötigen IPs mit den dazugehörigen MAC-Adressen gespeichert. Cain schreibt nun in die ARP-Tabellen der beiden PCs anstelle der eigentlichen MAC-Adresse die MAC-Adresse meine PCs. So werden alle Daten welche die PCs einander sendet zuerst über meinen PC laufen.

Man hat sich also nun logisch zwischen die anderen PCs "gehängt" und ist also nun im wahrsten Sinne der "Mann in der Mitte".

Nun kann über Wireshark wieder der gesamte Datenverkehr aufgezeichnet werden.

Freitag, 30. September 2011

Septemper 2011 / Objektorientiert Programmieren mit Java

Java

Im Modul 326 - Objektorientiert entwerfen und implementieren haben wir mit der Programmiersprache Java angefangen Objektorientiert zu programmieren.

Java ist eine Objektorientierte Programmiersprache, wie z.B. C# und ist Plattformunabhängig. Das bedeutet jedes Programm, dass mit Java geschrieben wird sollte auf Linux, Microsoft usw. lauffähig sein.
Das Ganze funktioniert so, dass der geschriebene Code in einen Bytecode kompiliert wird, welcher beim Starten des Programms von der Java Virtual Machine gelesen und ausgeführt wird.

Wie üblich lernten wir erst mal grundsätzlich die Syntax kennen, welche sehr ähnlich ist wie die von C#. Auch einige Funktionen wie System.Out.Println() (Gibt eine Zeile aus) und die Entwicklungsumgebung Eclipse lernten wir kennen.


Was jedoch besonders wichtig ist in Java sind die Referenzen, oder zumindest habe ich das Gefühl dass es wichtig ist, erst mal zu verstehen, wie das genau funktioniert. Es kam immerhin bereits in einem Test und weiss man nicht wie das funktioniert, kann einiges schief gehen.

Angenommen ich hätte eine Point-Klasse, welche die Variablen x und y besitzt.
Wenn ich nun ein Objekt über eine Variable instanziiere, ist die Variable nur eine Referenz auf das eigentliche Objekt. Wenn ich nun den Wert dieser Variable einer weiteren Variable zuweise, zeigen diese auf das gleiche Objekt, Sie haben also die gleiche Referenz.
Hier ein kleines Beispiel zur Erklärung:


Point p1 = new Point(10,10) ; // 1Objekt instanziiert, Variable p1 als Referenz zugewiesen
Point p2 = p1; // 2. Variable auf dasselbe Objekt referenziert
p1.x = 5; // Ändert den x-Wert des Objekts
System.Out.Println(p2.x); // Gibt den x-Wert von p2 aus


Hier wird nun 5 Ausgegeben obwohl ich ja den x-Wert von p1 geändert habe.
Das bedeutet dass beide Variablen auf dasselbe Objekt zeigen und ich über p1 die Werte von p2 ändern kann und umgekehrt.

Was genau das bringen soll ist mir eigentlich nicht ganz klar.
Was bringt es, wenn ich die gleichen Werte über 2 Namen ansprechen kann?
Viel sinnvoller würde es mir erscheinen, wenn die beiden Variablen anschliessend nicht dieselbe Referenz haben, damit ich beide einzeln modifizieren könnte, aber das ist nun mal nicht der Fall.

Viel mehr nur Java-Bezogenes lernten wir noch nicht. Dafür begannen wir aber mit der Objektorientierung.

Objektorientierung


Zuerst muss man natürlich wissen, dass alles mit Klassen, Objekten, Eigenschaften und Methoden aufgebaut ist.
Eine Klasse ist eine allgemeingültige Beschreibung von Dingen, die in verschiedenen Ausprägungen vorkommen können, aber alle eine gemeinsame Struktur und ein gemeinsames Verhalten haben. Sie ist also ein Bauplan für die Erzeugung einzelner Ausprägungen. Diese Ausprägungen bezeichnet man als Objekte.

Normalerweise hat eine Klasse nun Eigenschaften und Methoden.
Das ganze zeige ich nun an einem kurzen Beispiel auf:

Ein Auto ist eine Klasse also der allgemeine Bauplan.
Die Klasse Auto hat nun natürlich auch mehrere Eigenschaften wie Lackfarbe, PS, Länge usw.
Ebenfalls hat sie Methoden, also Funktionen welche die Klasse ausführen kann, z.B. Fahren.


Der Sinn hinter dem Objektorientierten Programmmieren ist es nun, alles in solche Objekte zu verschachteln, damit man so die Komplexität von Softwarelösungen in den Griff bekommt.
Hier kommen nun die Stichwörter Vererbung und Abgeleitete(Sub-) bzw. Basis-(Super-)Klasse ins Spiel.
Es geht darum dass es von Klassen wie Autos auch Subklassen gibt, welche zwar die Eigenschaften und Methoden der Klasse Auto haben, diese Jedoch möglicherweise leicht verändert brauchen oder zusätzlich andere Eigenschaften und Methoden haben.
Durch die Vererbung bekommen Subklassen dieselben Eigenschaften und Methoden wie ihre Basisklassen.

Am besten zeige ich das anhand eines Beispiels:

Wir überlegen nur theoretisch, was es braucht, um Figuren wie Dreiecke, Linien, Rechtecke oder Kreise zu zeichnen(natürlich digital).

Zu allererst überlegen wir uns: was haben diese 4 Figuren gemeinsam?
Das einzige was mir hier in den Sinn kommt: sie brauchen eine Position, wo sie gezeichnet werden.
Ebenfalls müssen sie Gezeichnet werden.


Das ist nun unsere erste, also unsere Basis-Klasse: Figur
Sie hat 2 Variablen und zwar die "x" und die "y" Variable. Damit kann man nun die Position angeben.
Zusätzlich habt sie auch eine Methode "Zeichnen", mit der sie gezeichnet wird.
Den ganzen Code werde ich nun natürlich sehr vereinfacht schreiben.


Code:
public class Figur
{
int x;
int y;

public void Zeichnen();
}


Dreick, Linie, Rechteck und Kreis werden nun als Subobjekte vom Objekt Figur erstellt.

Dazu schreibt man hinter den Klassennamen extends "Basisklasse" hin. Beispiel:
public class Dreieck extends Figur{}


Alle Subklassen haben nun ihre eigene Spezialisierung der Basisklasse.
Die Linie braucht z.B. bloss einen weiteren Punkt.
Das Rechteck hingegen braucht eine Länge und eine Breite.
Der Kreis zusätzlich einen Durchmesser.
Das Dreieck 2 weitere Punkte.


Ebenfalls wird in jeder Subklasse die Methode "Zeichnen" der Basisklasse überschrieben.
Dazu muss in der Subklasse bloss eine Methode erstellt werden, welche den exakt selben Namen hat wie die in der Basisklasse.


Natürlich kann man über eine Objekt einer Subklasse immer noch auf die Methoden der Basisklasse zugreifen, jedoch muss ich hier auch mal Schluss machen, da das ein riesiges Thema ist.

Montag, 15. August 2011

August 2011 / C# AccessDB auf DataGridView

Zugriff auf Access-DB mit C#

Auftrag:
In der Firma bekam ich den Auftrag, ein Testprogramm zu schreiben, welches eine Möglichkeit bietet, Daten aus einer Access-Datenbank zu lesen, zu manipulieren und zu schreiben.
Als erstes erstellte ich mir eine ganz simple Access Datenbank mit 1. Tabelle.
Anschliessend versuchte ich einmal eine Datenbankverbindung herzustellen und das ganze einer Listview zuzuweisen, da ich in einem Anderen Projekt Erfahrungen mit diesem Objekt gesammelt habe.
Die Verbindung konnte ich zwar nach kleineren Problemen Herstellen, doch schlussendlich hat es nicht so funktioniert, wie ich wollte. Das Handling der Listview ist für diese Situation nicht sehr angenehm.
Ich stiess auf das Objekt DataGridView, welches genau dazu da ist, Daten anzuzeigen.

Code:
Zuerst muss ein Connecting-String definiert werden. Im Internet findet man Oftmals folgendes dazu:

String strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Datenbank.mdb";

Mit diesem String wird meines Wissens auf eine Datenbank von Access 2003 oder älter zugegriffen.
Zumindest hat er bei mir nicht funktioniert.
Für Access 2007 habe ich folgenden Connecting-String erfolgreich verwendet:

String strConnect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source = C:\\Datenbank.accdb;"

Anschliessend wird ein Select-Statement in einem String gespeichert. In meinem Fall sah das so aus:

strAbfrage = "Select * FROM TestTabelle";

Nun muss ein OleDbDataAdapter erstellt werden. Er dient als Brücke zwischen dem DataTable und der Datenbank. Als Parameter werden das Select-Statement und der ConnectingString mitgegeben:

OleDbDataAdapter dAdapter = new OleDbDataAdapter(strAbfrage, StrConnect);

Das nächste Objekt heisst OleDbCommandBuilder. Es generiert automatisch SQL-Code um die Änderungen, welche wir an unserem DataTable machen, der Datenbank mitzuteilen:

OleDbCommandBuilder cBuilder = new OleDbCommandBuilder(dAdapter);

Natürlich brauchen wir noch ein DataTable. Dieses Objekt speichert unsere Daten Temporär, damit wir sie später wieder in die Datenbank schreiben können:

DataTable dTable = new DataTable();

Nun füllen wir das DataTable noch mit den Daten:

dAdapter.Fill(dTable);

Nun haben wir die Daten ins DataTable gefüllt.
Jetzt müssen wir sie noch mit dem DataGridView synchronisieren.
Dazu erstellen wir ein BindingSource-Objekt:

BindingSource bSource = new BindingSource();

Natürlich muss der BindingSource noch das DataTable und dem DataGridView die BindingSource bekannt gemacht, also zugewiesen werden:

bSource.DataSource = dTable;
dgvTest.DataSource = bSource;

Nun funktioniert alles bis auf das synchronisieren mit der Datenbank, denn der OleDbDataAdapter synchronisiert die Daten ja nicht immer mit der Datenbank, sondern nur mit folgendem Befehl:

dAdapter.Update(dTable);

Diesen Befehl kann man nun z.B. per Knopfdruck, beim Verlassen einer Zelle oder beim Validating Event des DataGridViews aufrufen.

Wichtig wäre nun noch ein korrektes Error-Handling.
Was ich bis jetzt eingebaut habe ist das Error-Handling bei falschen Daten. Wenn man also Text anstelle von Zahlen eingibt, wo zahlen gefordert werden.
Wird das gemacht, wird dar DataError-Event ausgelöst. Dort kann dann reagiert werden.

Montag, 4. Juli 2011

Juli 2011 / Routing

Routing

Unter Routing versteht man das Festlegen der Wege in bzw. zwischen Netzwerken, um Daten möglichst schnell zu übertragen.
Das ganze kann man am besten mit einem Zugnetz vergleichen. Die Bahnhöfe sind dabei die Router und die Züge die einzelnen Daten-Pakete.
Angenommen ein Zug kommt auf Bern und will Richtung Thun weiter. Wenn der Bahnhof alle Informationen hat die er benötigt, findet er schnell heraus, dass er den Zug am besten über Münsingen leiten würde, da dies der schnellste Weg ist.
Was aber macht der Bahnhof wenn diese Verbindung unterbrochen oder ihm gar nicht bekannt ist?
Er sucht, die nächst beste Variante heraus. In diesem Fall würde er den Zug nun über Belp fahren lassen.
Dieses Vorgehen würde er wiederholen, bis er eine funktionierende Verbindung findet.
Wie bereits erwähnt muss der Bahnhof jedoch genau wissen, wo er die Züge überall durch leiten kann.

Beim Router wird das in der Sogenannten Routing-Tabelle gespeichert.
Diese besteht aus folgenden Spalten:
- Zieladresse: Die 1. IP des Zielnetzes.
- Netzmaske: Die Subnetzmaske des Zielnetzes
- Gateway: Adresse des nächsten ihm bekannten Ziels (Kann eigene IP sein)
- Schnittstelle: IP-Adresse der Schnittstelle zum jeweiligen Netz.

- Metrik: Dient zur Priorisierung der möglichen Wege


Das Ganze funktioniert ziemlich einfach.

Wir gehen von folgender Situation aus:

Wir haben 2 Router und 3 Netze.

Router Nr. 1 verbindet das Netz 192.168.0.0/24 mit dem Netz 192.168.1.0/24.

Router Nr. 2 verbindet das Netz 192.168.1.0/24 mit dem Netz 192.168.2.0/24.

Die Netze 192.168.0.0/24 und 192.168.2.0/24 haben also keine direkte Verbindung, müssen also über das Netz 192.168.1.0/24 verbinden.

Der Router Nr. 2 hat nebst den Standard-Routen, loopback-Routen usw. noch folgende Einträge:



Daraus sieht man also im 1. Eintrag, dass der Router, wenn er etwas ins 192.168.0.0-Netz schicken muss, über den Gateway 192.168.1.1 und die Schnittstelle 192.168.1.2 gehen muss.

Die IP-Adresse das Gateways entspricht dabei Router Nr. 1 da dieser das Paket ins nächste bzw. Ziel-Netz schicken muss.

Die Schnittstelle entspricht dabei der eigenen IP-Adresse im Netz 192.168.1.0 durch welches das Paket übertragen werden muss.


Solche Routing-Tabellen könnten natürlich fast unendlich lang werden.

Standard-Router wie wir sie von zuhause kennen, verbinden jedoch nur das eigene LAN-Netzwerk mit dem "Internet".

Solche Router schicken alles, was Richtung Internet geht einfach Richtung Provider und dieser kümmert sich dann um die Weiterleitung.

Mittwoch, 22. Juni 2011

Juni 2011 / Sortier-Programm




Sortier-Programm

Im Modul 318 - Analysieren und objektbasiert programmieren mit Komponenten bekamen wir den Auftrag, ein Programm mit Visual Basic .NET zu programmieren, welches Texte nach Ziffern oder Wörtern alphabetisch sortieren kann.

Dazu mussten wir mindestens 2 Sortieralgorithmen programmieren und das GUI des Programms möglichst Benutzerfreundlich gestalten.
Der 1. Sortieralgorithmus war einer der folgenden:


Bubble-Sort:
Der Bubble-Sort vergleicht der Reihe nach zwei benachbarte Elemente und vertauscht diese, falls sie in der falschen Reihenfolge stehen. Dieser Vorgang wird so lange wiederholt bis alle Elemente in der richtigen Reihenfolge sind und somit nichts mehr vertauscht werden kann.
Nachteil: Er ist der Langsamste Sortieralgorithmus.


Select-Sort:

Beim Select-Sort wird ein Feld einmal komplett durchlaufen. Dabei wird durch einfache Vergleiche das Grösste (oder kleinste) Element herausgesucht und ans Ende (bzw. zum Anfang) des Feldes gesetzt.
Dieser Schritt wird nun mit dem kleineren Teilfeld(Feld ohne das letzte bzw. erste Element) wiederholt, bis alle Elemente richtig eingeordnet sind.


Insert-Sort:

Beim Insert-Sort wird zuerst 1 Element eingefügt. Anschliessend wird dieses Feld um ein weiteres Element erweitert. Dieses neue Element wird durch Vergleiche und Verschiebungs- oder Vertauschungsoperationen an die richtige Stelle im Feld platziert.
Dieser Schritt wird wiederholt, bis alle Elemente im Feld eingereiht sind.


Ich entschied mich vorerst für den Insert-Sort, da dieser etwas komplizierter war und mich daher auch etwas mehr forderte.
Zu unserem ausgewählten Algorithmus sollten wir nun ein sogenanntes Struktogramm erstellen:


Nun musste jede Person noch einen 2. Algorithmus erstellen. Und das war der

Quick-Sort:
Der Quicksort teilt das zu sortierende Feld in 2 Teilfelder. Dazu wählt er ein beliebiges Element (bei mir das in der Mitte) aus dem Feld und positioniert alle kleineren Elemente links und alle grösseren Elemente rechts davon.
Anschliessend wiederholt er diesen Vorgang mit den erstellten Teilfeldern, bis alle Elemente richtig positioniert sind.
Auch hier mussten wir wieder ein bzw. zwei Struktogramme erstellen:


Das Programmieren der Algorithmen an sich war nicht wirklich schwierig, man konnte den gesamten Code eigentlich aus den Struktogrammen lesen.
Die Funktionen die ich gebraucht habe wie Mid(), Len(), Trim() und Split() kannte ich alle bereits von früheren Programmierarbeiten.
Was ich spannender fand, war das Programmieren des GUIs, da ich neue Sachen kennen gelernt habe.


Die Abfrage des Active-Conrols:
Diese Abfrage habe ich gebraucht, um zu überprüfen ob meine Icons auf enabled gesetzt werden können oder nicht.
Würde ich das nämlich nicht überprüfen und versuchen den "markierten" Text zu kopieren oder auszuschneiden würde das Programm abstürzen.
Da ich nur mit Textboxen gearbeitet habe, überprüfe ich mit Hilfe der ActiveControl-Eigenschaft der Form, ob eine Textbox ausgewählt ist.
Aber bevor nun etwas kopieren kann muss ich auch noch überprüfen, ob überhaupt ein Text markiert ist. Im Ganzen sieht das dann so aus


If TypeOf Me.ActiveControl Is Textbox Then
If CType(Me.ActiveControl, Textbox).SelectedText <> "" Then
Kopieren
End If
End If


Das arbeiten mit dem Clipboard:
Wie bereits vorhin angesprochen hab ich die Funktionen um Text zu Kopieren, Auszuschneiden, und einzufügen programmiert.


Kopieren/Auschneiden:
Um etwas ins Clipboard zu speichern wird die Clipboard-Methode SetDataObject verwendet:


Clipboard.SetDataObject(CType(Me.ActiveControl,Textbox).SelectedText)


Beim Ausschneiden wird anschliessend über das ActiveControl noch der ausgewählte Text gelöscht.


Einfügen:
Beim Einfügen habe ich immer noch etwas mehr überprüfen müssen. Den ohne gespeicherten Text kann man auch nichts einfügen.
Dazu wird mithilfe der Clipboard-Methode GetDataObejct der gespeicherte Text abgefragt.
Die Abfrage, ob nun Text gespeichert ist oder nicht sieht so aus:


If Clipboard.GetDataObject.GetData(DataFormats.Text) <> "" Then


Das Einfügen Selbst ist sehr ähnlich wie das überprüfen:


CType(Me.ActiveControl,TextBox).SelectedText = _
Clipboard.GetDataObject.GetData(DataFormats.Text)


Die Open-/Save-FileDialogs:
Mithilfe der Dialoge kann man sehr schwierige Funktionen sehr vereinfachen.
Der OpenFileDialog wird dazu verwendet Dateien zu öffnen und der SaveFileDialog logischerweise um Dateien zu Speichern.


Bei beiden Dialogen muss man zuerst ein Objekt als solchen Dialog Initialisieren:


Dim dlgSaveFile As New SaveFileDialog()
Dim dlgOpenFile As New OpenFileDialog()


Anschliessend kann man einen Filter setzten, damit nicht alle Dateien angezeigt werden. Man kann auch über die Eigenschaft RestoreDirectory festlegen, ob sich das Programm den ausgewählten Pfad merken soll, damit es beim nächsten Aufruf denselben Pfad öffnet.
Öffnen kann man diesen Dialog mit:


If dlgSaveFile.ShowDialog() P= DialogResult.OK Then
End If


So kann direkt abgefragt werden ob auf OK geklickt wurde.

Dienstag, 24. Mai 2011

Mai 2011 / Subnetting

Subnetting

Subnetting bedeutet das unterteilen eines Grösseren Adressraums von IP-Adressen in mehrere kleinere Adressräume.
Subnetting betreibt man z.B. um ein Firmennetzwerk in örtlich- oder abteilungs-bedingte Netzwerke zu unterteilen.

Wie ist eine IP-Adresse überhaupt aufgebaut?
Eine IP-Adresse der IPv4 besteht aus 4 Dezimalzahlen. Jede dieser Dezimalzahlen besteht aus 8 Bits was bedeutet, dass jede dieser Dezimalzahlen eine Zahl von 0 bis 255 darstellen kann.
Beispiel:
196.168.1.255
11000100.10101000.00000001.11111111
Insgesamt ermöglicht das 4294967296 verschiedene Kombinationen, also fast 4,3 Milliarden.
Diese Adressen sind jedoch nun bereits alle vergeben und daher sollte bald die IPv6 mit 128 anstatt 32 Bit herauskommen.

Wie funktioniert Subnetting?
Da das die IPv6 aber noch nicht eingeführt wurde, beschreibe ich hier das Subnetting mit IPv4, wobei das unter IPv6 eigentlich genau gleich funktioniert.
Der IPv4 Adressraum wurde in 5 verschiedene Netzklassen unterteil.
Sie wurden jedoch später überarbeitet, da diese Netzklassen keine genügende Flexibilität boten. Es wurde durch das CIDR(Classless Inter-Domain Routing) möglich gemacht X-Beliebig grosse Netze zu vergeben. Daher kann heutzutage nichtmehr nur durch die IP-Adresse festgestellt werden, wie Gross ein Netzwerk ist.
Dazu braucht man nun die Netzmaske, welche festlegt, wie gross das Netzwerk ist.
Wie genau das CIDR funktioniert erkläre ich nach den Netzklassen.

Netzklasse A:
Diese Netzklasse hat als Binären Präfix nur ein 0.
Das bedeutet das jede IP dessen Adresse Binär mit 0 beginnt zu einem Klass A-Netz gehören sollte.
Das entspricht allen IPs von 0.0.0.0 bis 127.255.255.255
Ein solches Netz hat die Netzwerkmaske 255.0.0.0 was bedeutet dass die erste Zahl festgelegt ist und der Besitzer alle Adressen dieses Bereiches frei verwenden kann. Hätte ich also dass Klass A-Netz 12.0.0.0 hätte ich alle Adressen von 12.0.0.0 bis 12.255.255.255 was einer Anzahl von 16'777'216 Adressen entspricht.
Da man jedoch die erste und die letzte Adresse nicht verwenden kann, besitzt man genau 2 weniger.
Von diesen netzen gibt es logischerweise allerdings nur 128.

Netzklasse B:
Diese Netzklasse hat als Binären Präfix 10.
Das bedeutet das jede IP dessen Adresse Binär mit 10 beginnt zu einem Klass B-Netz gehören sollte.
Das entspricht allen IPs von 128.0.0.0 bis 191.255.255.255
Die Netzwerkmaske von diesem Netz ist 255.255.0.0 was bedeutet, dass die ersten beiden Zahlen festgelegt sind und der Besitzer alle Adressen dieses Bereichs frei verwenden kann. Hätte ich das Klass B-Netz 135.34.0.0 hätte ich alle Adressen von 135.34.0.0 bis 135.34.255.255 was einer Anzahl von 65'536 Adressen entspricht. Auch hier hätte man wieder 2 weniger.
Anzahl Klass B-Netze: 16'384

Netzklasse C:
Diese Netzklasse hat als Binären Präfix 110
Das bedeutet das jede IP dessen Adresse Binär mit 110 beginnt zu einem Klass C-Netz gehören sollte.
Das entspricht allen IPs von 192.0.0.0 bis 223.255.255.255
Die Netzwerkmaske von diesem Netz ist 255.255.255.0 was bedeutet dass die ersten 3 Zahlen festgelegt sind und der Besitzer alle Adressen dieses Bereichs frei verwenden kann. Hätte ich das Klass A-Netz 197.188.20.0 hätte ich alle Adressen von 197.188.20.0 bis 197.188.20.255 was einer Anzahl von 256 Adressen entspricht. Auch hier hätte man wieder 2 weniger.
Anzahl C-Netze: 2'097'152

Netzklasse D:
Diese Netzklasse hat als Binären Präfix 1110
Das bedeutet das jede IP dessen Adresse Binär mit 1110 beginnt zu einem Klass D-Netz gehören sollte.
Das entspricht allen IPs von 224.0.0.0 bis 239.255.255.255
Diese Klass D-Netze werden für Multicast-Anwendungen verwendet.

Netzklasse E:
Diese Netzklasse hat als Binären Präfix 1111
Das bedeutet das jede IP dessen Adresse Binär mit 1111 beginnt zu einem Klass E-Netz gehören sollte.
Das entspricht allen IPs von 240.0.0.0 bis 255.255.255.255
Diese Klass E-Netze sind für Zukünftige Zwecke reserviert.

Classless Inter-Domain Routing
Um die Funktion von CIDR zu beschreiben wechseln wir nun in die Binäre Darstellung der Zahlen.
Der CIDR-Präfix ist eine Zahl zwischen 0 und 32 der die Netzwerkmaske beschreibt. Entsprechend diesem Präfix bzw. der Netzwerkmaske sind die Netze festgelegt.
Die Präfixe der Netzklassen wären folgendermassen:
Klass A: 8 Binäre Netzwerkmaske: 11111111.00000000.00000000.00000000
Klass B: 16 Binäre Netzwerkmaske: 11111111.11111111.00000000.00000000
Klass C: 24 Binäre Netzwerkmaske: 11111111.11111111.11111111.00000000
Der Präfix bestimmt also die Anzahl festgelegter 1 innerhalb der Netzwerkmaske.
Nun könnte man auch innerhalb der eigentlichen Klass A-Netze Netze mit dem CIDM-Präfix 24 vergeben werden.
Der eigentliche Vorteil daran ist, dass man auch andere Netz-Grössen hat. Hätte man früher für ein Firmennetzwerk mit 100'000 Adressen ein Klass A Netz gebraucht - und damit über 16 millionen IPs verschwendet - kann man nun ein Netz mit dem CIDR-Präfix 15 (131'072 IPs)nehmen. Es werden zwar immer noch zu viele IPs zugewiesen, doch der Verlust ist viel geringer.

Möchte diese Firma nun jedoch nicht nur 1 grosses Netz mit 131'072 IPs sondern vieleicht 8 verschiedene Netze in dem je 12'500 Hostadressen verfügbar sind, kann man dieses Netz durch Subnetting entsprechend aufteilen:
Ich nehme an ich habe das Netz 123.34.0.0.
Dann würde mein IP-Adressraum von 123.34.0.0 bis 123.35.255.255 gehen.
Nun könnte ich diesen Adressraum ohne Probleme halbieren, indem ich ein Netz von 123.34.0.0 bis 12.34.255.255 und eins von 123.35.0.0 bis 123.35.255.255 mache.
Jedes dieser Netze hätte nun noch 65'534 Hostadressen. Jedes dieser Netze hätte nun also wieder den CIDR-Präfix 16.
Teile ich die Netze immer weiter auf komme ich schlussendlich auf 8 Netze mit jeweils 16'382 Hostadressen.
Der CIDR-Präfix dieser Netzwerke wäre nun 18.
Das 1. dieser 8 Netze hätte also eine Reichweite von 123.34.0.0 bis 123.34.63.255

Freitag, 29. April 2011

April 2011 / Leitungscodierung

Leitungscodierung

Im Modul 129 - Lankomponenten in Betrieb nehmen, teilten wir unsere Klasse in 5 Gruppen. Jede Gruppe sollte zu einem vom Lehrer definierten Thema eine Dokumentation erstellen und eine Präsentation halten.
Unsere Gruppe bekam das Thema Leitungscodierung. Dieses Thema ist ziemlich komplex und es zu verstehen ist nicht ganz einfach.

Was ist Leitungscode?
Der Leitungscode dient dazu ein digitales Signal in eine Form abzubilden, damit dieses für eine Übertragung geeignet ist. Er nimmt also die Rohdaten, welche er übertragen sollte, und codiert sie so um, dass sie (möglichst) optimal übertragen werden können.
Dabei gibt es verschiedene Codierungen wie die Binäre Codierung, die Manchester-Codierung oder die MLT 3-Codierung welche alle einzelne Vor- und Nachteile haben.

Die Taktrückgewinnung
Die Taktrückgewinnung ermöglicht es dem Empfänger genau zu wissen, wann er das Signal abtasten muss, also in welcher Geschwindigkeit die Bits übertragen werden.
Die Taktrückgewinnung wird dabei aus den Signalflanken gewonnen. Das bedeutet es braucht genügend Spannungswechsel. Das bedeutet, dass lange folgen von Nullen oder Einsen zu vermeiden sind.
Dies kann durch eine entsprechende Leitungscodierung gemacht werden.
Kann ein Code keine Taktrückgewinnung erzeugen, braucht es zusätzlich eine Taktleitung, welche dem Empfänger den Takt mitteilt.

Binärer Leitungscode





Der binäre Leitungscode ist sehr einfach. Bei diesem Code bedeutet jeder Zustand eine Information.
Ein Beispiel ist die RS232-Schnittstelle, bei der eine positive Spannung eine logische 0 und eine negative Spannung eine logische 1 bedeutet.
Im Manchester-Code ist das z.B. nicht der Fall. Bei ihm gibt es viele Zustände, welche keine direkte Information enthalten, denn es wird bei jeder Information mind. 1-mal die Spannung gewechselt.
Bei diesem Code ist also keine Taktrückgewinnung möglich, da es bei dieser Codierung lauter Nullen oder Einsen geben kann.
Ein weiteres Problem bei diesem Code ist, dass er nicht gleichspannungsfrei ist, da Nullen oder Einsen stark überwiegen können. Das macht eine Übertragung über längere Distanz unmöglich.





Manchester-Code Der Manchester-Code verhält sich im Vergleich zu den anderen Codes etwas Speziell. Er benötigt für jedes übertragene Bit einen Spannungswechsel, also eine 1 und eine 0.
Bei einer logischen 1 wird zuerst eine 1 und dann eine 0 gesendet.
Bei einer logischen 0 zuerst eine 0 und dann eine 1.
Oder genau umgekehrt, wie beim IEEE 802.3 Standard, welcher beim 10M/Bits-Ethernet verwendet wird.
Diese Codierung bedeutet, dass die Übertragungsrate der effektiven Daten halbiert wird.
Dafür hat der Manchester-Code 2 grosse Vorteile.
Da bei jedem Signal mind. einen Spannungswechel vorkommt, ist die Übertragung komplett gleichspannungsfrei. Dadurch können die Daten über grösse Distanzen übertragen werden.
Der 2. Vorteil ist, dass aus der ständig ändernden Spannung ohne Probleme eine Taktrückgewinnung möglich ist.


4B5B-Code
Der B4B5-Code wird z.B. in Kombination mit dem MLT 3-Code beim 100-Base-TX Ethernet verwendet.
Er codiert Blöcke von 4Bits in 5-Bit-Blöcke um.
Dadurch werden nie mehr als 3 logische 0 oder 1 aufeinander folgen, was die Taktrückgewinnung erleichtert.
Der Nachteil jedoch ist, dass nur 4 von 5 Bits Nutzdaten sind, also 20% des Übertragenen Signals unbrauchbar ist.

MLT 3-Code

Der MTL 3-Code wird wie bereits erwähnt in Kombination mit dem B4B5-Code verwendet, da dieser alleine keine Taktrückgewinnung ermöglicht.
Er benutzt 3 Spannungspegel welche mit +, 0 und - bezeichnet werden.
Bei einer logischen 0 wird die aktuelle Spannung gleichgehalten und bei einer logischen 1 wird die Spannung geändert. Dies geschieht in folgender Reihenfolge:
0+0-0+0- usw.
Daher bedeutet bei dieser Codierung auch jeder Zustand eine Information, wie bei der Binären Codierung.
Ein Vorteil des MLT 3-Codes ist, dass er fast gleichspannungsfrei ist. Das bedeutet dass er ebenfalls über längere Distanzen übertragen werden kann.
Da er aber nicht komplett gleichspannungsfrei ist, kann das zu einer erhöhten Bitfehlerrate oder sogar zu einem Verbindungsabbruch beim Empfänger führen.
Dieses Problem wurde jedoch behoben, wie genau, habe ich jedoch nicht herausgefunden bzw. verstanden.

Mittwoch, 30. März 2011

März 2011 / VBA im Bezug auf Datenbanken

VBA

Ich bekam den Auftrag in Access mit VBA eine Funktion zu Programmieren, welche auf unsere Zeiterfassungsdatenbank (Dynabase2) zugreift, die Daten im ausgewählten Zeitrahmen ausliest und diese anschliessend auf die Korrektheit überprüft.

Da ich noch keine Ahnung hatte begann ich sehr einfach.
Zuerst suchte ich mir in den Bereits vorhandenen Funktionen den Datenbank-Zugriff und das Select-Statement.
Dabei fand ich folgende Code Zeilen:

Dim Db as Datebase
Dim Rs as Recordset
Set Db = CurrentDb()
Set Rs = Db.OpenRecordset("Select-Statement")

Die ersten beiden Zeilen deklarieren die Variablen Db als Datenbank und Rs als Recordset(Enthält Kopien von Datensätzen).
Mit CurrentDb() wird der Variable Db die aktuell im Access geöffnete DB zugewiesen. Mit OpenRecordset wird der Variable Rs eine Kopie der Daten, welche durch das Select-Statement ausgewählt werden zugewiesen.

Ich musste nun als erstes mein Select-Statement anpassen.
Ich brauchte die MitarbeiterID, das Datum und die beiden Uhrzeiten, welche Start und Beginn einer Arbeitsphase sind, aus der Tabelle Aktivitaet von allen Datensätzen, welche innerhalb des per GUI ausgewählten Datums lagen.
Also musste ich herausfinden, wie ich auf ein Objekt der benutzeroberfläche Zugriff.
Da ich die ganze Funktion per Button in der dazugehörigen Form aufrief, Programmierte ich bereits in der Richtigen Form. Aus diesem Grund konnte ich direkt über Me auf die Objekte zugreifen.
Das Startdatum wurde im Objekt ctlStart gespeichert und das Enddatum in ctlEnde. Da ich nun auf die Werte zugreifen wollte musste ich also die Values abrufen.
Das funktioniert so:

StartDatum = Me.ctlStart.Value
EndDatum = Me.ctlEnde.Value

Wobei StartDatum und EndDatum Date-Variablen darstellen.

Da ich später bemerkte dass das Select-Statement das Datum "Amerikanisch" interpretiert, also die 1 Zahl als Monat nahm, musste ich mir etwas anderes Einfallen lassen.
Dazu brauchte ich nun die Funktionen Year(), Month() und Day(). Als Parameter übergab man diesen Funktionen ein Datum und sie lasen automatisch jeweils Jahr, Monat und Tag heraus. Diese Werte konnte ich anschliessend an Variablen übergeben und das Datum der Select-Statement-Syntax anpassen.
Dabei musste ich es folgendermassen Formatieren: 03/24/2011 also Monat/Tag/Jahr

In der SQL Abfrage musste ich vor und hinter die Daten je noch ein # stellen und die Daten wurden erkannt.

Schlussendlich lautete mein Select-Statement folgendermassen:

"SELECT [MitarbeiterID], [Datum], [Zeit1], [Zeit2] FROM [Aktivitaet] WHERE [Datum] >= #" & Zeit1 & "# ABD [Datum] <= #" & Zeit2 & "# ORDER BY [MitarbeiterID], [Datum], [Zeit1]"

Die Wörter in [] sind dabei Spalten oder Tabellen(Aktivitaet) innerhalb der Datenbank. Zeit1 und Zeit2 beinhalten die ausgewählten Start- und End-Daten. Geordnet wurde die Ausgabe nach Mitarbeiter, dann nach Datum und dann nach Zeit.

Nun musste ich auf die einzelnen ausgegebenen Datensätze zugreifen.
Das funktioniert über folgende While-Schlaufe:

Do While Not Rs.EOF
Rs.MoveNext
Loop

Mit Not Rs.EOF wird die Schlaufe so lange durchlaufen, bis der Zeiger im Recordset ans Ende gelangt ist.
Mit Rs.MoveNext springe ich bei jedem Durchlauf auf den Nächsten Datensatz.
Nun brauchte ich noch den Zugriff auf die einzelnen Zellen des Datensatzes und das funktioniert so:

Variabel = Rs![Datum]

So wird der Variabel den Wert des Feldes Datum zugeordnet.
Zum Schluss muss man den Recordset und die Datenbank schliessen, bzw. die Instanzierung auflösen.
Das funktioniert mit Close.

Rs.Close
Db.Close

Alle Anderen Funktionen welche ich verwendete, sind hier irrelevant, weil sie entweder zu grundlegend waren oder ich sie bereits einmal in einem Anderen Post erwähnt habe. Ebenfalls haben sie nicht direkt etwas mit dem Datenbank-Programmieren zutun, sondern sind bloss normale VB bzw. VBA Funktionen.

Montag, 28. Februar 2011

Februar 2011 / WSH

WSH

Wir begannen mit dem 2. Semester des 2. Schuljahres und daher begannen wir auch mit den neuen Modulen.
Im Modul 122 - Abläufe mit Skripts/Makros automatisieren lernten wir den WSH kennen.
WSH bedeutet Windows Script(auch Scripting) Host und dient dazu Funktionen unter Windows zu Automatisieren. Der Windows Script Host stellt JScript und VBScript als Programmiersprachen zur Verfügung, deckt die Funktionen der älteren Batch-Scripts ab und ermöglicht die Steuerung von einigen Programmen wie dem Internet Explorer, Datenbanken oder den Office-Programmen.
In der Schule begannen wir vorerst mit VBScript zu arbeiten. Daher sind die Dateiendungen unserer Scripts auch ".vbs".
Ich habe bereits 1 mal über VBScript geschrieben. Jedoch hatte ich damals keine Ahnung was genau wie funktionierte, welche Zeile genau welche Funktion hatte usw.
Ausserdem programmierte ich damals für Windows CE, was nur eine sehr abgespeckte VBScript Version zur Verfügung stellte.
Im Unterricht begannen wir jedoch komplett bei 0 und wir lernten das Grundlegende im Selbststudium.

Das WScript-Objekt
Das WScript-Objekt ist das einzige Objekt, welches man direkt verwenden kann, ohne dieses zuerst instanziieren zu müssen.
Dieses Objekt hat mehrere Methoden und Eigenschaften, so wie eigentlich fast jedes andere Objekt auch.

Die Methode .echo() hat eine sehr einfache Funktion: Sie gibt eine Meldung aus.
Dabei muss ein Parameter übergeben werden. Also entweder ein Text, eine Variable oder eine Eigenschaft. Das sieht dann so aus:
Wscript.echo Wscript.Name oder Wscipt.echo "Test"
Dabei kann der Parameter auch in Klammern Stehen.

Nun zu der Eigenschaft die ich bereits verwendet habe, Name
Verwende ich diese Eigenschaft als Parameter bei der Methode .echo gibt die Meldung "Windows Script Host" aus.
Nun schön damit können wir jedoch noch nicht besonders viel anfangen.

Das FileSystemObject
Das nächste Objekt dass wir kennen lernten war das FileSystemObject und es war mir nicht ganz unbekannt. Im Gegensatz zum Wscript-Objekt muss dieses Objekt, wie alle anderen auch, instanziiert werden, dafür hat es aber keine "direkten" Eigenschaften sondern nur Methoden, die Eigenschaften von File-Objekten liest.
Instanziieren bedeutet dass das Objekt "Kopiert" wird, dafür Speicherplatz reserviert wird und einem Namen übergeben wird, damit man es leichter ansprechen kann.
Das FileSystemObject instanziiert man folgendermassen:
Dim Fso
Set Fso = CreateObjext("Scripting.FileSystemObject")
Mit dem Befehl Dim deklariere ich Fso als Variable. Der Name wird standardmässig für das FileSystemObject verwendet und dient zur Übersichtlichkeit.
Danach instanziiere ich das Objekt mit dem Set-Befehl.

Nun kann ich über Fso alle Eigenschaften und Methoden des FileSystemObjects aufrufen.
Dazu ein kleines beispiel mit der Methode .CopyFile()
Mit folgender Zeile kopiere ich eine Textdatei und benenne Sie um.
Fso.CopyFile ("C:\Textdatei.txt", "C:\Neue Textdatei.txt")
Der erste Parameter übergibt das zu kopierende File und der 2. den Zielpfad + Namen.

Die GetFile() Methode ist eine Weitere Methode, mit dem man eine Datei einer Variabel zuordnen kann. So sichert man den Speicherplatz und den Zugriff auf die Datei.
Das Objekt das daraus entsteht heisst File Objekt.
Daher muss auch hier wieder ein Objekt instanziiert werden.
Dim f
Set f = Fso.GetFile("C:\Textdatei.txt")
Nun kann man viel einfacher auf die Datei zugreifen und muss nicht über das FileSystemObject gehen.
Möchte man die Datei löschen kann man das nun so:
f.Delete
Über das FileSystemObject müsste man das so machen:
Fso.DeleteFile("C:\Textdatei.txt")

Wie bereits erwähnt, kann man über das FileSystemObject auch Eigenschaften von File-Objekten auslesen. Natürlich geht das ganze wieder einfacher, wenn man direkt über das File-Objekt gehen kann.

Mittwoch, 26. Januar 2011

Januar 2011 / Windows Server 2008 R2

Windows Server 2008 R2

Im Modul 123 - Serverdienste in Betrieb nehmen, haben wir während des letzten Semesters einen Virtuellen Windows Server 2008 konfiguriert. Dabei lernten wir einzelne Funktionen und Rollen des Servers kennen.
Wir konfigurierten unseren Server nach einem Fallbeispiel.

In diesem Fallbeispiel teilen sich eine Arztpraxis und ein Altersheim den Server und den Internet-Anschluss. Dabei soll alles, wie Berechtigungen, Interne Website usw. auf dem Server geregelt sein. Die Arztpraxis und das Altersheim sollen jedoch nichts vom jeweils anderen "Betrieb" mitbekommen, was bedeutet, dass sie in einer Domäne getrennt gehandelt werden sollen.

Zuerst richteten wir den DNS-Server ein, damit wir anschliessend das AD installieren konnten.
Der DNS-Server dient dazu, URLs wie z.b. http://www.google.ch/ in IP-Adressen umzuwandeln.
Hier lernten wir wie das Ganze genau funktioniert, wie der Server die URLs auflöst.

Dann richteten wir das ADDS (Active Directory Domain Services) ein. Es ist der Verzeichnisdienst unter Windows Server 2008. Er ermöglicht, die Aufteilung des Netzwerks entsprechend der Struktur einer Firma, oder der räumlichen Verteilung.
Beim Installieren lernten wir viele neue Begriffe und deren Zusammenhänge kennen wie Tree, Forest, Global-Catalog usw. Diese Begriffe hier aufzuzählen und zu erklären halte ich nicht für sinnvoll.
Jedoch mussten wir uns überlegen, wie genau wir unser Netzwerk aufteilen können. Dazu lernten wir die Organisationseinheiten(OU's) kennen.
Wir teilten unsere OU's entsprechend dem Fallbeispiel in Altersheim und Arztpraxis und den jeweiligen Computern, Gruppen und Benutzern auf.

Beim Installieren erstellten wir eine neue Gesamtstruktur(Forest). Der Top-Level-Name ist dabei local, was sich für nicht-öffentliche Domänen eingebürgert hat.
Schlussendlich nannten wir unsere Domäne Sonnenhof.local.

Nachdem wir das ADDS installiert hatten, widmeten wir uns dem IIS
(Internet Information Server).
Dabei lernten wir die genaue die 4 verschiedenen Authentifications kennen:
Die Anonymous Authentification dient dazu, dass jeder Zugriff ohne Name/Passwort hat.
Mit der Basic Authentification braucht man einen Namen und ein Passwort für den Zugriff.
Die Digest Authentification hat die gleiche Funktion wie die Basic Authentification, ist jedoch sicherer.
Bei der Windows Authentification wird der Zugriff im Intranet über den Domain-Client geregelt.
Der IUSR dient dabei bei der Anonymous Authentification als Anonymer Benutzer. So kann der Administrator die Rechte des Anonymen Benutzers regeln.
Wir installierten uns einen Webserver für dir Intranet-Sites, auf welche wir den Zugriff per Windows Authentification regelten.

Nun erstellten wir noch all unsere Benutzer und Gruppen, vergaben Rechte und lernten die GPOs kennen.