saltandtilt
Goto Top

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

Content-Key: 517090

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

Ausgedruckt am: 28.03.2024 um 21:03 Uhr

Mitglied: rubberman
rubberman 20.11.2019 um 20:17:29 Uhr
Goto Top
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\"";"""  
Testen kann ich das aber nicht, darum nur als Gedankenanstoß zu verstehen...

Steffen