Formularfelder im Excel 2007 einfügen

Ich bin im Geschäft geraden das neue 2007 Office von MS am testen. Das ganze sieht nun ganz anders aus als bei den älteren Versionen und dementsprechend sucht man gewisse Funktionen auch mal ein weilchen.
Bei mir heute so geschehen, als ich auf der Suche nach Formularfeldern war. Wenn man weiss, wie es geht, ist es aber nicht mal so schwierig. Als erstes muss man dazu in die Optionen vom Excel und dort die Option "Entwicklerregisterkarte in der Multifunktionsleiste anzeigen" aktivieren.


Nun hat man neu das Ribbon "Entwicklertools" und kann dort mit einem Klick auf "Einfügen" ganz einfach Formularfelder einfügen.
http://images.t-error.ch/blog/603/einfuegen.jpg


So einfach ist es, wenn man es mal weiss.

Excel Dateien mit dem PHP-ExcelReader lesen

Für ein Projekt im Geschäft muss ich Daten von einer Excel Datei in eine mySQL Datenbank importieren. Das man im Excel nicht einfach sagen kann "Export zu mySQL" ist ja wohl klar. Also muss man das mit einem Script machen, ich benutze dazu PHP.
Das Problem ist ja bekanntlich nur das Auslesen der Daten aus der Excel Datei, das Schreiben in die DB geht mir PHP ja recht einfach von der Hand.

Eine Möglichkeit ist das Speichern der Excel Datei als XML und dann die XML Datei mit PHP zu lesen. Allerdings speichert Excel beim XML Export noch jede Menge zusätzlicher Informationen mit, die man nicht wirklich braucht, die Datei ist dann etwa doppelt so gross wie vorher und das lesen mit PHP Dauert auch ein weilchen.

Eine Alternative ist der PHP-ExcelReader. Damit kann man sehr einfach auf die Daten in Excel Dateien zugreifen. Das alles ohne einen mühsamen XML-Export und andere Verrenkungen. Hier möchte ich ein an einem kleinen Beispiel zeigen, wie man mit dem PHP-ExcelReader eine Excel Datei ausliest.

Als erstes muss man natürlich die ZIP Datei herunterladen und auf den Webserver kopieren. Dann kanns auch schon losgehen. Diese Datei muss nun natürlich auch eingebunden werden.
<?
// Excel Reader einbinden
require_once("excel/reader.php");
?>

Das das ganze eine Klasse ist kann man nun ein neues Objekt erstellen und auch gleich die Datei öffnen.:
<?
// Objekt erstellen, Encoding definieren
$xls=new Spreadsheet_Excel_Reader();
$xls->setOutputEncoding("CP12522");

// Die Datei daten.xls oeffnen
$xls->read("daten.xls");
?>


Da die Excel Dateien mehrere Tabellen (Worksheets) haben, muss man zuerst angeben, von welcher Tabelle man die Daten auslesen will. In diesem Beispiel wird mit einer Schleife jede Tabelle durchgegangen.
<?
// durch die Worksheets gehen
$counter=0;
foreach(
$xls->boundsheets AS $worksheet )
{
    
$sheet=$xls->sheets[$counter];
   
    
// worksheet ist der Zeiger in die Info der Tabelle
    // sheet ist der Zeiger in die Daten der Tabelle

    
$counter++;
}
?>

Mit den beiden Zeigern $worksheet und $sheet ist es nun ein leichtes die gewünschten Daten aus der Datei zu lesen. Nun aber noch ein komplettes Script, welches die Zeilen und Spalten der jeweiligen Tabelle und die Spaltenüberschriften ausgibt.
<?
ini_set
('memory_limit''10M');

// Excel Reader einbinden
require_once("excel/reader.php");

// Objekt erstellen, Encoding definieren
$xls=new Spreadsheet_Excel_Reader();
$xls->setOutputEncoding("CP12522");

// Die Datei daten.xls oeffnen
$xls->read("daten.xls");

// durch die Worksheets gehen
$counter=0;
foreach(
$xls->boundsheets AS $worksheet )
{
    
$sheet=$xls->sheets[$counter];

    
// worksheet ist der Zeiger in die Info der Tabelle
    // sheet ist der Zeiger in die Daten der Tabelle
    
$cols=$sheet['numCols'];
    
$rows=$sheet['numRows'];
    echo 
"<b>Arbeitsblatt ".($counter+1).": ".$worksheet['name']."</b><br />";
    echo 
"hat: ".$rows." Zeilen und ".$cols." Spalten.";

    
// Schleife ueber die Daten der Zeile 1 (bzw. 0
    
$celldata=$sheet['cells'];
    
$headrow=1;
    echo 
"<br /><br /><b>Spaltenueberschriften:</b><br />";
    for(
$x=1;$x<=$cols;$x++)
    {
        echo 
$celldata[$headrow][$x]." : ";
    }

    
$counter++;

    echo 
"<br /><br />";
}
?>


Beachten sollte man aber, dass so ein Script, je nach grösser der Excel Datei, einen grossen Speicher Verbrauch hat. Es macht also Sinn mit ini_set() das Memory-Limit etwas nach oben zu setzten, wenn man die Möglichkeit dazu hat.

Startscripts mit Gruppenrichtlinien ausführen

Über die Gruppenrichtlinien von einem Windows 2003 Server habe ich ja bereits beschrieben. Heute habe ich nun eine kleine Umstellung im Bezug der Startscripts gemacht. Also eigentlich nicht direkt am Startscript, sondern an der Ausführung.
Wie verwenden ein KIX Script, welches die Laufwerke der User verbindet. Das Script war bisher in der Active Directory bei jedem User als Logonscript eingetragen. Das funktioniert zwar tadellos, ist aber etwas unschön, da es wirklich bei jedem Benutzer eingetragen sein muss.
http://images.t-error.ch/blog/556/script_user.jpg


Die Alternative ist das Script über eine Gruppenrichtlinie zu starten. Einmal definiert kann man diese Richtlinie mit der Domäne verknüpfen und schon haben alle User dasselbe Startscript. Bei einer Änderung des Scripts, muss man die Änderung nur einmal vornehmen.

Dazu habe ich eine neue Richtline erstellt und mal der OU IT zugewiesen. Zum testen ist das Ideal, da ich der einzige Benutzer in dieser OU bin. Nun muss man diese Richtline auch noch bearbeiten.
http://images.t-error.ch/blog/556/gpo_edit.jpg


Im ersten Schritt gebe ich das Script an, welches ausgeführt werden soll. Zu finden ist dieser Eintrag hier:
Benutzerkonfiguration -> Windows-Einstellungen -> Skripts (Anmelden/Abmelden) -> Anmelden
Dort kann man nun das Script, welches beim Start ausgeführt werden soll, angeben. Standardmässig wird das Script im folgenden Pfad gesucht:
\\domain\SysVol\domain\Policies\{F4164071-158E-4E5D-8111-1E0754AB2FFE}\User\Scripts\Logon
Allerdings kann man mit durchsuchen auch einen andern Pfad angeben. Das Script muss über das Netzwerk einfach erreichbar sein.
http://images.t-error.ch/blog/556/script.jpg


Der Script ist angegeben. Soweit, so gut. Da bei uns ein schöne Script eingesetzt wird, welches den Benutzer mit dem Namen begrüsst (sehr höflich), soll das Script auch angezeigt werden. Denn Standardmässig ist das nicht der Fall. Also weiter in den tiefen der Richtlinien. Man navigiere hierhin:
Benutzerkonfiguration -> Administrative Vorlagen -> System -> Skripts
Dort die Option "Anmeldeskipts sichtbar ausführen" aktivieren. Done...
http://images.t-error.ch/blog/556/sichtbar.jpg


Zum Schluss kann man das ganze noch etwas tunen. Da in dieser Richtlinie nur Einstellungen bei der Benutzerkonfiguration vorgenommen wurden, muss der Server ja nicht nach Einstellungen in der Computerkonfiguration suchen. Dies lässt sich in den Details der Richtlinie deaktivieren. Einfach bei Objektstatus "Computerkonfigurationseinstellungen deaktivieren" (was für ein Wort) auswählen.
http://images.t-error.ch/blog/556/objektstatus.jpg


Natürlich möchte man das auch testen. Vor dem Abmelden zur Sicherheit noch ein gpupdate /force ausführen, dann Abmelden und wieder Anmelden. Das Startscript sollte nun ausgeführt werden und die Laufwerke verbunden sein.

Gruppenrichtlinienverwaltung unter Windows

Am letzten Samstag war ich ja wieder am MCSA Kurs. Das Hauptthema waren die Gruppenrichtlinien. Ein sehr spannendes und umfangreiches Thema.
Nun wollte ich das heute bei uns im Geschäft nochmals ansehen und auch einige Verbesserungen in unser System einbringen. Bevor ich allerdings loslegen konnte, muss ich die Gruppenrichtlinien-Verwaltungskonsole (GPMC) zuerst auf meinem Computer installieren. Danach konnte ich die MMC Starten und das "Gruppenrichtlinienverwaltung" Snap-In hinzufügen.
http://images.t-error.ch/blog/554/snap-in.jpg


In der MMC hat man nun die Richtlinienverwaltung und kann nun Richtlinien erstellen bzw. verwalten. Die Richtlinien kann man allerdings nur OUs zuweisen und nicht den Benutzergruppen. Warum sie Gruppenrichtlinien heissen ist mir ein kleines Rätsel.
http://images.t-error.ch/blog/554/mmc.jpg


Wie auch immer, als Beispiel erstellte ich eine Richtlinie die den Zweck hat, in der Systemsteuerung die klassische Ansicht zu erzwingen. Mit der neuen Kategorien-Ansicht vom Windows XP kann man ja nichts anfangen. So erstellt man eine neue Richtlinie und weist sie einem Container (OU, oder gleich der Domäne) zu.
Nun sucht man sich die Einstellungen die man verändern will. In meinem Fall nun wie gesagt die klassische Ansicht der Systemsteuerung. Diese findet man hier:
Benutzerkonfiguration -> Administrative Vorlagen -> Systemsteuerung

http://images.t-error.ch/blog/554/systemsteuerung.jpg


In den Eigenschaften stellt man den Schalter auf Aktiviert.
http://images.t-error.ch/blog/554/systemsteuerung_klassisch.jpg


An einem Client sollte man noch schnell einen Test machen, ob es klappt. Also in der Systemsteuerung zur Kategorien-Ansicht wechseln, Systemsteuerung schliessen und die Gruppenrichtlinien mit dem folgenden Befehl neu laden:
gpupdate /force
Wenn man nun die Systemsteuerung wieder öffnet sollte die klassische Ansicht verwendet werden.

Aber auch hier hat sich Microsoft einen kleinen Patzer erlaubt:
http://images.t-error.ch/blog/554/fehler.jpg

Zu finden unter:
Benutzerkonfiguration -> Administrative Vorlagen -> Windows-Komponenten -> Internet Explorer -> Internetsystemsteuerung -> Seite "Erweitert"

José Active-Directory-Dokumentation

Mit der Active Directory hat man unter Windows Servern ein mächtiges Wekrzeug, mit dem man fast alles verwalten kann. Dies hat natürlich auch seine Kehrseiten, so kann man, trotz einer guten Struktur, schnell die Übersicht verlieren.

José ist ein kleines Tool, welches mithelfen kann, die Übersicht zu bewahren. José kann man gratis als ZIP Datei herunterladen. Im Archiv befindet sich eine hta (HTML Application) Datei und mehrere Bilder. Mit einem Doppelklick auf die hta Datei startet man José.
http://images.t-error.ch/blog/543/jose_01.jpg

Auf der linken Seite wird nun die Active Directory Struktur dargestellt und auf der rechten Seite hat es jede Menge Checkboxen. Damit kann man den Report, den man haben will recht genau definieren. Will man nur eine Übersicht der Benutzer, alle Drucker, oder doch gleich alle Informationen die man kriegen kann? Mit einem klick auf "Jetzt dokumentieren" wird in Sekundenschnelle ein HTML Report generiert, in welchem die gewünschten Daten ersichtlich sind.
http://images.t-error.ch/blog/543/jose_02.jpg


José stellt zwar nicht Grafisch dar, welcher Benutzer in welcher Gruppe ist, aber eine Auflistung bringt auch schon eine gute Übersicht. Für ein Tool das gratis ist und nur gerade 103 KB gross ist, bietet José aber doch einen guten Mehrwert.

Access-based Enumeration

Im MCSA Kurs vom letzten Samstag wurden wir auf die Windows Server 2003 Access-based Enumeration aufmerksam gemacht. Ich habe dies nun auf unserem Server installiert und möchte nun kurz etwas darüber schreiben.

Was ist die Access-based Enumeration

Manche kennen es ja sicher schon, denn neu ist es nicht. Access-based Enumeration ist ein Programm, welches man auf einem Windows 2003 Server installieren kann . Damit ist es möglich Ordner, auf die ein Benutzer keinen Zugriff hat zu verstecken. Um zu erklähren wie das geht mache ich hier ein kleines Beispiel:
Angenommen eine Firma hat einen Share namens GROUP und darin mehrere Ordner. Einer davon heisst Buchhaltung und darauf hat natürlich nicht jeder Benutzer Zugriff. Trotzdem sieht jeder Benutzer, der den Share GROUP öffnet diesen Ordner. Access-based Enumeration setzt genau dort an. Ist es auf dem Share GROUP aktiviert sehen nur Benutzer, die auch Zugriff auf diesen Ordner haben den Ordner. So wird es wohl einige "Zugriff verweigert" Meldungen weniger geben. Zudem ist es auch Sicherheitstechnisch interessant, denn "Was ich nicht weiss, macht mich nicht heiss". Ein Benutzer versucht kaum einen Ordner zu öffnen, den er nicht sieht.

Installation

Die Installation ist wirklich sehr simpel. Als erstes muss man die Installatrionsdatei herunterladen. Nun kann man die MSI Datei auf dem Server ausführen und den Anweisungen folgen.
http://images.t-error.ch/blog/542/install.jpg


Konfiguration

Die Access-based Enumeration kann man nur auf einem Netzwerk-Share ein- oder ausschalten. Das Konfigurationsfenster öffnet man mit einem Rechtsklick auf einen Share und dann Eigenschaften, Access-based Enumeration. Dort kann man es nun ein- bzw. Ausschalten. Das war es auch schon mit der Konfiguration. Mit einer zweiten Checkbox kann man die Einstellung noch für alle Shares auf dem Server übernehmen.
http://images.t-error.ch/blog/542/config.jpg


Demo

Bei mir hat alles wunderbar geklappt. Die Benutzer sehen nun nur noch die Ordner, die auf denen sie auch Leseberechtigungen haben. In meiner Meinung ein sehr praktisches Tool.

Vorher:
http://images.t-error.ch/blog/542/enumeration_01.jpg


Nachher:
http://images.t-error.ch/blog/542/enumeration_02.jpg

Benutzerauthentifizierung mit PHP an einem LDAP Server

Vor längerer Zeit habe ich hier schonmal geschrieben, dass ich an einer PHP Applikation im Geschäft Arbeite. Lieder bin ich da in der letzten Zeit kaum dazugekommen, aber jetzt sieht es doch wieder etwas besser aus.

Diese Applikation hat auch einen geschützten Bereich, wo man sich anmelden muss. Nun wäre es möglich die Benutzerdaten in einer Datenbank zu speichern. Das hätte aber den Nachteil, dass die Benutzer an mehreren Orten verwalten müsste. Nämlich in der mySQL Datenbank und in der Active Directory von unserem Windows 2003 PDC. In der AD müssen die Benutzer ja zwangsläufig gespeichert werden, warum also nicht diese Benutzer zur Authentifizierung in der PHP Applikation verwenden.

Mit LDAP funktioniert das recht einfach, denn wenn man sich mit einem Benutzer über LDAP am PDC anmelden kann, hat man einen gültigen Account. So sieht es in der Theorie aus.

Die Praxis ist da recht ähnlich. Zuerst muss man die LDAP Befehle installieren. Unter Ubuntu funktioniert das so:
sudo apt-get install php5-ldap

Ich habe dann ein kleines Script gebastelt, welches eine Verbindung zum Server herstellt und sich dann versucht einzuloggen. Das sieht so aus:
<?
$conn
=ldap_connect("server")or die("could not connect to the server");

if(@
ldap_bind($conn,"domain\username","password"))
{
    echo 
"login ok";
}
else
{
    echo 
"login falsch";
}

ldap_close($conn);
?>


Wichtig ist, dass man den Benutzernamen im Format domain\username angibt.

Mit Outlook auf Adressen in der Active Directory zugreifen

Mit Outlook hat man die Möglichkeit auf die Adressdaten einer Active Directory zuzugreifen. Da das ganze über LDAP läuft, ist das relativ simpel. Von Vorteil ist dies, wenn man Adressdaten zentral speichern will aber keinen Exchange Server hat.

Ich erkläre hier wie man mit einem Outlook 2002 auf die Active Directory von einem Windows 2003 Server zugreift. Ich denke, bei anderen Version sieht es ähnlich aus.

Dazu muss man ein neues Adressbuch erstellen. Dies macht man über Extras -> E-Mail-Konten. Nun wählt man "Ein neues Verzeichnis oder Adressbuch hinzufügen" an und klickt auf weiter. Beim nächsten schritt wählt man den "Internetverzeichnisdienst (LDAP)" an und klickt wieder auf weiter.
Jetzt hat man die Möglichkeit den Servernamen anzugeben. Zudem muss man die Anmeldeinformationen angeben. Idealerweise im Format domain\user.
http://images.t-error.ch/blog/516/outlook_ldap_server.jpg


Nun muss man noch weitere Einstellungen angeben. Unter Verbindung kann man den Anzeigenamen und den Port angeben. Mit dem Port 389 klappt es bei mir ohne Probleme.
http://images.t-error.ch/blog/516/outlook_ldap_name_port.jpg


Unter Suche gibt man nun an, wo die Adressdaten abgelegt sind. Je nachdem wie man die AD organisiert hat, sieht das halt etwas anders aus. Auf jeden Fall, muss man die Suchbasis im LDAP Stil angeben.
http://images.t-error.ch/blog/516/outlook_ldap_search.jpg


Wenn man das gemacht hat, kann man das Adressbuch öffnen und rechts oben bei "Namen anzeigen aus" das richtige Adressbuch auswählen. Dann sollten alle Adressen angezeigt werden.

Leider funktioniert das nicht Bidirektional. Das heisst, man kann keine Kontakte im Outlook erfassen, auch wenn die Berechtigungen stimmen. Zudem gibt es keine Möglichkeit die Adressen in Ordner zu fassen. Auch wenn man in der AD Organisationseinheiten (OUs) erstellt, werden die Adressen im Outlook in einer Liste dargestellt. Aber vielleicht, gibt es doch eine andere Lösung.

Adminpak: MMC für Windows XP

Einen Windows 2003 Server verwaltet man ja am einfachsten über die MMC (Mickey Mouse Club Microsoft Management Console), welche auf dem Server installiert ist. Nun möchte man aber nicht immer an den Server gehen und dort arbeiten, oder Remote auf dem Server arbeiten. Am besten installiert man einfach die MMC auf dem eigenen Computer. Das ganze ist recht simpel, denn man muss nur das Microsoft Administrartion Tools Pack installieren. Entweder aus dem Internet oder von der Windows 2003 im i386 Ordner. Einfach die adminpak.msi Datei installieren.

Schon kann man die gewünschten Snap-Ins hinzufügen und bequem vom eigenen Arbeitsplatz aus den Server verwaltet. So werden auch die ds-Befehle (dsadd, dsmove, dsremove usw.) installiert.
http://images.t-error.ch/blog/515/mmc.jpg

Erster MCSA Kurstag

http://images.t-error.ch/blog/511/mcsa.gifVor längerem habe ich es bereits angetönt und heute war es soweit. Der Berufsbegleitende MCSA Kurs hatte begonnen.
Heute ging es noch recht einfach zu und her. Anfangs eine Vorstellungsrunde. Wir sind nun insgesamt neun Teilnehmer. Einige hängen danach gleich den MCSE an, ich möchte diesen auch noch machen, allerdings nicht gleich danach. Vor allem da im Sommer bei uns im Geschäft wieder Hochsaison ist und daneben noch so einen Kurs zu machen, wäre mir etwas zu viel.
Als Unterlagen haben wir ein Riesenbuch mit vielen Übungen erhalten und eine Windows 2003 Server CD. Weiter gehts am Samstag in drei Wochen und dann bis ende Jahr jeden zweiten Samstag. Ich bin gespannt wie es weiter geht.