All posts tagged Export

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 Database Browser
SQLite_Database_Browser

 

 

 

 

 
SQLite Manager (Firefox AddOn)
SQLite_Manager

 

 

 

 

 
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.
FileStruktur

 

 

 

 

 

 
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.
Export_Excel

 

 

 

 

 
Export_Import_Datei

 

 

 

 

 
Datenbank_vorbereiten

 

 

 

 

 
Datenbank_vorbereiten2

 

 

 

 

 
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

### 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

Powershell_Abfrage_1

 

 

 

 

 
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.

### 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

Powershell_Abfrage_2

 

 

 

 

 
Powershell_Abfrage_2_2

 

 

 

 

 
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

### 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