windows-explorer-delete-saved-ftp-password-credentials-userdata
FTP Accounts/Passwörter des Windows Explorers löschen:
Registry (regedit.exe) starten und nach

HKEY_CURRENT_USER/Software/Microsoft/FTP/Accounts/[server]/[account]

ausschau halten.
Für ein Passwort Reset (zum Beispiel wenn „Passwort speichern“ aktiv aber neues Passwort) den „Password“ Datensatz in [account] löschen.
Um den kompletten Account mit allen Daten zu löschen entweder [server] komplett oder [account] löschen.

Batch Löschtaktiken

Nur Unterordner eines Zielordners löschen:

for /D %%a in ("zielordner\*.*") do rd /q /s "%%a"

Nur Dateien eines Zielordners löschen, Unterordner (+Inhalt) nicht löschen:

del zielordner\*.* /q

Gesamten Inhalt eines Ordners löschen:
Entweder löscht man den gesamten Ordner und erstellt ihn leer neu:

rd zielordner /s /q && md zielordner

oder man leer den Inhalt ohne den Ordner selbst anzufassen:

del zielordner /s /f /q
for /D %%a in ("zielordner\*.*") do rd /q /s "%%a"

Falschen Produkt Key in Office 2007 eingegeben? Nachträglich doch einen anderen Key nutzen? Aktivierung funktioniert nicht richtig oder nimmt den Key nicht an?
Ein Reset des Produkt Keys in Office 2007 ist total easy.

  1. Schließt alle Office Programme.
  2. Öffnet die Registry („regedit.exe“) und sucht dort nach
    [plain]
    64bit: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\12.0\Registration
    32bit: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\Registration
    [/plain]
  3. Öffnet den darin enthaltenen Schlüssel, der entweder so aussehen dürfte: {91120000-00CA-0000-0000-0000000FF1CE}
    oder so: {90120000-0030-0000-0000-0000000FF1CE}
  4. Löscht die darin enthaltenen Einträge DigitalProductID und ProductID

office2007-product-key-reset-registry

Fertig. Beim nächsten Start eines Office Programms muss ein neuer Lizenzschlüssel eingegeben werden.
Es soll auch relativ einfach sein Office 2007 ohne Produkt Schlüssel zu aktivieren. Das habe ich aber nicht getestet und werde es hier auch nicht beschreiben. Siehe hier.

Update:

Download

Ich habe euch sogar 2 einfache .reg Dateien erstellt, die genau das tun: diese 2 Keys löschen. Einmal für 64bit und einmal für 32bit. Doppelklick während alle Office Programme geschlossen sind, fertig!
delete-office2007-activation-64bit [.reg]
delete-office2007-activation-32bit [.reg]
(Rechtsklick -> [Link/Ziel] speichern unter…)

Als Hobby-Webentwickler und fanatischer Batch Scripter musste das Thema Batch HTML Reports ja irgendwann mal kommen. Heißt: Batch führt irgendwelche Aktionen aus und visualisiert das Ergebnis in einer schönen HTML Datei.

Eigentlich straight forward: in der Batch Datei wird ein

echo

mit HTML Code in eine .html Datei umgeleitet, fertig. Naja, ganz so einfach ist es leider nicht.
Hier ein Beispiel:

echo "<html><body>" > t.html
echo "Ein Test " >> t.html
echo "<span>Fehlerlevel: %errorlevel%</span>" >> t.html
echo "</body></html>" >> t.html

Ergebnis:
html-berichte-mit-batch-problem-einfaches-beispiel

Der Batch

echo

Befehl würde an eckigen Klammern und Slashes abstürzen, daher muss jeglicher HTML Code in Anführungsstrichen eingebettet werden. Leider schreibt Batch diese Anführungszeichen mit in das Dokument.
Nun gibt es sicherlich einige Lösungsansätze:

1. (nicht empfohlen) Alle Sonderzeichen escapen und Anführungszeichen weglassen:

echo ^<html^>^<body^> > t.html
echo Ein Test  >> t.html
echo ^<span^>Fehlerlevel: %errorlevel%^<^/span^> >> t.html
echo ^<^/body^>^<^/html^> >> t.html

Alle Sonderzeichen, die den Batch

echo

Befehl in die Knie zwingen würden, werden mit dem Escapezeichen ^ neutralisiert. Funktioniert, but… seriously? Ich hoffe aber niemand denkt ernsthaft darüber nach diese Technik zu verwenden…

2. (nicht empfohlen) HTML Code nicht über das Batch sondern über eine externe Komponente schreiben:
Wenn Batch ungern HTML schreibt könnte man auch ein externes Programm oder Script aufrufen und den gewünschten HTML String irgendwie übergeben. Klingt aber schon im Ansatz irgendwie uncool.

3. HTML mit Anführungszeichen schreiben und diese dann rausfiltern:
Also so mache ich das zumindest!
Der HTML Code wird wie im Beispiel oben geschrieben und danach nutze ich mein Zeichen-suchen-und-ersetzen-vbs-Script aus dem letzten Artikel und filtere die Anführungszeichen raus.
Batch:

echo "<html><body>" > t.html
echo "Ein Test " >> t.html
echo "<span>Fehlerlevel: %errorlevel%</span>" >> t.html
echo "</body></html>" >> t.html

cscript //nologo deleteChar.vbs "t.html" "t-neu.html"

deleteChar.vbs:

Set objFSO = CreateObject("Scripting.FileSystemObject")
Const ForReading = 1
Const ForWriting = 2
' Parameter einlesen
inputFile = WScript.Arguments(0)
outputFile = WScript.Arguments(1)

' Datei öffnen und Text einlesen und schließen
Set objFile = objFSO.OpenTextFile(inputFile, ForReading)
strText = objFile.ReadAll
objFile.Close

' Anführungszeichen rauslöschen
strNewText = Replace(strText, """", "")

' Neue Datei erstellen mit neuen Inhalten füllen
set resultFile = objFSO.CreateTextFile(outputFile, true)
resultFile.WriteLine strNewText
resultFile.Close

Resultat:
html-berichte-mit-batch-vbs-workaround


Ping Test HTML Report

Nun kann ich also HTML schreiben. Der Weg zum schönen HTML Bericht ist aber noch nicht geschafft. Ich empfehle einen gewissen Projekt-Aufbau um bessere HTML Berichte zu erstellen.
Vorschlag:

  • vorlage.html – enthält bereits ein halbes HTML Gerüst
  • style.css – für das Design
  • script.bat – das Script
  • deleteChar.vbs – siehe oben, löscht die Anführungszeichen
  • temp.html – temporär für die Batch
  • report.html – fertiger Report nachdem deleteChar.vbs die temp.html bearbeitet hat

Batch:

Color 9f
@echo on
setlocal

REM Vorlage nach temp.html kopieren, damit der HTML Code nicht jedes Mal komplett
REM geschrieben werden muss. Vor allem wenn der <head> und der Aufbau größer ist.
REM Kann alles schon fertig in die vorlage.html geschrieben werden.
cmd /c echo d | xcopy "vorlage.html" "temp.html" /c /v /i /y

REM optionaler Timestamp
echo "<span id="timestamp">%date% %time%</span>" >> "temp.html"

REM Bericht füllen, Code from: http://stackoverflow.com/a/3870183/516047
for /f "tokens=1,2 delims=[]" %%a IN ('ping -n 1 www.google.de') DO (
 if "%%b" NEQ "" set ip=%%b
)
echo "<div class='computer'><span class='name'>www.google.de</span><span class='comment'>IP: %ip%</span></div>" >> temp.html

for /f "tokens=1,2 delims=[]" %%a IN ('ping -n 1 www.microsoft.com') DO (
 if "%%b" NEQ "" set ip=%%b
)
echo "<div class='computer'><span class='name'>www.microsoft.com</span><span class='comment'>IP: %ip%</span></div>" >> temp.html

for /f "tokens=1,2 delims=[]" %%a IN ('ping -n 1 www.facebook.de') DO (
 if "%%b" NEQ "" set ip=%%b
)
echo "<div class='computer'><span class='name'>www.facebook.de</span><span class='comment'>IP: %ip%</span></div>" >> temp.html

for /f "tokens=1,2 delims=[]" %%a IN ('ping -n 1 www.hannes-schurig.de') DO (
 if "%%b" NEQ "" set ip=%%b
)
echo "<div class='computer'><span class='name'>www.hannes-schurig.de</span><span class='comment'>IP: %ip%</span></div>" >> temp.html

for /f "tokens=1,2 delims=[]" %%a IN ('ping -n 1 http://studium.hannes-schurig.de') DO (
 if "%%b" NEQ "" set ip=%%b
)
echo "<div class='computer'><span class='name'>http://studium.hannes-schurig.de</span><span class='comment'>IP: %ip%</span></div>" >> temp.html

echo "</div><!--#wrapper--></body></html>" >> "temp.html"

REM Anführungszeichen aus der temp.html löschen und in report.html schreiben
cscript //nologo "deleteChar.vbs" "temp.html" "report.html"

REM temp.html löschen
if exist temp.html del /f /q temp.html

:end
endlocal

vorlage.html:

<!DOCTYPE html>
<html lang='de'>
  <head><title>PC Monitor</title><link rel='stylesheet' type='text/css' href='style.css' /></head>
  <body>
  <div id='wrapper'>

Ergebnis:
html-berichte-mit-batch-fertiger-bericht

Download

Ping HTML Report Beispiel herunterladen
html-berichte-mit-batch-aufbau

Hier ein weiteres Beispiel, wie ich mit einigen zusätzlichen Programmierungen (Download gibts auf Anfrage) die Konnektivität von Arbeitsrechnern überprüfe und anzeigen lasse:
html-bericht-mit-batch-computer-status-report

Ziel ist es in einer beliebigen Datei – der Inhalt sollte aber schon irgendeine Art von Text sein – scriptgesteuert Text oder Zeichen suchen und ersetzen zu können; und zwar ohne Installation von Tools wie grep/sed sondern nur mit dem Script.
Eine pure Batch-Lösung halte ich für zu riskant, da Batch mit zu vielen Sonderzeichen Schwierigkeiten hat. Statt dessen greifen wir auf ein einfaches .vbs Script zurück.

Für Einsteiger: VBS (Visual Basic Script) Scripts sind Batch Scripts sehr ähnlich. Es ist praktisch nur Text in einer Datei mit der Dateiendung .vbs. Ausgeführt werden .vbs Scripts mit folgendem Code aus der CMD heraus, ggf. mit Parametern:

cscript //nologo script.vbs "parameter1"

zeichen-einfachen-text-suchen-ersetzen-vbs-batch-vbs-execution
VBS Scripts, im Vergleich zu Batch, laufen allerdings etwas stabiler, liefern notfalls Fehlermeldungen und bieten auch mehr Features. An dieser Stelle nutzen wir also diese Vorteile aus.

Hier der Code für ein einfaches .vbs Script zum Auslesen einer Datei, Suchen und Ersetzen 3 verschiedener Zeichen/Texte und Schreiben in eine andere Datei:

Set objFSO = CreateObject("Scripting.FileSystemObject")
Const ForReading = 1
Const ForWriting = 2

' Datei öffnen und Text einlesen und schließen
Set objFile = objFSO.OpenTextFile("test.html", ForReading)
strText = objFile.ReadAll
objFile.Close

' Änderungen am Inhalt
strNewText = Replace(strText, """", "'")
strNewText = Replace(strNewText, "lang='de'", "lang='en'")
strNewText = Replace(strNewText, "Hannes Schurig", "Max Mustermann")

' Neue Datei erstellen mit neuen Inhalten füllen
set resultFile = objFSO.CreateTextFile("test-neu.html", true)
resultFile.WriteLine strNewText
resultFile.Close

Relativ straight forward. Hier ein Beispielresultat:
zeichen-einfachen-text-suchen-ersetzen-vbs-batch-simple-script

Für eine bessere Handhabung lässt sich nun dieses Script optimieren. Die Eingabe- und Ausgabedatei könnte man parametirisieren. Wenn immer nur 1 Sache ersetzt werden soll, sich diese aber während der Scriptlaufzeit ändert oder erst währenddessen entschieden wird, könnte man auch diese Daten als Parameter übergeben.

Hier der Code für ein komplexeres .vbs Script:

Set objFSO = CreateObject("Scripting.FileSystemObject")
Const ForReading = 1
Const ForWriting = 2
' Parameter einlesen
inputFile = WScript.Arguments(0)
outputFile = WScript.Arguments(1)
searchText = WScript.Arguments(2)
replaceText = WScript.Arguments(3)

' Datei öffnen und Text einlesen und schließen
Set objFile = objFSO.OpenTextFile(inputFile, ForReading)
strText = objFile.ReadAll
objFile.Close

' Änderungen am Inhalt
strNewText = Replace(strText, searchText, replaceText)

' Neue Datei erstellen mit neuen Inhalten füllen
set resultFile = objFSO.CreateTextFile(outputFile, true)
resultFile.WriteLine strNewText
resultFile.Close

Hier das Resultat:
zeichen-einfachen-text-suchen-ersetzen-vbs-batch-complex-script

Eigentlich recht easy. In meinem nächsten Beitrag werden ich dieses Script nutzen um mit Batch dynamische HTML Reports zu erstellen. Wait for it!

Mit einem PowerShell Script möchte ich alle Login/Logoff basierten Events eines Computers auflisten und gut lesbar in eine Textdatei schreiben. In meinem konkreten Fall filtere ich nur das Entsperren heraus.

Hier das PowerShell Script:

# Connects to the security eventlog of a remote computer and retrieves successful login events ( event ID 528 ) and what type of login took place 
# Information about login types found at http://www.ultimatewindowssecurity.com/securitylog/encyclopedia/event.aspx?eventid=528 
# 
# 22.09.2009 Konráð Hall 
# 2013 - edited by Hannes Schurig for newer systems (vista/7/server 2k8) and filter in german/english
cls

"Starte Tool..."
 
$events =  Get-EventLog -ComputerName Hannes-PC -LogName "Security" -newest 1000 | Where { $_.eventid -eq 4624 }

# english: $logonTypeText = "Logon Type:    "
# german:
$logonTypeText = "Anmeldetyp:			"

"Starte Eventverarbeitung..."

foreach ($event in $events) {
    
    if (($event.message | Select-String $logonTypeText+"2")){ 
        "LogonType 2 (Interactive Login);"+ $event.TimeGenerated.DateTime + ";" +$event.UserName >> "C:\logins.txt"
    } <#
    if (($event.message | Select-String $logonTypeText+"3")){ 
        "LogonType 3 (Network Login)    ;"+ $event.TimeGenerated.DateTime + ";" +$event.UserName >> "C:\logins.txt"
    } 
    if (($event.message | Select-String $logonTypeText+"4")){ 
        "LogonType 4 (Batch Login)      ;"+ $event.TimeGenerated.DateTime + ";" +$event.UserName >> "C:\logins.txt"
    } 
    if (($event.message | Select-String $logonTypeText+"5")){ 
        "LogonType 5 (Service Login)    ;"+ $event.TimeGenerated.DateTime + ";" +$event.UserName >> "C:\logins.txt"
    } #>
    if (($event.message | Select-String $logonTypeText+"7")){ 
        "LogonType 7 (Computer Unlocked);"+ $event.TimeGenerated.DateTime + ";" +$event.UserName >> "C:\logins.txt"
    } <#
    if (($event.message | Select-String $logonTypeText+"8")){ 
        "LogonType 8 (Network Cleartext Login);"+ $event.TimeGenerated.DateTime + ";" +$event.UserName >> "C:\logins.txt"
    } 
    if (($event.message | Select-String $logonTypeText+"9")){ 
        "LogonType 9 (NewCredentials)   ;"+ $event.TimeGenerated.DateTime + ";" +$event.UserName >> "C:\logins.txt"
    } 
    if (($event.message | Select-String $logonTypeText+"10")){ 
        "LogonType 10 (RDP Login)       ;"+ $event.TimeGenerated.DateTime + ";" +$event.UserName >> "C:\logins.txt"
    } 
    if (($event.message | Select-String $logonTypeText+"11")){ 
        "LogonType 11 (Cached Credentials Login);"+ $event.TimeGenerated.DateTime + ";" +$event.UserName >> "C:\logins.txt"
    } #>
}

original script by Konrad Hall

Das, ursprünglich von Konrad Hall stammende, Script habe ich etwas angepasst. In Zeile 9 muss der gewünschte Computername eingefügt werden.

Um die Funktionsweise zu verstehen sollte man in Erfahrung bringen welche verschiedenen Anmeldeereignisse und Anmeldetypen es gibt und welche EventIDs sie haben. Es gibt unterschiedliche EventIDs in XP/Server<2k3 und Vista/7/Server>2k3.
Ein Beispiel: erfolgreiche Anmeldungen werden mit der EventID 528 in Server 2k3 und mit 4624 in Server 2k8 geloggt.
tecchannel schreibt zu den vielen IDs auch noch etwas.
Mit ultimatewindowssecurity.com lässt sich das aber überblicken. Meine Beispiele beziehen sich auf Windows 7.

Wenn man sich alle Events des Security Logs anzeigen lässt, ist das eine ganze Menge:
anmeldeereignisse-mit-PowerShell-auslesen-all-events

Es kommt also drauf an, was man loggen möchte. Dann kommt es drauf an, welche EventIDs dieses Event auslöst. Daraus bastelt man sich den EventID Filter.
Mit

| Where { $_.eventid -eq 4624 }

(528 bei XP/2k3) am Ende des Befehls filtere ich erfolgreiche Anmeldungen heraus:
anmeldeereignisse-mit-PowerShell-auslesen-all-logins-4624

Das gleiche geht bei Abmeldungen mit der EventID 4634 (538 bei XP/2k3):

| Where { $_.eventid -eq 4634 }

oder eine Art Range Filter für Login und Logoff:

| Where { $_.eventid -ge 4624 -AND $_.eventid -le 4634 }

anmeldeereignisse-mit-PowerShell-auslesen-logins-and-logoffs

Nun sind also alle Events gefiltert. Diese werden dann in dem Script ab Zeile 17 noch einmal gefiltert. Hier kommen die Anmeldetypen ins Spiel. Diese sind aber bei allen Windows Versionen gleich.
Beispiel: „Normale“ Anmeldungen haben den Typ 2, Netzwerkanmeldungen 3, Entsperren die 7.

An dieser Stelle könnt ihr das Script beliebig anpassen um nur einen oder bestimmte Anmeldetypen zu filtern.
In dem Beispielscript oben sind alle Anmeldetypen bis auf den normalen („interaktiven“) Login auskommentiert. Hier 2 Beispiellogs für Entsperrungen und Entsperrungen+Logins:
anmeldeereignisse-mit-PowerShell-auslesen-logs
Achtung! Auf englischen Systemen müsst ihr die Kommentierung von Zeile 11 und 13 vertauschen, da sonst die Filterung Exceptions schmeißt. Ich habe das ja schon soweit vorbereitet.

Mit diesen Grundlagen könnt ihr beliebig in den Computerlogs (es gibt ja nicht nur die Security Logs) lesen, filtern, exportieren und mehr.

Wenn ein frisch installiertes Betriebssystem erstmal fertig eingerichtet ist und perfekt läuft sollte man diesen Zustand im Notfall wiederherstellen können. Das Sichern von funktionierenden Treibern ist einer der Schritte, die man dafür regelmäßig durchführen sollte.

Double Driver ist klein, portable, kostenlos, einfach zu bedienen und besonders schnell!

Die Oberfläche ist besonders einfach und die Bedienung ist selbsterklärend:

Die Treiber des eigenen Systems sind in weniger als 1 Sekunde komplett geladen (zumindest bei mir). Irgendwie soll man auch andere Systeme scannen können; wie das geht habe ich aber noch nicht getestet.

Wie bei den meisten Treiber Backup Tools werden alle Systemtreiber gelistet aber nur die non-Microsoft Treiber ausgewählt. Diese Selektion ist schon am sinnvollsten, lässt sich bei Bedarf aber verändern. „All“, „None“, „Invert“ beschleunigen die Anpassung.

Die Treiber lassen sich als Ordner, als gezippte Ordnerstruktur oder als selbstentpackendes Archiv sichern. Treiber größerer Systeme können schon mal 100-200MB groß sein, die 2 ZIP Auswahlmöglichkeiten würde ich also empfehlen. Damit kann die Größte auf 40-80MB verringert werden. Das Wiederherstellen der Treiber ist ebenso simpel. Die Sicherung wird ausgewählt und alle gesicherten Treiber werden aufgelistet. Hier kann man dann entweder alle Treiber wiederherstellen oder einzelne Einträge deselektieren.

Das Tool ist dazu portable, muss also nicht installiert werden und funktioniert sofort auf jedem System, gerne auch vom USB Stick aus.

Super Freeware, Hut ab.
Das Sichern der Treiber funktioniert auch bei Windows 8. Ich gehe davon aus, dass auch die Wiederherstellung funktioniert. Probieren geht über studieren.