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:
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:
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.
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.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 549161
Url: https://administrator.de/forum/sql-abfrage-ueber-powershell-zu-vbs-weiterreichen-549161.html
Ausgedruckt am: 21.04.2025 um 20:04 Uhr
5 Kommentare
Neuester Kommentar
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.
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!

Die Ausgabe des Befehls im Powershell so anpassen
Dann auslesen und ausgeben
Funktioniert einwandfrei (getestet).
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).