Оценка командных переменных в кодировке Powershell перед выполнением (ServiceNow, Invoke-WMIMethod) - PullRequest
0 голосов
/ 05 июня 2018

У меня проблема с блоком сценариев powershell, который выполняется MIDN-сервером ServiceNow на целевом хосте.На целевом хосте запущен сервер SQL, на котором мне нужно выполнить некоторые сценарии PS, выполняющие команды SQL и опубликовать результаты процесса (в этом случае использование JDBC недопустимо).

Итак, я запускаю powershell на сервере MID (какой-топрокси, для тех, кто не знаком с ServiceNow), и мне необходимо выполнить сценарий PS с помощью команды Encoded с помощью командлета Invoke-WMIMethod ( Я не могу использовать команду Invoke-Command из-за отключенного удаленного взаимодействия PS - никакчтобы включить это из-за политики компании), как показано ниже:

$Bytes=[System.Text.Encoding]::Unicode.GetBytes($CallArgumentsBlock)
# Command block is passed as encoded command
$EncodedCommand=[Convert]::ToBase64String($Bytes)

$WMIArgs=@{
        Class='win32_process'
        Name='Create'
        ComputerName=$computer
        ArgumentList="powershell -EncodedCommand $EncodedCommand"
        ErrorAction='SilentlyContinue'
        Credential=$cred
    }

    Invoke-WmiMethod @WMIArgs | Out-Null

Проблема заключается в том, что мне нужно вставить предварительно оцененные переменные $ EncodedCommand.Пример блока скрипта:

$CallArgumentsBlock={
    Param(
    [string] $SQLServer = "$inputSQLServer",  #SQL Server Name running on host
    [string] $SQLDBName = "$inputSQLDBName",  #SQL DB name
    [string] $InputData = "$inputInputData",  #JSON string holding data processed by PS+SQL
    [string] $ResultFolderPath = "$OutputPath_forSQL" #File path where to output results cause WMI can not return output of invoked command
    )

    $ProcessData = ConvertFrom-JSON -InputObject $InputData

    #For each object call sql...
...
*PS code*
...
}
  • Так каким должен быть способ PowerShell сделать это?
  • Кто-нибудь предлагает лучшее решение на основе ServiceNow?

Большое спасибо за ваши ответы!

1 Ответ

0 голосов
/ 05 июня 2018

Моя первоначальная мысль - удалить оператор Param () и просто перечислить переменные и задать значения при создании блока скрипта. По какой причине это не сработает?

$CallArgumentsBlock={
[string] $SQLServer = "$inputSQLServer"  #SQL Server Name running on host
[string] $SQLDBName = "$inputSQLDBName"  #SQL DB name
[string] $InputData = "$inputInputData"  #JSON string holding data processed by PS+SQL
[string] $ResultFolderPath = "$OutputPath_forSQL" #File path where to output results cause WMI can not return output of invoked command

$ProcessData = ConvertFrom-JSON -InputObject $InputData

#For each object call sql...
...
*PS code*
...
}
...