执行前的Powershell编码命令变量评估(ServiceNow,Invoke-WMIMethod)

时间:2018-06-05 07:36:18

标签: powershell execution servicenow

我在目标主机上由ServiceNow MID Server执行的powershell scriptblock存在问题。 目标主机正在运行SQL服务器,我需要执行一些运行SQL命令的PS脚本并发布过程结果(在这种情况下使用JDBC活动无效)。

所以我在MID服务器上运行powershell(某些代理,对于那些不熟悉ServiceNow的人),我需要使用Encoded命令通过Invoke-WMIMethod cmdlet执行PS脚本(我不能使用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 :(得分:0)

我最初的想法是删除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*
...
}