Archive for the ‘Programmierung’ Category.

Mit Powershell das Active Directory abfragen

Die heutige Aufgabe in Sachen Powershell war, diverse Informationen zu ACLs (Access Controll Lists) aus dem AD auszulesen. Diverse Personen wie die Zertifizierer der Gruppe sind in Feldern wie „Mail“ und „Info“ abgelegt, diese sollen in eine Excel-Liste exportiert werden.

Die folgenden Artikel waren hilfreich, um den Code zusammenzubauen:

Nachtrag vom 09.01.2013: Der unten stehende Code hat nur 1000 Zeilen abgefragt, durch das Einfügen von $searcher.pagesize=1000 ist diese Grenze aufgehoben.

# Uwe Ziegenhagen, 21.12.2012
# Path for the CSV file to be written to
 
$outputpath = "d\groups.csv"
 
# some AD stuff
$root = [ADSI]''
# initialize the AD searcher
$searcher = new-object System.DirectoryServices.DirectorySearcher($root)
# which groups shall be returned
$searcher.filter = "(&(objectClass=group) (CN=some-group-name*))"
$searcher.pagesize=1000
 
# need to add the variables that shall appear in the result
$searcher.PropertiesToLoad.Add("cn");
 
$searcher.PropertiesToLoad.Add("description");
$searcher.PropertiesToLoad.Add("mail");
$searcher.PropertiesToLoad.Add("info");
 
# call the finder
$adfind = $searcher.findall()
 
# first line of the output file
"Group`tDescription`trole1`trole21`trole22`trole23"  | out-file $outputpath -Width 300
 
foreach ($i in $adfind ) {
   # get the properties from the search result
   $name = "" + $i.properties.item("cn")
   $description = "" + $i.properties.item("description")
   $role1 = "" + $i.properties.item("info")
 
   # some entries include garbage like 'contact:' instead of the pure name
   # to get rid of whitespace I then trim everything
   $role1= $role1.replace("contact:","").trim()
 
   $role2 = "" + $i.properties.item("mail")
   # there are up to 3 role2s, split this entry into different columns
   $role2 = $role2.replace(",","`t")
 
   # create line
   $line = $name + "`t" + $description + "`t" + $role1  + "`t" + $role2 
   # replace carriage-returns
   $line.replace("`n","");
   # write line to file
   $line | out-file -append $outputpath -Width 300
}

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website

Unterschiedliche Kopfzeilen in MS Word

Im Vergleich zu LaTeX ist Word natürlich Mist (obwohl es schon besser geworden ist), aber beruflich muss ich halt damit arbeiten. Hier ein Tipp, wie man unterschiedliche Kopfzeilen in einem Dokument nutzen kann: http://mstechnology.wordpress.com/2009/08/17/unterschiedliche-kopfzeilen-in-einem-dokument-mit-word-2007/.

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website

Namen zerlegen mit Excel

Nachdem mich am Freitag mal wieder die Frage erreichte, wie man mit Excel Namen der Form „Nachname Vorname“ in Vor- und Nachnamen zerlegen kann, hier ein kleines Tutorial.

MustermannMax.xlsx

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website

Webseiten parsen mit Python

Hier ein kurzes Beispiel, wie man mittels Python und BeautifulSoup Texte aus Webseiten extrahieren kann.

import urllib2
from BeautifulSoup import BeautifulSoup
 
# http://stackoverflow.com/questions/1752662/beautifulsoup-easy-way-to-to-obtain-html-free-contents
def textOf(soup):
    return u''.join(soup.findAll(text=True))
 
soup = BeautifulSoup(urllib2.urlopen('http://www.fmylife.com/').read())
 
for item in soup.findAll('div', attrs={'class': 'post article'}):
    item = textOf(item)
    print item[:item.find("FML#")]

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website

XML Feeds parsen mit Python 2

Hier ein kurzes Beispiel, wie man mit Python XML Dateien parsen kann. Yahoo Developer hatte dazu einen guten Artikel. Der Datensatz der ECB ist zwar ziemlich doof, da hier mehrere CUBE Tags ineinander verschachtelt sind, dies stellt mit der hier genutzten Herangehensweise kein Hindernis dar.

import xml.etree.ElementTree as ET
import urllib2
 
root = ET.parse(urllib2.urlopen('http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml')).getroot()
 
for child in root[2][0]:
    #print child.tag
    #print child.attrib
    curr = child.get('currency')
    rate = child.get('rate')
    print curr, rate

UPDATE for Python 3 and pandas: https://www.uweziegenhagen.de/?p=4569.

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website

RSS Feeds parsen mit Python II

Hier eine Erweiterung des ersten Beispiels, das eine LaTeX description Umgebung erzeugt und diese (mittels Tkinter) auch in die Zwischenablage kopiert.

import feedparser
from Tkinter import Tk

# clipboard stuff
r = Tk()
r.withdraw()
r.clipboard_clear()

url = 'http://feeds.feedburner.com/fmylife'
d = feedparser.parse(url)
 
number_entries =  len(d['entries']) - 1
 
head = "\\begin{description}\n"
print head
r.clipboard_append(head)

for i in range(0,number_entries):
    entry = d['entries'][i].summary + "\n" 
    FMLloc = entry.find("FML<")
    item = "\\item[" + str(i+1) + "] " + entry[:FMLloc] + "\n"
    print item
    r.clipboard_append(item)
    
foot = "\\end{description}\n"
print foot
r.clipboard_append(foot)

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website

RSS Feeds parsen mit Python

Hier ein kurzes Beispiel, wie man mit Python und dem Feedparser Modul RSS Feeds parsen kann.

import feedparser
url = 'http://feeds.feedburner.com/fmylife'
d = feedparser.parse(url)
 
size =  len(d['entries']) - 1
 
for i in range(0,size):
    entry = d['entries'][i].summary + "\n" 
    FMLloc = entry.find("FML<")
    print entry[:FMLloc]

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website

Namen zerlegen mit Excel

Vor ein paar Tagen hatte ich die Aufgabe, Namen der Form „Mustermann Max und Manuela“ in die einzelnen Bestandteile zu zerlegen, um die Namen der einzelnen Ehepartner getrennt ausgeben zu können. Es wäre zwar einfacher gewesen, ein entsprechendes VBA Makro zu schreiben, das die vier Werte zurückliefert, die Lösung wollte ich aber nur mit Formeln bauen. Die folgenden vier Formeln wurden für die Lösung genutzt:

  • Länge("Zelle"): Gibt die Länge des Inhalts einer Zelle aus, als z.B. 5, wenn eine Zelle „abcde“ enthält.
  • Links("Zelle"; "Zeichen"): Gibt vom Zellinhalt in „Zelle“ die linken „Zeichenzahl“ Zeichen zurück.
  • Rechts("Zelle"; "Zeichen"): Gibt vom Zellinhalt in die rechten „Zeichenzahl“ Zeichen zurück.
  • Finden("Suchtext","Zelle",[Startposition]): sucht den Inhalt von „Suchtext“ in Zelle „Zelle“. Optional kann über [Startposition] angegeben werden, ab welchem Zeichen die Funktion mit dem Suchen beginnen soll.

Mit der Kombination dieser vier Formeln können wir jetzt die Zeichenkette bearbeiten:

Mustermann

Das „Mustermann“ zu isolieren ist noch relativ einfach: Zum Nachnamen gehört alles bis zum ersten Leerzeichen. Das Leerzeichen finden wir dynamisch, indem wir mittels Finden() danach suchen. Als Formel erhalten wir (wenn der komplette Name in Zelle B3 steht):

=LINKS(B3;FINDEN(" ";B3))

Max

Um den „Max“ aus der Zeichenkette zu extrahieren, gibt es verschiedene Möglichkeiten. Neben der gleich vorgestellten könnten wir auch mittels wechseln() das „Mustermann“ aus dem String löschen und dann die oben genutzte Formel nutzen. Ich mache es jedoch ein wenig anders, indem ich nach dem zweiten Leerzeichen suche und mir mit Links() den Text links davon zurückgeben lasse:

=LINKS(B3;FINDEN(" ";B3;1+FINDEN(" ";B3)))

Ich nutze dabei die Tatsache, dass ich Finden() mitgeben kann, an welcher Stelle es denn mit der Suche beginnen soll. Und diese Stelle ist genau die Position des ersten Leerzeichens plus 1.

Jetzt habe ich „Mustermann Max“ in einer Zelle. Nun kann ich a) die Länge dieser Zeichenkette bestimmen, b) das Leerzeichen suchen und c) aus der Differenz zwischen Länge und Fundort die Anzahl der Zeichen ermitteln, die ich von rechts entnehmen muss:

=RECHTS(D3;LÄNGE(D3)-FINDEN(" ";D3))

Manuela

Der einfachste Weg, das „Manuela“ zu extrahieren, wäre über eine VBA Funktion, die die Zeichenkette umdreht, dort das dann erste Leerzeichen sucht und den entsprechenden Text zurückgibt. Geht aber auch kompliziert, in diesem Fall auch ohne Hilfsspalte.

Wie eben schon nutze ich Rechts() um den String zu extrahieren. Ich nutze aber eine dreifach verschachtelte Finden() Funktion, um das dritte Leerzeichen zu ermitteln. Alles, was rechts vom dritten Leerzeichen steht, ist unser gesuchter Name.

=RECHTS(B3;LÄNGE(B3)-FINDEN(" ";B3;1+FINDEN(" ";B3;1+FINDEN(" ";B3))))

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website

Reports erzeugen mit Powershell

Heute bekam ich von einer Leserin meines Blogs folgendes Powershell Skript zugesandt, das alle Bilder größer 1MB sucht in in einer HTML Datei auflistet, die dann verschickt wird.

Vielen Dank an Andrea!

"
$a = $a + "BODY{background-color:#ffffff;}"
$a = $a + "TABLE{border-width: 1px;border-style: solid;border-color: black;border-collapse: collapse;}"
$a = $a + "TH{border-width: 1px;padding: 0px;border-style: solid;border-color: black;background-color:grey}"
$a = $a + "TD{border-width: 1px;padding: 0px;border-style: solid;border-color: black;background-color:#ffffff}"
$a = $a + ""

gci "C:\Users\Uwe\" -recurse -include *.jpg,*.bmp,*.png | Where-Object {$_.Length -gt 1000KB} |
? { $_.PSisContainer -eq $false} |
Sort-Object length -descending | Select-Object Name, @{Name="Kbytes";Expression={ "{0:N0}" -f ($_.Length / 1Kb) }}, DirectoryName, CreationTime | ConvertTo-HTML -head $a -body "

Grosse Bilder

" | out-file "C:\report.htm" #Send Email $msg = $null $smtpServer = "0.0.0.0" $workpath = “\\Server\Share\Verzeichnis” $file = “$workpath\report.htm” $msg = new-object Net.Mail.MailMessage $att = new-object Net.Mail.Attachment($file) $smtp = new-object Net.Mail.SmtpClient($smtpServer) $msg.From = "sender@domain.com" $msg.To.Add("empfaenger@domain.com") #$msg.To.Add("empfaenger2@domain.com") $msg.Subject = "Bilder Report" $msg.IsBodyHTML = $true $html = "Report der Bilder" $msg.Body = $html $msg.Attachments.Add($att) $smtp.Send($msg)

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website

Erste Schritte mit cakePHP

Vor ein paar Tagen habe ich mir mal cakePHP angeschaut, ein MVC Framework für PHP. Bei der Entwicklung von Web Anwendungen ist es – so finde ich – echt lästig, jedes bisschen an Code selbst zu schreiben. Um für die eigentliche Anwendung unwichtige Dinge wie User Authentifizierung etc. will ich mich nicht kümmern, ich möchte maximal festlegen, aus welcher Tabelle in der Datenbank die Login/Passwort Kombinationen gelesen werden sollen.

Mit cakePHP kommt man anscheinend recht einfach zu den entsprechenden Resultaten. Auf einem existierenden Xampp aufsetzend hat die Konfiguration von cakePHP knappe fünf Minuten gedauert. Das Abarbeiten der einzelnen Schritte aus dem Tutorial von http://book.cakephp.org/1.3/view/1528/Blog hat dann eine knappe halbe Stunde gedauert.

Interessant war insbesondere die Nutzung von Scaffolding. Basierend auf einem Datenbank-Modell reichen fünf Zeilen aus, um eine komplette Anwendung mit Anlage, Bearbeitung und Löschung von Datensätzen zu erhalten. Muss jetzt mal ein paar Handbücher lesen…

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website