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.
Please also mark the comments that contributed to the solution of the article
Content-Key: 517090
Url: https://administrator.de/contentid/517090
Printed on: April 25, 2024 at 17:04 o'clock
1 Comment
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