Seite wählen

ODBC-Datenbankzugriff mit Powershell

von | Nov 7, 2011 | Windows, Icinga

Es gibt manchmal Situationen, in denen man eine Datenbank abfragen muss, der ODBC-Treiber allerdings nur für Windows verfügbar ist und auch keine zusätzliche Skriptsprache installiert werden soll.
Hierfür bietet sich Microsofts objektorientierte Powershell an, mittels derer ein Datenbankzugriff über ODBC relativ einfach zu bewerkstelligen ist. Die Powershell hat außerdem den Vorteil bei aktuellen Windows-Versionen wie z.B. Windows Server 2008 R2 und Windows 7 bereits vorinstalliert zu sein.
Anbei ein kurzes Beispielskript, das exemplarisch eine Verbindung zu einer MSSQL-Datenbank aufbaut, einen Query ausführt und das Ergebnis von selbigem anzeigt:

#DSN angeben, dabei sind _SERVERNAME_, _DATABASE_, _DBUSER_ und _DBPASSWORD_ jeweils zu ersetzen
$DBDSN="Driver={SQL Server};Server=_SERVERNAME_;Database=_DATABASE_;UID=_DBUSER_;PWD=_DBPASSWORD_;"
#Datenbankverbindungsobjekt instanzieren
$DBConnection=New-Object System.Data.Odbc.OdbcConnection
#DSN im Objekt setzen
$DBConnection.ConnectionString=$DBDSN
#Datenbankverbindung öffnen
$DBConnection.Open()
#Datenbankbefehlsobjekt instanzieren
$DBCommand=New-Object System.Data.Odbc.OdbcCommand
#Datenbankverbindung in Befehlsobjekt setzen
$DBCommand.Connection=$DBConnection
#Query angeben, dabei muss _QUERY_ durch das gewünschte Query ersetzt werden
$DBCommand.CommandText="_QUERY_"
#Ein Reader-Objekt erzeugen
$DBResult=$DBCommand.ExecuteReader()
#Anzahl der Rows zählen
#DBCounter=$DBResult.FieldCount
#Rows durchiterieren
while ($DBResult.Read()) {
	for ($i = 0; $i -lt $DBCounter; $i++) {
		#Rows formatiert ausgeben
		@{ $DBResult.GetName($i) = $DBResult.GetValue($i); }
	}
}
#Datenbankverbindung schließen
DBConnection.Close()

Das Skript ist in einer Datei mit .ps1-Endung zu speichern, anschließend muss noch die ExecutionPolicy auf RemoteSigned gesetzt werden, da sonst unsignierte Skripte auch lokal nicht ausgeführt werden dürfen:

PS C:\> Set-ExecutionPolicy RemoteSigned

Anschließend kann das Skript wie folgt aufgerufen werden:

PS C:\> .\odbc-test.ps1

Das Skript erzeugt in unserem Fall z.B. folgende Ausgabe:

Name Value
---- -----
Test Testvalue

Das ganze kann z.B. sehr gut dazu benutzt werden um Icinga-Plugins für Windows zu entwickeln, die einen lokalen ODBC-Treiber verwenden und per NSClient++ aufgerufen werden. Hierzu bietet es sich dann an das Skript mit entsprechenden Parametern zu erweitern und das Skript Exit Codes zurückliefern zu lassen. NSClient++ selbst bietet in seiner Standardkonfiguration bereits Beispiele, wie Powershell-Skripte anzusprechen sind.

3 Kommentare

  1. Seb

    Da sind leider ein paar Fehler im Script, über die man als PowerShell-Neuling stolpert 🙁
    $DBCounter=$DBResult.FieldCount ist auskommentiert, bei DBConnection.Close() fehlt das $ am Anfang..

    Antworten
  2. tim

    danke für das Script und den ergänzenden Kommentar von Seb.

    Antworten
  3. Marci

    Funktioniert nicht richtig, es läuft bei mir eine endlosschleife die immer das selbe Ergebnis ausspuckt

    Antworten

Trackbacks/Pingbacks

  1. Weekly Snap: Powershell, AutoHotKey & Rockbox › NETWAYS Blog - [...] started off by showing us how to use OSDB to access databases with Powershell. When an ODBC driver is…

Einen Kommentar abschicken

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Mehr Beiträge zum Thema Windows | Icinga