我在目标主机上由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*
...
}
非常感谢您的回答!
答案 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*
...
}