Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

gelöst Powershell: DB(MSI)-Tabelle auslesen

Mitglied: H41mSh1C0R

H41mSh1C0R (Level 3) - Jetzt verbinden

15.11.2013 um 11:34 Uhr, 3028 Aufrufe, 3 Kommentare

Servus,

Ziel:

Tabelle aus DB(im speziellen handelt es sich hier um eine MSI) auslesen und Inhalt in eine ArrayList schreiben um diese danach an das DataGrid ( aus meiner letzten Frage) zu übergeben.

Die Idee war gewesen via der folgenden Zeile erst den Count zu ermitteln.

01.
$database.GetType().InvokeMember("OpenView", [System.Reflection.BindingFlags]::InvokeMethod, $null, $database, "SELECT Count(*) FROM Test")
Danach mit diesem Counter die Tabelle "Test" erneut zu durchlaufen und die Werte in eine ArrayListe zu schreiben.
Leider wirft er mir bei dem ermitteln des Count bereits einen Fehler, das das Argument NULL sei und nicht übergeben werden kann.

01.
$msiPath = 'c:\temp\setup.msi'
02.

03.
# Create Installer instance
04.
$installer = New-Object -comObject WindowsInstaller.Installer
05.

06.
# Call Installer.OpenDatabase(name, openMode)
07.
$database = $installer.GetType().InvokeMember("OpenDatabase", [System.Reflection.BindingFlags]::InvokeMethod, $null, $installer, ($msiPath, 0))
08.

09.
# Call Database.OpenView(sql)
10.
$view = $database.GetType().InvokeMember("OpenView", [System.Reflection.BindingFlags]::InvokeMethod, $null, $database, "SELECT COUNT(*) FROM Property")
11.

12.
# Call View.Execute()
13.
$view.GetType().InvokeMember("Execute", [System.Reflection.BindingFlags]::InvokeMethod, $null, $view, $null)
14.

15.
# Call View.Fetch()
16.
$record = $view.GetType().InvokeMember("Fetch", [System.Reflection.BindingFlags]::InvokeMethod, $null, $view, $null)
17.

18.
# Get Record.StringData(field)
19.
$count = $record.GetType().InvokeMember("StringData", [System.Reflection.BindingFlags]::GetProperty, $null, $record, 1)
20.

21.
Write-Host $count
Spezifiziere ich das SQL Statement kann ich mir einzelne Werte ausgeben, allerdings ist das unpraktikabel da ich den Inhalt einer ganzen Tabelle benötige.

Hat von den Spezialisten einer einen Hint?

Gruß
Mitglied: H41mSh1C0R
15.11.2013, aktualisiert um 13:24 Uhr
01.
$msiPath = 'c:\temp\setup.msi'
02.
$MyArray = @("'ProductName'", "'ProductVersion'")
03.

04.
# Create Installer instance
05.
$installer = New-Object -comObject WindowsInstaller.Installer
06.

07.
# Call Installer.OpenDatabase(name, openMode)
08.
$database = $installer.GetType().InvokeMember("OpenDatabase", [System.Reflection.BindingFlags]::InvokeMethod, $null, $installer, ($msiPath, 0))
09.

10.
$Counter = 0
11.
do {
12.
    
13.
    $SelectPropertyName = "SELECT Property FROM Property WHERE Property = " + $MyArray[$Counter]
14.
    $SelectPropertyValue = "SELECT Value FROM Property WHERE Property = " + $MyArray[$Counter]
15.
    
16.
    $view = $database.GetType().InvokeMember("OpenView", [System.Reflection.BindingFlags]::InvokeMethod, $null, $database, "$SelectPropertyName")
17.
    $view.GetType().InvokeMember("Execute", [System.Reflection.BindingFlags]::InvokeMethod, $null, $view, $null)
18.
    $record = $view.GetType().InvokeMember("Fetch", [System.Reflection.BindingFlags]::InvokeMethod, $null, $view, $null)
19.
    $resultProperty = $record.GetType().InvokeMember("StringData", [System.Reflection.BindingFlags]::GetProperty, $null, $record, 1)
20.

21.
    $view = $database.GetType().InvokeMember("OpenView", [System.Reflection.BindingFlags]::InvokeMethod, $null, $database, "$SelectPropertyValue")
22.
    $view.GetType().InvokeMember("Execute", [System.Reflection.BindingFlags]::InvokeMethod, $null, $view, $null)
23.
    $record = $view.GetType().InvokeMember("Fetch", [System.Reflection.BindingFlags]::InvokeMethod, $null, $view, $null)
24.
    $resultValue = $record.GetType().InvokeMember("StringData", [System.Reflection.BindingFlags]::GetProperty, $null, $record, 1)
25.

26.
    Write-Host "Result: " $resultProperty " ------ " $resultValue
27.
    $Counter++
28.
}
29.
while ($Counter -le $MyArray.Count-1)
So bekomme ich zwar nach der Methode "von hinten durch die Brust durchs Auge" die Daten raus wie ich oben das MyArray befülle, aber das ist ja noch nicht ganz das was ich suche. Mal weiter gucken wie ich den Count ermittelt bekomme.

Wenn einer einen Tipp hat immer posten, danke.

Gruß
Bitte warten ..
Mitglied: colinardo
15.11.2013, aktualisiert 20.01.2014
Hi,
check this out:
01.
$msiPath = "c:\temp\setup.msi"
02.
$installer = New-Object -ComObject WindowsInstaller.Installer
03.
$database = $installer.GetType().InvokeMember("OpenDatabase", [System.Reflection.BindingFlags]::InvokeMethod, $null, $installer, ($msiPath, 0)) 
04.
$view = $database.getType().InvokeMember("OpenView",[System.Reflection.BindingFlags]::InvokeMethod,$null,$database,"SELECT * FROM Property")
05.
$view.getType().InvokeMember("Execute",[System.Reflection.BindingFlags]::InvokeMethod,$null,$view,$null)
06.
$r = $view.getType().InvokeMember("Fetch",[System.Reflection.BindingFlags]::InvokeMethod,$null,$view,$null)
07.
$arr = @()
08.
while($r -ne $null) {
09.
        $arr += New-Object PSObject -Property @{Property=$r.getType().InvokeMember("StringData",[System.Reflection.BindingFlags]::GetProperty,$null,$r,1);Value=$r.getType().InvokeMember("StringData",[System.Reflection.BindingFlags]::GetProperty,$null,$r,2)}
10.
        $r = $view.getType().InvokeMember("Fetch",[System.Reflection.BindingFlags]::InvokeMethod,$null,$view,$null)
11.
	}
12.
$view.getType().InvokeMember("Close",[System.Reflection.BindingFlags]::InvokeMethod,$null,$view,$null)
13.

14.
$arr | sort -Property Property | select Property,Value
Oder alles zusammengefasst inkl. Anzeige deiner Form
01.
$msiPath =  "c:\temp\setup.msi"
02.
$installer = New-Object -ComObject WindowsInstaller.Installer
03.
$database = $installer.GetType().InvokeMember("OpenDatabase", [System.Reflection.BindingFlags]::InvokeMethod, $null, $installer, ($msiPath, 0)) 
04.
$view = $database.getType().InvokeMember("OpenView",[System.Reflection.BindingFlags]::InvokeMethod,$null,$database,"SELECT * FROM Property")
05.
$view.getType().InvokeMember("Execute",[System.Reflection.BindingFlags]::InvokeMethod,$null,$view,$null)
06.
$r = $view.getType().InvokeMember("Fetch",[System.Reflection.BindingFlags]::InvokeMethod,$null,$view,$null)
07.
$arr = @()
08.
while($r -ne $null) {
09.
        $arr += New-Object PSObject -Property @{Property=$r.getType().InvokeMember("StringData",[System.Reflection.BindingFlags]::GetProperty,$null,$r,1);Value=$r.getType().InvokeMember("StringData",[System.Reflection.BindingFlags]::GetProperty,$null,$r,2)}
10.
        $r = $view.getType().InvokeMember("Fetch",[System.Reflection.BindingFlags]::InvokeMethod,$null,$view,$null)
11.
	}
12.
$view.getType().InvokeMember("Close",[System.Reflection.BindingFlags]::InvokeMethod,$null,$view,$null)
13.

14.
$sortedArray = $arr |sort -Property Property | select Property,Value
15.
$list = [System.collections.ArrayList]$sortedArray
16.

17.
# ---Create Form ---
18.
Add-Type -AssemblyName "System.Windows.Forms"
19.
$form = New-Object System.Windows.Forms.Form
20.
$form.Size = New-Object System.Drawing.Size(900,600)
21.
$dataGridView = New-Object System.Windows.Forms.DataGridView -Property @{
22.
    Size=New-Object System.Drawing.Size(900,600)
23.
    ColumnHeadersVisible = $true
24.
    DataSource = $list
25.
    AutoSizeColumnsMode = 16
26.
    Dock = 5
27.
}
28.

29.
$form.Controls.Add($dataGridView)
30.
$form.ShowDialog()
Grüße Uwe
Bitte warten ..
Mitglied: H41mSh1C0R
15.11.2013 um 20:03 Uhr
Hallo Uwe,

schonmal danke für deine Mühe.
Ich baue am Montag weiter, wenn ich wieder in der Nähe von der Powershell bin.

Gruß
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Powershell + DB-Abfrage + Result
gelöst Frage von kallewirschBatch & Shell7 Kommentare

Hallo, ich versuche mit Powershell eine Oracle-Tabelle abzufragen. Genutzt wird die durch die Oracle-Client-Installation installierten dlls, also Oracle:data.Access.dll Die ...

Windows 7
MSI Erstellung - WInINSTALL
gelöst Frage von CiscarWindows 730 Kommentare

Hallo allerseits, Ich führe zur Zeit ein Projekt zur MSI - Paketerstellung & Softwareverteilung durch. Laut dem Handelsüblichen PDF ...

Windows 10
Firefox .msi Parameter
gelöst Frage von NetzwerkDudeWindows 105 Kommentare

Mahlzeit, ich teste gerade den neuen MSI Installer für Firefox, und lt. doc gibts den Parameter "Disable removing distribution ...

Windows Tools
Kaufempfehlung MSI-Wrapper
gelöst Frage von User1000Windows Tools5 Kommentare

Hallo Kollegen! Wir wollen in Zukunft weniger Turnschuhadministration machen und suchen nun nach einem MSI-Wrapper, um mehr Programme über ...

Neue Wissensbeiträge
Backup

Veeam Agent für MS Windows - neue Version verfügbar (bedingt jedoch offenbar .NET Framework 4.6)

Information von VGem-e vor 21 StundenBackup

Moin Kollegen, einer unserer Server zeigte grad an, dass für o.g. Software ein Update verfügbar ist. Ob ein evtl. ...

Python

Sie meinen es ja nur gut - Microsoft hilft python-Entwicklern auf unnachahmliche Weise

Information von DerWoWusste vor 2 TagenPython2 Kommentare

Stellt Euch vor, Ihr nutzt python unter Windows 10 und skriptet damit regelmäßig Dinge. Nach dem Update auf Windows ...

Sicherheits-Tools

TrendMicro Worry-Free Business Security 10.0 SP1 steht in Englisch bereit mit Unterstützung für Windows 10 1903 (May Update)

Information von VGem-e vor 2 TagenSicherheits-Tools1 Kommentar

Moin Kollegen, Dann kommt wohl demnächst auch die deutschsprachige/europäische Version zur Auslieferung. Gruß VGem-e

Batch & Shell
PowerShell Konferenz - Videos online
Information von NetzwerkDude vor 3 TagenBatch & Shell

Abend, die Tage werden Videos der Talks von der diesjährigen EU Powershell Konferenz hochgeladen, sind einige Interessante dabei: MFG ...

Heiß diskutierte Inhalte
Google Android
Anbieter für Diensthandys
Frage von Pat.batGoogle Android24 Kommentare

Hallo zusammen, ich bin seit einiger Zeit zuständig für die Diensthandys bei uns in der Behörde. Eine Management Software ...

Windows Server
Windows Server 2016 einrichten
Frage von borjiaWindows Server20 Kommentare

Ich würde gerne einen Server einrichten, erstmal nur mit DNS und AD. Habe mich die letzten Wochen durch diverse ...

Exchange Server
Vorgehen um von Tobit auf Exchange zu wechseln
Frage von Martin1987Exchange Server17 Kommentare

Guten Abend Ich habe den Auftrag erhalten, unser Mail von David zu Outlook zu wechseln. Wie muss ich da ...

Microsoft Office
Office 365 eMail via Website verschicken
Frage von BiBeSoMicrosoft Office16 Kommentare

Hallo, kann man im Office 365 eMails anlegen welche zum versenden (smtp) für die Website funktionieren ? Muss man ...