tomuchnacl
Goto Top

SQL-Abfrage über Powershell zu vbs weiterreichen

Hallo zusammen, ich habe hier ein etwas verschachteltes Problem.

Ich muss eine SQL Abfrage über Powershell ausführen, soweit ganz einfach, die funktioniert auch.

Powershell:
$command = function Invoke-SQL {Param( [string]$SqlCommand  );
		$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8';  
		$E = Get-OdbcDsn -Name SQL_UserCheck;
		$driver = $E.DriverName;
		$server= $E.Attribute.Server;
		$database = $E.Attribute.Database;
		$connectionString = "Server=$server; integrated security = true";  
		$connection = new-object system.data.SqlClient.SQLConnection($connectionString);
		$command = new-object system.data.sqlclient.sqlcommand($sqlCommand,$connection);
		$connection.Open();
		$adapter = New-Object System.Data.sqlclient.sqlDataAdapter $command;
		$dataset = New-Object System.Data.DataSet;
		$adapter.Fill($dataSet) | Out-Null; 
        If ($dataset.Tables -ne $null) {
            $table = $dataset.Tables
            } 
        ElseIf ($table.Rows.Count -eq 0) { 
            $table = New-Object System.Collections.ArrayList 
            } ;
        $connection.Close()
        return $table


}
 


Invoke-SQL -SqlCommand "DECLARE @tracefile VARCHAR(256)   
                        SELECT @tracefile = CAST(value AS VARCHAR(256)) 
                        FROM ::fn_trace_getinfo(DEFAULT) 
                        WHERE traceid = 1 AND property = 2 
                        SELECT NTUserName, SessionLoginName, SPID, TargetLoginName, StartTime, ServerName 
                        FROM ::fn_trace_gettable(@tracefile, DEFAULT) trc 
                        INNER JOIN sys.trace_events evt 
                        ON trc.EventClass = evt.trace_event_id 
                        WHERE trc.EventClass IN (108, 109, 110) 
                        AND ObjectName ='sysadmin'   
                        ORDER BY trc.StartTime";  

Der Output sieht so aus:

NTUserName : Erstellername
SessionLoginName : Erstellername
SPID : 83
TargetLoginName : test_user
StartTime : 19.02.2020 07:25:41
ServerName : Servername


Jetzt gehen aber meine Probleme los.
Ich muss das ganze in einem VBScript aufrufen und ausführen.

Das versuche ich über folgendes Script:
pscommand = "<powershell code>"  
cmd = "powershell.exe -noprofile  -command " & pscommand  
Set Shell = CreateObject("Wscript.Shell")  
Set executor = shell.Exec(cmd)
WScript.Sleep 10000
executor.StdIn.Close
strStarter = executor.StdOut.ReadAll

WScript.Echo strStarter

Hier bleibt mein Output allerdings leer, ich vermute zwar, dass es an dem Datentyp liegt, in dem $dataset erschafft wird, komme hier aber einfach nicht weiter.
Das 2. Problem besteht dann übrigens, wenn mehrere Werte bei der SQL-Abfrage herauskommen, da das Script die alle in die selbe Zelle zu schreiben scheint.

Schonmal danke im voraus, ich bin hier für jede Hilfe dankbar.

Content-Key: 549161

Url: https://administrator.de/contentid/549161

Printed on: April 25, 2024 at 10:04 o'clock

Member: beidermachtvongreyscull
beidermachtvongreyscull Feb 19, 2020 at 09:00:37 (UTC)
Goto Top
Wie wäre es, wenn Du innerhalb des Powershell-Scripts die Ausgabe in eine TXT-Datei umleitest anstatt auf die Console.
Auf diese Datei greifst Du dann von VBS aus zu und wertest zeilenweise aus.
Member: ToMuchNaCl
ToMuchNaCl Feb 19, 2020 at 09:40:07 (UTC)
Goto Top
Das ganze ist ein Check aus SCOM heraus, ne Ablage in eine andere Datei ist daher leider keine Option.
Wahrscheinlich würde es allerdings reichen, wenn ich das ganze noch in dem PS-Script zu einem einzelnen String formatiert bekomme.
Member: mayho33
mayho33 Feb 19, 2020 at 10:38:45 (UTC)
Goto Top
Zitat von @ToMuchNaCl:

Das ganze ist ein Check aus SCOM heraus, ne Ablage in eine andere Datei ist daher leider keine Option.
Wahrscheinlich würde es allerdings reichen, wenn ich das ganze noch in dem PS-Script zu einem einzelnen String formatiert bekomme.

Hi!

versuche mal das:

Dim objShell : Set objShell = CreateObject("Wscript.Shell")  
Dim Cmd : Cmd = "powershell.exe -noprofile -command Get-NetAdapter"  

Set Ex = objShell.Exec(Cmd)
Ex.StdIn.Close

'Weiterverarbeitung:  
dim values : values = Ex.StdOut.ReadAll

'Ausgabe in die CMD:  
WScript.Echo values


Grüße!
Member: ToMuchNaCl
ToMuchNaCl Feb 19, 2020 at 14:25:21 (UTC)
Goto Top
Das funktioniert leider auch nicht. Tut ja im Endeffekt das selbe, was ich bereits mit dem unten erwähnten VBS tue.
Hab das ganze nochmal getestet, wenn ich eine Datei erschaffe geht das, lediglich das Umformatieren in einen String geht nicht.
Mitglied: 142970
142970 Feb 19, 2020 updated at 15:07:59 (UTC)
Goto Top
Die Ausgabe des Befehls im Powershell so anpassen
return ($table | fl * | out-string)

Dann auslesen und ausgeben
Set objShell = CreateObject("Wscript.Shell")  

'Befehl ausführen  
Set oExec = objShell.Exec("powershell -EP Bypass -NoP -File ""C:\Scripts\test.ps1""")  

'Warte darauf das der Befehl beendet wurde  
Do While oExec.Status = 0
     WScript.Sleep 100
Loop

' StdOut auslesen  
out = ""  
Do While Not oExec.StdOut.AtEndOfStream
   out = out & oExec.StdOut.ReadAll
Loop

' Zum Test: Ausgabe anzeigen lassen:  
WScript.Echo out

Funktioniert einwandfrei (getestet).