Hallo zusammen,
in dem heutigen Howto zeige ich euch, wie Ihr SQLite mit Powershell nutzen könnt.
Um euch eine Alternative zu XML-Dateien aus meinem letzten Post vorzustellen, nutzen wir diesmal SQLite Datenbanken.
Für die XML-Dateien hatte ich mir eine Serverstruktur aufgebaut, die ich später abfragen konnte. Die gleiche Servestruktur werde ich nun in einer SQLite Datenbank abbilden, die wir wiederum später mit Powershell abfragen können.
Arbeitsdateien für das Howto
Um grundlegend mit SQLite Datenbanken zu arbeiten und die Datenbankstruktur anlegen, verwalten und ansehen zu können, benötigt man ein Management Tool.
Hierzu kann man folgende Software/Tools nutzen.
SQLite Manager (Firefox AddOn)
Weitere Management Tools findet ihr bei SQLite.org –> http://www.sqlite.org/cvstrac/wiki?p=ManagementTools
Um überhaupt SQLite Datenbanken mit Powershell abfragen zu können, benötigt man die System.Data.SQLite Runtime bzw. die System.Data.SQLite.dll. Das passende Softwarepaket findet man auf folgender Webseite.
http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki
http://system.data.sqlite.org/downloads/1.0.92.0/sqlite-netFx451-setup-bundle-x64-2013-1.0.92.0.exe
Nach der Installation findet man lokal folgende Struktur vor. Mit dieser Struktur werden wir im nachfolgenden Howto arbeiten.
Um die Datenbank schnell mit Informationen füllen zu können, habe ich euch ein Excelsheet mit ein paar Demo Einträgen vorbereitet, dazu das passende VB Script für den Export in eine TXT Datei.
Nach dem Export der TXT Datei müssen noch ein paar Anpassungen gemacht werden, damit der Import sauber funktioniert.
Nachdem die Datenbank vorbereitet ist, können wir uns den Powershellabfragen widmen.
Auch ich habe mich vorab im Internet informiert, wie so eine Abfrage funktioniert und habe drei gute Ansätze gefunden, die ich euch in dem Post vorstelle.
Erste Beispiel:
Gefunden bei http://thescriptingfrog.blogspot.de/2012/08/how-to-query-sqlite-database-with.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
### Pfad zur System.Data.SQLite.dll Datei [string]$sqlite_library_path = "C:\Program Files\System.Data.SQLite\2013\bin\System.Data.SQLite.dll" ### Pfad zur SQLite Datenbank [string]$db_data_source = "D:\PowershellScripte\Powershell_SQLite\Serverliste2.sqlite" ### SQL Query, hier muss man entscheiden ob man bereits hier die Abfrage auf die Datenbank eingrenzt oder später im Output mit Powershell [string]$db_query = "SELECT * FROM Servername" oder [string]$db_query = "SELECT * FROM Servername WHERE Hostname Like '%ADS%'" oder [string]$db_query = "SELECT * FROM Servername WHERE Memory <= '4096 MB'" ### http://blog.lab49.com/archives/4844 ### Assembly laden, um mit SQLLite arbeiten zu können, ohne diesen Befehl würde die Abfrage nicht funktionieren. [void][System.Reflection.Assembly]::LoadFrom($sqlite_library_path) ### Dieser Befehl stellt einen speicherinternen Datencache dar $db_dataset = New-Object System.Data.DataSet ### Füllt die db_data_adapter Variable mit der Information der Datenbank $db_data_adapter = New-Object System.Data.SQLite.SQLiteDataAdapter($db_query,"Data Source=$db_data_source") [void]$db_data_adapter.Fill($db_dataset) ### Mit folgenden Befehl wird der Input der Datenbank ausgegeben $db_dataset.Tables[0] oder $db_dataset.Tables[0] | Sort-Object FQDN,IPAddress,OS | Format-Table FQDN,IPAddress,OS -AutoSize |
Zweite Beispiel:
Gefunden bei http://poshcode.org/2879
In diesem Beispiel werden zwei Funktionen benutzt, dieses Powershell Skript speichert man sich als z.B. MySQLite.ps1 ab und lädt es sich als Modul nach.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
### Import des Powershell Skriptes, nach dem Import stehen die Funktionen querySQLite und writeSQLite für Abfragen zur Verfügung Import-Module .\Powershell_SQLite\MySQLite.ps1 ### SQL Query, auch hier muss man entscheiden, ob man bereits hier die Abfrage auf die Datenbank eingrenzt oder später im Output mit Powershell $readQuery = "SELECT * FROM Servername" ##$readQuery = "SELECT * FROM Servername WHERE Hostname Like '%ADS%'" ##$readQuery = "SELECT * FROM Servername WHERE Memory <= '4096 MB'" $dataArray = $SQLite.querySQLite($readQuery) $dataArray ##$dataArray | Sort-Object FQDN,IPAddress,OS | Format-Table FQDN,IPAddress,OS -AutoSize ### SQL Datensätze schreiben $writeQuery = "INSERT INTO Servername VALUES(11,'Server11','domain.de','Server11.domain.de','192.168.0.11','255.255.255.0','192.168.0.254','192.168.0.2','192.168.0.1','192.168.0.1','Dual Core 3.07 GHz Intel Core i7 950','11264 MB','80 GB','100 GB','100 GB','Windows Server 2012 R2 x64','');" $SQLite.writeSQLite($writeQuery) ### erneute SQL Abfrage ob der Schreibvorgang erfolgreich war $readQuery = "SELECT * FROM Servername" $dataArray = $SQLite.querySQLite($readQuery) $dataArray ### Modul entfernen Remove-Module MySQLite |
Dritte Beispiel:
Gefunden bei http://psqlite.codeplex.com/
Nachdem man sich das SQLite Modul heruntergeladen und entpackt hat, kopiert man sich den Ordner in folgendes Verzeichnis
C:\Windows\System32\WindowsPowerShell\v1.0\Modules
C:\Windows\SysWOW64\WindowsPowerShell\v1.0\Modules
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
### SQLite Modul laden if(!(Get-Module SQLite)) {Import-Module SQLite} ### Neue Datenbank erstellen oder bereits existierende mounten New-PSDrive -PSProvider SQLite -Name HTDOM_Server_DB -Root "DataSource=D:\PowershellScripte\Powershell_SQLite\Serverliste3.sqlite" ### Mount-SQLite -Name HTDOM_Server_DB -DataSource "D:\PowershellScripte\Powershell_SQLite\Serverliste3.sqlite" ### Tabellen anlegen New-Item -Path HTDOM_Server_DB:/Servername -Value "ID INTEGER PRIMARY KEY, Hostname TEXT, Domain TEXT, FQDN TEXT, IPAddress TEXT, SubnetMask TEXT, Gateway TEXT, DNSServer1 TEXT, DNSServer2 TEXT, WINSServer TEXT, CPU TEXT, Memory TEXT, CPartition TEXT, DPartition TEXT, EPartition TEXT, OS TEXT, ServicePack TEXT" #NONE #TEXT #TEXT NOT NULL #NUMERIC #INTEGER #INTEGER PRIMARY KEY #REAL #BLOB ### Tabellen wieder löschen # Remove-Item -Path HTDOM_Server_DB:/Servername ### Tabellen mit Inhalt füllen New-Item -Path HTDOM_Server_DB:/Servername -ID "1" -Hostname "Server1" -Domain "domain.de" -FQDN "Server1.domain.de" -IPAddress "192.168.0.1" -SubnetMask "255.255.255.0" -Gateway "192.168.0.254" -DNSServer1 "192.168.0.1" -DNSServer2 "192.168.0.2" -WINSServer "192.168.0.1" -CPU "Dual Core 3.07 GHz Intel Core i7 950" -Memory "1024 MB" -CPartition "80 GB" -DPartition "100 GB" -EPartition "100 GB" -OS "Windows Server 2008 R2 x64" -ServicePack "SP1" New-Item -Path HTDOM_Server_DB:/Servername -ID "2" -Hostname "Server2" -Domain "domain.de" -FQDN "Server2.domain.de" -IPAddress "192.168.0.2" -SubnetMask "255.255.255.0" -Gateway "192.168.0.254" -DNSServer1 "192.168.0.2" -DNSServer2 "192.168.0.1" -WINSServer "192.168.0.1" -CPU "Dual Core 3.07 GHz Intel Core i7 950" -Memory "2048 MB" -CPartition "80 GB" -DPartition "100 GB" -OS "Windows Server 2012 R2 x64" ... ### Tabelleneinträge updaten Set-Item -Path HTDOM_Server_DB:/Servername/1 -Hostname "Server3" -Domain "domain.de" -FQDN "Server3.domain.de" -IPAddress "192.168.0.3" Get-Item -Path HTDOM_Server_DB:/Servername/1 ### Tabelleneinträge löschen Remove-Item -Path HTDOM_Server_DB:/Servername/1 ### Suchen und Filtern Get-ChildItem -Path HTDOM_Server_DB:/Servername | Select-Object FQDN,IPAddress,OS Get-ChildItem -Path HTDOM_Server_DB:/Servername -Filter "Hostname like '%Server%'" | Format-Table FQDN,IPAddress,OS -AutoSize FQDN IPAddress OS ---- --------- -- Server1.domain.de 192.168.0.1 Windows Server 2008 R2 x64 Server2.domain.de 192.168.0.2 Windows Server 2012 R2 x64 |
So das war es schon wieder von mir, wünsche euch viel Spaß damit.
Gruß Helmut