Komplexes Powershell Skript in VBS ausführen
Hallo zusammen,
Ich sitze aktuell vor dem Problem, das ich für einen SCOM-Agent eine neue Regel einpflegen muss, und dafür ein SQL-Query über ein Powershellskript einsteuere.
Dieses muss ich aber über ein VBScript ausführen und daran scheitere ich aktuell.
Hier der fragliche Powershell-Code:
Meine bisherigen Versuche waren leider erfolglos, das"verlängern" der einzelnen PS-Befehle mit ; führte leider nicht dazu das sich der Fehler "Anweisungsende erwartet" nicht beheben lies.
Ich hab es auch schon mit einem EncodedCommand versucht, da bekomme ich allerdings die Meldung "Bezeichner zu lang".
Am Ende soll das ganze eigentlich so hier aussehen:
Leider hab ich nur bedingt Erfahrung mit VBS und gehe daher davon aus, das mir da irgendwo der Fehler unterläuft.
Ich bin über jede Hilfe/jeden Tip dankbar.
Vielen Dank schon einmal im Vorfeld.
Ich sitze aktuell vor dem Problem, das ich für einen SCOM-Agent eine neue Regel einpflegen muss, und dafür ein SQL-Query über ein Powershellskript einsteuere.
Dieses muss ich aber über ein VBScript ausführen und daran scheitere ich aktuell.
Hier der fragliche Powershell-Code:
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
$connection.Close()
$dataSet.Tables | Format-List | Out-String -Width 1024
}
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 -- filename property
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"
Meine bisherigen Versuche waren leider erfolglos, das"verlängern" der einzelnen PS-Befehle mit ; führte leider nicht dazu das sich der Fehler "Anweisungsende erwartet" nicht beheben lies.
Ich hab es auch schon mit einem EncodedCommand versucht, da bekomme ich allerdings die Meldung "Bezeichner zu lang".
Am Ende soll das ganze eigentlich so hier aussehen:
Set oAPI = CreateObject("MOM.ScriptAPI")
Set oBag = oAPI.CreatePropertyBag()
pscommand = "$<Mein Code>"
cmd = "powershell.exe -noprofile -command " & pscommand
Set Shell = CreateObject("Wscript.Shell")
Set executor = shell.Exec(cmd)
executor.StdIn.Close
rv = executor.StdOut.ReadAll
rvl= CDbl (rv)
Call oBag.AddValue("Packets",rvl)
Call oAPI.Return(oBag)
Leider hab ich nur bedingt Erfahrung mit VBS und gehe daher davon aus, das mir da irgendwo der Fehler unterläuft.
Ich bin über jede Hilfe/jeden Tip dankbar.
Vielen Dank schon einmal im Vorfeld.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 517090
Url: https://administrator.de/forum/komplexes-powershell-skript-in-vbs-ausfuehren-517090.html
Ausgedruckt am: 21.04.2025 um 04:04 Uhr
1 Kommentar
pscommand = "$<Mein Code>"
Dann wäre hier die Frage was tatsächlich bei dir in den Anführungszeichen steht. Das muss ein Komplettstring werden, mit Semikolons als Abschluss jeder PowerShell Codezeile und entsprechendem Escapen von Anführungszeichen im Code, sowohl für VBScript, als auch für PowerShell.Vermutlichetwa so:
pscommand = """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;" & _
" $connection.Close();" & _
" $dataSet.Tables | Format-List | Out-String -Width 1024;" & _
"}" & _
"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 -- filename property " & _
"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\"";"""
Steffen