Kategorieauswahl

Windows

Wenn’s immer noch Microsoft sein muss…

MP3 Dateien reparieren

Mit dem MP3 Repair Tool können Sie defekte mp3 Dateien reparieren, die z.B. nicht vollständig abgespielt werden. Meist liegt dies an fehlerhaften ID3-Tags die durch dieses Werkzeug gelöscht werden.

Identity Management bei IIS 7.5 unter Windows Server 2008 auf einen Blick

Bei IIS 7.5 unter Windows Server 2008 R2 und auch bei IIS 7 ist es gar nicht so leicht zu durchblicken wann welcher Benutzer zur Authentifizierung und Autorisierung zum Einsatz kommt. Daher habe ich einmal ein Schaubild gezeichnet auf dem die Zusammenhänge der verschiedenen Einstellungen deutlich werden (wenn das Bild fehlt bitte auf die Artikel-Überschrift klicken):

Weitere Informationen zur Application Pool Identity bei IIS 7.5 finden Sie hier. Wie man den Zugriff auf UNC-Freigaben weiterleitet wird hier erklärt.

Soll ich bei IIS 7.x den Usermode-, oder den Kernelmodecache aktivieren, oder beide?

Die Antwort lautet wie üblich: Es kommt ganz darauf an! 😉

Fakten: Kernelmodecache ist schneller als Usermodecache, da ein Übergang in den Usermode immer viel Zeit kostet! Wenn ein Webserver im Normalfall ca. 550/s Anfragen schafft, so werden daraus bei aktiviertem Usermodecache ca. 650/s, bei Kernelcache 950/s. Aktiviert man bei geht er knapp über 1000/s. Allerdings hat man dafür nicht immer genug Speicherreserven.

Des Weiteren ist es davon abhängig wie IIS mit der jeweiligen Website arbeitet. Wird von der Webanwendung mehr im Usermode gearbeitet, ist es sinnvoller den Usermodecache zu aktivieren, arbeitet Sie mehr im Kernelmode, natürlich lieber den Kernelcache. Dazu muss man allerdings wissen, wie die jeweilige Webanwendung tickt. Das verrät der folgende Powershell-Befehl:

Get-WmiObject win32_process | ? {$_.caption -eq "w3wp.exe"} | select commandline,usermodetime,kernelmodetime | fl

Ausgabe sind alle Workerprozesse vom IIS. Dabei wird als erstes angezeigt, welcher Applicationpool sich hinter dem Workerprocess versteckt und danach folgen die Zeiten die er sich im User und im Kernelmode aufhält. Anhand dieser Zahlen kann man sehr schön festlegen, welche Cacheart die sinnvollere für den jeweiligen Applicationpool und den damit verknüpften Websites ist. Zugegeben ,man hätte das ganze noch viel eleganter Lösen können am besten gleich mit der automatischen Cachekonfiguration. Aber das war eben mal so auf die Schnelle Quick & Dirty eben ;-).

IIS 7.5 Webserverkennung ändern

Im Internet gibt es unzählige Beiträge wie man den HTTP-Responseheader beim IIS verändert, oder abschaltet. Diese Tipps funktionieren aber nur bei ältern IIS Webservern. Die Beispiele die ich für IIS 7.5 unter Windows Server 2008 R2 gefunden habe sind entweder wirkungslos oder produzieren nur Fehler. Hier die Lösung!

Installieren Sie, falls noch nicht vorhanden, den Rollendienst ASP.NET mit dem Servermanager. Legen Sie in Ihrem Webverzeichnis einen Ordner namens App_Code an ( keine Verhandlungen – das Verzeichnis muss so heißen!). In diesem Verzeichnis erstellen Sie eine Datei Namens Martins.ServerModules.RemoveServerHeaderModule.cs. In die Datei schreiben Sie mit Notepad folgenden Text:

using System;
using System.Text;
using System.Web; 
namespace Martins.ServerModules 
 { 
  public class RemoveServerHeaderModule : IHttpModule 
  { 
   public void Init(HttpApplication context) 
   { 
     context.PreSendRequestHeaders += OnPreSendRequestHeaders; 
   } 
   public void Dispose() 
   { } 
   private void OnPreSendRequestHeaders(object sender, EventArgs e)
   {
    HttpContext.Current.Response.Headers.Set("Server", "Apache");
   }
  }
 }

Dann fügen Sie in der IIS-Verwaltungskonsole für die Website in der Sie vorhin den Ordner App_Code erstellt haben ein verwaltetes Modul hinzu. Unter Name schreiben Sie etwas was Sie wiedererkennen also z. B. MartinsModul und unter Typ schreiben Sie den Dateinamen ohne die Dateinamenerweiterung, also: Martins.ServerModules.RemoveServerHeaderModule. Dämliche Rückfragen mit Ja beantworten und schon ist Ihr IIS angeblich ein Apache. Das was er da anmotzt behebt er automatisch.

Mit einem Netzwerksniffer sehen Sie nun in der Rückantwort vom Server statt:

Server: Microsoft-IIS/7.0\r\n

Server: Apache\r\n

Den Eintrag: X-Powered-By: ASP.NET\r\n werden Sie ganz einfach über HTTP-Antwortheader in der IIS-Verwaltungskonsole los. Das kann ja jeder ;-), aber etwas löschen was nicht da steht ist gar nicht so einfach!

 

Lösung zu Problemen mit unterschiedlichen DLL Versionen bei Windows Programmen

Manche haben immer noch nicht verstanden wie man ordentlich programmiert. Da werden einfach Änderungen an DLLs vorgenommen ohne Rücksicht auf anderen Programme. So kommt es dazu dass auf einem PC zwei Programme ablaufen müssen, die aber unterschiedliche DLL Versionen benötigen. Das geht eigentlich nicht, da die DLLs in den Standardsuchpfaden abgelegt werden und die sind nun mal für alle Programme unter Windows gleich. Es gibt aber eine Lösung zu dem Dilemma:

Sie können Programm bezogen Suchpfade definieren indem Sie in der Registry unter HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths einen neuen Unterschlüssel mit dem Namen der exe Datei anlegen. Also z. B. AcroRd32.exe für den Acrobat Reader. In den Standardschlüssel tragen Sie dann noch einmal den vollständigen Pfad zur exe Datei ein. Als Beispiel auch hier wieder der Acrobat Reader: C:\Program Files\Adobe\Reader 9.0\Reader\AcroRd32.exe. Nun erstellen Sie ein Verzeichnis und legen dort die verkorkste DLL Datei mit der benötigten Version hinein. Erstellen Sie einen weiteren RegSZ Eintrag mit dem Namen Path und als Wert tragen Sie den Pfad zu Ihrem eben erstellen Ordner mit der DLL Datei ein (z.B.: C:\Trouble\Acro – nicht den Namen der DLL Datei ergänzen!) . Nach einem Doppelklick auf das Programm sollte er Ihre besondere DLL Version nutzen und das Programm sollte problemlos laufen.

Datenbankzugriffe mit der Powershell

Leider bringt Powershell keine einfachen Cmdlets für den Zugriff auf Datenbanken mit. Die einzige Möglichkeit ist über ADO.NET zuzugreifen.

Vorbereitung

Je nach installierten Datenbankprovider gibt es verschiedene Möglichkeiten die unterschiedlichen Datenbanken (Access,MS-SQL,MY-SQL,Oracle,ODBC, etc…) zuzugreifen. Welche Provider überhaupt auf dem Computer registriert (z.B. Access installiert) sind können Sie mit:

[System.Data.Common.DBProviderFactories]::GetFactoryClasses() | select InvariantName

heraus finden. Falls Sie auf einen Microsoft SQL Server zugreifen möchten können Sie diese mittels:

[System.Data.Sql.SqlDataSourceEnumerator]::Instance.GetDataSources()

auflisten lassen.

Access Datenbank anlegen bzw. erstellen

Eine neue Datenbankdatei in Access legt man wie folgt an:

$application = New-Object -ComObject Access.Application
$application.NewCurrentDataBase("C:\Pfad\Datei.mdb",10)
$application.CloseCurrentDataBase()
$application.Quit()

Tabelle in Access Datenbank anlegen bzw. erstellen

$connection = New-Object -ComObject ADODB.Connection
$connection.Open("Provider= Microsoft.Jet.OLEDB.4.0;Data Source=C:\Pfad\Datei.mdb" )
$Fields = "NamederSpalte1 Counter, NamederSpalte2 Date, NamederSpalte3 Integer, NamederSpalte4 Text"
$command = "Create Table GewünschterNamederTabelle `($Fields`)"
$connection.Execute($command)
$connection.Close()

Die fett gedruckten Passagen geben wieder Ihre persönlichen Anpassungen an.

1. Den Pfad zur Access Datenbankdatei

2. Die Spalten bzw. Felder die angelegt werden sollen. Erst den Namen der jeweiligen Spalte und danach gefolgt der Datentyp (Counter=Zähler, Date=Datum, Integer=Zahl, Text=Text) für die Spalte.

3. Name der Tabelle

Verbindungsaufbau und Tabelle auswählen

So stellen Sie eine Verbindung mit einer Datenbank her und öffnen eine Tabelle:

# Angaben zur Verbindung mit der Datenbank
$Verbindung="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\Pfad zu Ihrer Datenbank\Datei.mdb;"
$SQL="Select * from tabelle order by Vorname"
# Tabelle aus der Datenbank in Variable ablegen
$DB=New-Object System.Data.OleDB.OleDbConnection($Verbindung)
# Öffnen der Tabelle
$DB.open()
"Tabelle: "+$DB.State
# Schließen der Tabelle
$DB.close()
"Tabelle: "+$DB.State
Dies ist ein Beispiel für den Zugriff auf eine Access-Datenbank. Die unterstrichenen Abschnitte müssen Sie entsprechend anpassen. Das order by Vorname können Sie auch komplett weg lassen. Dies dient lediglich zur Sortierung nach der Spalte Vorname. Möchten Sie eine statische Verbindung zu einer MS-SQL Datenbank herstellen, müssen die Fett dargestellten Bereiche wie folgt abgeändert werden:

$Verbindung=“Data Source=.\RelativePositionderDatenbankbzwderenName;Initialcatalog=Users;Integrated Security=True;“

$DB=New-Object System.Data.SqlClient.SqlConnection($Verbindung)

Möchten Sie eine dynamische Verbindung zu einer MS-SQL Datenbank herstellen, müssen die Fett dargestellten Bereiche wie folgt abgeändert werden:

$Verbindung="Data Source=.\RelativePositionderDatenbankbzwderenName;AttachDbFileName=C:\Pfad\Datenbank.mdf;Integrated Security=True;"
$DB=New-Object System.Data.SqlClient.SqlConnection($Verbindung)     # wie bei der statischen Verbindung
Daten aus einer Tabelle auslesen

Das folgende Script zeigt die Möglichkeit Daten aus der Datenbank auszulesen. Die fett markierten Stellen sind die dokumentierten Änderungen zum vorangegangenen Script.

# Angaben zur Verbindung mit der Datenbank
$Verbindung="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\db\test.mdb;"
$SQL="Select * from Services order by Zeit"
# Tabelle aus Datenbank in Variable ablegen
$DB=New-Object System.Data.OleDb.OleDbConnection($Verbindung)
# Öffnen der Tabelle aus der Datenbank
$DB.open()
"Tabelle: "+$DB.State
$Kommando=New-Object System.Data.OleDb.OleDbCommand($SQL,$Verbindung) # Erstellt ein Object für das SQL-Kommando
$Datenadapter=New-Object System.Data.OleDb.OleDbDataAdapter($Kommando)    # Wendet das SQL-Kommando auf die Datenbank an
$Dataset=New-Object System.Data.Dataset            # Erstellt eine Object um die Daten aufzunehmen
[Void] $Datenadapter.Fill($Dataset,"Services")   # Holt sich die Daten ab
# Schließen der Datenbankverbindung
$DB.close()
"Tabelle: "+$DB.State
$Dataset.Tables[0] | ft          # Gibt die Daten als Tabelle formatiert auf dem Bildschirm aus
Daten in eine Tabelle schreiben
$strDB="C:\Pfad\Datei.mdb"
$strTable="Tabellenname"
$objCon=New-Object -comobject ADODB.Connection
$objRecordSet=New-Object -comobject ADODB.Recordset
$objCon.Open("Provider = Microsoft.Jet.OLEDB.4.0; Data Source = $strDB")
$objRecordSet.Open("SELECT * FROM Services",$objCon)
$objRecordSet.Addnew()
$objRecordSet.Fields.item("Spalte1")="Inhalt"
$objRecordSet.Fields.item("Spalte2")="Inhalt"
# usw. - je nachdem wie viele Spalten Ihre Tabelle enthält
$objRecordSet.Update()
$objRecordSet.close()
$objCon.close()
Auch hier sind die von Ihnen anzupassenden Stellen wieder fett markiert.

Datensatz aus einer Tabelle löschen

Mit dem SQL-Kommando werden die zu löschenden Datensätze ausgewählt und anschließend durch die delete Methode gelöscht.

# Datenbankverbindung herstellen
$strDB="C:\db\Services.mdb"
$strTable="Services"
$objCon=New-Object -comobject ADODB.Connection
$objRecordSet=New-Object -comobject ADODB.Recordset
$objCon.Open("Provider = Microsoft.Jet.OLEDB.4.0; Data Source = $strDB")
# Durch den SQL-Befehl werden die zu löschenden Datensätze ausgewählt
$objRecordSet.Open("SELECT * FROM Services WHERE Dienstname='Appinfo'",$objCon,3,3)
# und dann darauf die Delete-Methode angewendet
$objRecordSet.delete()
# Datenbankverbindung lösen
$objRecordSet.close()
$objCon.close()
write-host
write-host "Datensatz gelöscht!"

Kostenloser offline Virenscanner von Microsoft

Basierend auf den guten Microsoft Security Essentials bietet Microsoft einen kostenlosen offline Virenscanner zum download an. Microsoft System Sweeper kann entweder von einem USB-Stick gestartet werden oder von CD. Als Betriebssystembasis wird Windows PE eingesetzt. Der Scanner aktualisiert seine Virenmuster automatisch über das Internet um auf dem neuesten Stand zu bleiben.

Panoramabilder schnell, einfach und kostenlos erstellen

Mit der neuen Version von Microsofts ICE (Image Composite Editor ) sind im Handumdrehen mehrere Bilder zu einem Panorama vereint und das alles für umsonst. Funktioniert unter 32 und 64 Bit.

Alte Anwendungen unter Windows 7 zum Laufen bekommen

Sie haben eine Anwendung die unter Windows 7 nicht laufen will? In den meisten Fällen helfen ja schon die Bordmittel weiter. Darüber hinaus hilft das ACT (Application Compatibility Toolkit) von Microsoft weiter. Immer noch nicht? Dann gibt’s nur noch eine Geheimwaffe! Wenn Ihnen aber bereits ACT Schwierigkeiten bereitet vergessen Sie es, da das Tool mit ACT zusammen arbeitet. Das Spielzeug nennt sich LUA Buglight und ist im Internet nur schwer zu finden, daher hier gleich der Download dazu:

Lua Buglight

Starten Sie Ihr störrisches Programm von LUA Buglight aus. Dabei werden alle problematischen Zugriffe auf Dateisystem, Registry und ein paar andere Objekte mitgeschrieben. LUA Buglight sagt Ihnen nun welche Shims bzw. Compatibility Fixes benötigt werden um das Programm zum Laufen zu bekommen. Im schlimmsten Fall gibt es noch kein passendes Compatibility Fix. Dann müssen Sie eben selbst eines basteln. Wenn laut LUA Buglight Ihr Programm namens C:\Programme\AltesMistding\Mistding.exe versucht auf C:\Programme\AltesMistding\Mistding.config schreibend zuzugreifen (auf den Programmeordner gibt es nur noch Lesen Berechtigungen für normal sterbliche Benutzer) gehen Sie wie folgt vor:

1.) Kopieren Sie C:\Programme\AltesMistding\Mistding.config nach %APPDATA%\AltesMistding\Mistding.config. Ggf. müssen Sie erst die Ordnerstruktur in Ihrem Benutzerprofil unter Appdata (verstecktes Systemverzeichnis – erst Explorer Bescheid sagen!) anlegen.

2.) Legen Sie im Compatibility Administrator aus dem ACT eine neue leere Datenbank an und dann per Rechtsklick auf Create New\Application Fix erstellen Sie Ihren eigenen Compatibility Fix.

3.) Füllen Sie die allgemeinen Felder aus wie Sie mögen. Unter Program file location tragen Sie aber Ihre bockige Anwendung (z. B.: C:\Programme\AltesMistding\Mistding.exe) ein und klicken Sie 2 x auf Weiter.

4.) Wählen Sie nun min. bestehendes Compatibility Fix aus (z.B. CorrectFilePaths) und klicken Sie auf Parameters.

5.) Unter Command line tragen Sie nun den von der Anwendung gewünschten Pfad ein und danach die Umleitung durch Seminkolon getrennt. Beispielsweise so:
%PROGRAMFILES%\AltesMistding\Mistding.config;%APPDATA%\AltesMistding\Mistding.config
Das sollte wie hier gezeigt mit Variablen eingetragen werden, damit es auch problemlos auf anderen Computern und mit anderen Benutzernamen funktioniert. Mit Platzhaltern wie * dürfen Sie dabei nicht arbeiten. Sie können aber den kompletten Ordner mit dem gesamten Inhalt kopieren und umleiten.

Ähnlich verfahren Sie mit Registry-Einträgen (VirtualRegistry unter Compatibiliy Fix). Diese sollten Sie nach HKCU\Software\Classes\VirtualStore umleiten.

Haben Sie alle Beanstandungen von LUA Buglight verarbeitet können Sie den Fix einbauen. Dazu müssen Sie Ihre Datenbank aus dem ACT erst einmal als sdb Datei abspeichern. Über den Punkt Install können Sie Ihren Fix dann auf dem Computer anwenden. Man will natürlich nicht auf jedem Rechner mit der Anwendung das ACT installieren. Daher reicht es die Datenbankdatei mit dem Befehl sdbinst \\Pfad\und\NamezurSDBDatei.sdb aufzurufen. Mit dem Schalter -u kann Ihr Compatibility Fix auch wieder entfernt werden.

Keine Zeit um F8 zu drücken um Windows im abgesicherten Modus zu starten

Wenn Sie nicht schnell genug F8 drücken können um Windows im abgesicherten Modus zu starten z. B. wenn Windows in einer VM (virtuellen Maschine) läuft können Sie msconfig aufrufen. Setzen Sie beim Karteikartenreiter Start das Häkchen Abgesicherter Start und starten Sie Windows neu. Beim erneuten Hochfahren geht Windows automatisch in den Auswahldialog.