Я не являюсь опытным специалистом по написанию сценариев VBScript или PS. В моей системе мониторинга есть управляющий VBScript для открытия заявок в службу поддержки, и теперь его необходимо изменить, чтобы разместить выходные данные JSON, отправляемые в службу.
Сначала я попытался отправить строку JSON непосредственно из VBScript, но всегда получаю ошибку «msxml3.dll: не удалось установить соединение с сервером», которую я не могу исправить. Итак, я протестировал JSON POST от PS, и он сразу заработал.
В своей бесконечной мудрости я тогда решил вызвать сценарий PS из VBScript, но это открыло собственную банку с червями. Два самых больших червя, о которых я здесь говорю, это: 1) попытка правильно ответить на звонок и 2) работа с кавычками.
Это вызов PS из моего VBS:
strOut = "{""integrationName"":""WhatsUpGold"",""actionName"":""WhatsUpGold"",""sourceId"":""" & LogID & """,""payload"":{""UID"":""" & LogID & """,""MD"":""SPNVMSA116"",""Agent_Class"":""WhatsUp Gold"",""Agent_Instance"":""" & mon_name & """,""Client"":""BCX"",""Date"":""" & ActMonStartTimeDate & """,""Time"":""" & ActMonStartTimeTime & """,""ESMTool"":""WhatsUp Gold"",""Severity"":""" & state & """,""State"":""" & mon_state_override & """,""Server"":""" & disp_name & """,""Instance_Detail"":""Server"",""UserData"":""" & payload & """}}"
Context.LogMessage mon_state & " " & disp_name & " -ACTIVE " & mon_name & " monitor alert: " & strOut
Dim objShell, intReturnCode
Set objShell = CreateObject("Wscript.Shell")
intReturnCode = objShell.Run("powershell.exe -noexit set-ExecutionPolicy Unrestricted -c .\c:\SXI\SXI_post_active3.ps1 " & strOut)
MsgBox intReturnCode
Это мой PS-скрипт:
******************************************************************************************
$content = $args[0]
[hashtable]$headers=@{}
$headers.Add("Authorization", "Basic XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")
$headers.Add('Content-Type', 'application/json')
$headers.Add('Accept', 'application/json')
$uri = "https://mywebservice"
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
Invoke-RestMethod -Method 'POST' -Uri $uri -Headers $headers -Body $content
*****************************************************************************************
Переменная strOut в моем VBScript проходит тест JSON, поэтому я подумал, что все будет в порядке, но когда я выполняю свой VBS, я получаю следующую ошибку из вывода сценария PS:
At line:1 char:95
+ ... c .\c:\SXI\SXI_post_active3.ps1 {integrationName:WhatsUpGold,actionNa ...
+ ~
Missing argument in parameter list.
At line:1 char:156
+ ... actionName:WhatsUpGold,sourceId:4904575,payload:{UID:4904575,MD:SPNVM ...
+ ~
Missing argument in parameter list.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : MissingArgument
Как можно видеть, JSON в моем выводе VBSCript был хорош, но PS удалил кавычки. Я думаю, что мой привязь подошла к концу. Я также не уверен, правильно ли я вызвал сценарий PS из моего VBScript. Любые указатели будут полезны.
Для начала уберите set-
перед -ExecutionPolicy Unrestricted
"powershell.exe -noexit -ExecutionPolicy Unrestricted -c .\c:\SXI\SXI_post_active3.ps1 " & strOut
Я, вероятно, рассмотрю возможность позволить PowerShell вместо этого обрабатывать создание полезной нагрузки json и просто передавать то, что ему нужно, в качестве аргументов в скрипт.
Пример кода vbscript (поскольку PowerShell для простоты допускает использование одинарных кавычек вокруг аргументов)
Dim strLogId, strMonName, strActMonStartTimeDate, strActMonStartTimeTime
strLogId = "LogIDA"
strMonName = "MonNameA"
strActMonStartTimeDate = "2022-04-23"
strActMonStartTimeTime = "23:12:12"
intReturnCode = objShell.Run("powershell.exe -noprofile -noexit -ExecutionPolicy Unrestricted -Command c:\temp\b.ps1 '" & strLogId & "' '" & strMonName & "' '" & strActMonStartTimeDate & "' '" & strActMonStartTimeTime & "'")
'MsgBox intReturnCode
Пример сценария PowerShell
param(
$LogID,
$mon_name,
$ActMonStartTimeDate,
$ActMonStartTimeTime
)
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = $true
$content = [pscustomobject]@{
integrationName = 'WhatsUpGold'
actionName = 'WhatsUpGold'
sourceId = $LogID
payload = [pscustomobject]@{
uid = $LogID; MD = 'SPNVMSA116'
Agent_Class = 'WhatsUp Gold'
Agent_Instance = $mon_name
Client = 'BCX'
Date = $ActMonStartTimeDate
Time = $ActMonStartTimeTime
ESMTool = 'WhatsUp Gold'
}
} | ConvertTo-Json
[hashtable]$headers = @{}
$headers.Add('Authorization', 'Basic XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX') $headers.Add('Content-Type', 'application/json') $headers.Add('Accept', 'application/json')
$uri = 'https://mywebservice'
Invoke-RestMethod -Method 'POST' -Uri $uri -Headers $headers -Body $content
Марк, ты спаситель! Ваш ответ был идеальным решением и сработал без проблем.
Рад, что помог @GrahamVandervaart :)
В последний раз, когда я боролся с кавычками в PowerShell, я забыл об обратном символе, позволяющем избежать кавычек. Я не уверен, применимо ли это здесь, но я думаю, что использование обратного апострофа может помочь предотвратить удаление кавычек PS.