PowerShell BizTalk脚本,不使用PowerShell的BizTalk提供程序
我已经使用Codeplex的优秀BizTalk PowerShell提供程序一段时间了。然而,在我的新公司,构建团队不喜欢使用它,所以我需要重写所有的方便配置脚本,以避免使用它 我已经重做了其中的大部分,但在寻找如何做以下两件事的示例时遇到了一些问题:PowerShell BizTalk脚本,不使用PowerShell的BizTalk提供程序,powershell,biztalk,Powershell,Biztalk,我已经使用Codeplex的优秀BizTalk PowerShell提供程序一段时间了。然而,在我的新公司,构建团队不喜欢使用它,所以我需要重写所有的方便配置脚本,以避免使用它 我已经重做了其中的大部分,但在寻找如何做以下两件事的示例时遇到了一些问题: 创建主机实例 创建发送/接收适配器句柄 有人能给我举个例子,说明在没有PowerShell BizTalk提供程序的情况下如何执行这些操作吗?我做了一些观察,现在似乎每个人都在使用它 非常感谢 对于2)你应该调查 使用和应该给你你需要的 但是,似
但是,似乎无法使用ExplorerOM控制主机实例,只能控制主机。好的,如果其他人需要,这里是我完成的hacky powershell函数:
function write-WarnMessage([string]$message) {
Write-Host $(Get-Date) $message -ForegroundColor Yellow
}
function write-SucessMessage([string]$message) {
Write-Host $(Get-Date) $message -ForegroundColor Green
}
function write-InfoMessage([string]$message) {
Write-Host $(Get-Date) $message -ForegroundColor Blue -BackgroundColor White
}
function write-ErrorMessage ([string]$message) {
Write-Host $(Get-Date) $message -ForegroundColor Red
}
# Gets the execution directory
function Get-ScriptDirectory
{
$Invocation = (Get-Variable MyInvocation -Scope 1).Value
Split-Path $Invocation.MyCommand.Path
}
function Delete-Bts-Receive-Handler ( [string]$adapter, [string]$hostName )
{
try
{
[System.Management.ManagementObject]$objHandler = get-wmiobject 'MSBTS_ReceiveHandler' -namespace 'root\MicrosoftBizTalkServer' -filter "HostName='$hostName' AND AdapterName='$adapter'"
$objHandler.Delete()
write-SucessMessage "Deleted $adapter receive handler for $hostName"
}
catch [System.Management.Automation.RuntimeException]
{
if ($_.Exception.Message -eq "You cannot call a method on a null-valued expression.")
{
write-WarnMessage "$adapter receive handler for $hostName does not exist"
}
elseif ($_.Exception.Message.IndexOf("Cannot delete a receive handler that is used by") -ne -1)
{
write-WarnMessage "$adapter receive handler for $hostName is in use. Cannot delete."
}
else
{
write-Error "$adapter receive handler for $hostName could not be deleted: $_.Exception.ToString()"
}
}
}
function Delete-Bts-Send-Handler ( [string]$adapter, [string]$hostName )
{
try
{
[System.Management.ManagementObject]$objHandler = get-wmiobject 'MSBTS_SendHandler2' -namespace 'root\MicrosoftBizTalkServer' -filter "HostName='$hostName' AND AdapterName='$adapter'"
$objHandler.Delete()
write-SucessMessage "Deleted $adapter send handler for $hostName"
}
catch [System.Management.Automation.RuntimeException]
{
if ($_.Exception.Message -eq "You cannot call a method on a null-valued expression.")
{
write-WarnMessage "$adapter send handler for $hostName does not exist"
}
elseif ($_.Exception.Message.IndexOf("Cannot delete a send handler that is used by") -ne -1)
{
write-WarnMessage "$adapter send handler for $hostName is in use. Cannot delete."
}
else
{
write-Error "$adapter send handler for $hostName could not be deleted: $_.Exception.ToString()"
}
}
}
function Delete-Bts-Instance( [string]$hostName, [string]$Server )
{
try
{
# Unintall
[System.Management.ManagementObject]$objHostInstance = ([WmiClass]"root/MicrosoftBizTalkServer:MSBTS_HostInstance").CreateInstance()
$name = "Microsoft BizTalk Server " + $hostName + " " + $Server
$objHostInstance["Name"] = $name
$objHostInstance.Uninstall()
# Unmap
[System.Management.ManagementObject]$objServerHost = ([WmiClass]"root/MicrosoftBizTalkServer:MSBTS_ServerHost").CreateInstance()
$objServerHost["HostName"] = $hostName
$objServerHost["ServerName"] = $Server
$objServerHost.Unmap()
write-SucessMessage "Deleted host instance for $hostName on $Server"
}
catch [System.Management.Automation.RuntimeException]
{
write-Error "$hostName host instance on server $Server could not be deleted: $_.Exception.ToString()"
}
}
function Stop-Bts-HostInstance ( [string] $HostName, [string] $Server )
{
try
{
$filter = "HostName = '" + $HostName + "' and RunningServer = '" + $Server + "'"
$HostInstance = get-wmiobject "MSBTS_HostInstance" -namespace "root\MicrosoftBizTalkServer" -filter $filter
$HostInstanceState = $HostInstance.GetState().State
write-InfoMessage "Current state of $HostName instance on server $Server : $HostInstanceState (1=Stopped, 2=Start pending, 3=Stop pending, 4=Running, 8=Unknown)"
if ($HostInstanceState -eq 4)
{
$HostInstance.Stop()
$HostInstanceState = $HostInstance.GetState().State
write-SucessMessage "New state of $HostName instance on server $Server: $HostInstanceState (1=Stopped, 2=Start pending, 3=Stop pending, 4=Running, 8=Unknown)"
}
else
{
$HostInstanceState = $HostInstance.GetState().State
write-WarnMessage "Failed to stop host instance $HostName on server $Server because host instance state $HostInstanceState was not the expected value of 4 (running)"
}
}
catch [System.Management.Automation.RuntimeException]
{
write-Error "$hostName host instance could not be stopped on $Server : $_.Exception.ToString()"
}
}
function Delete-Bts-Host ( [string]$hostName )
{
# TODO: This only works intermittently
try
{
[System.Management.ManagementObject]$objHostSetting = get-wmiobject 'MSBTS_HostSetting' -namespace 'root\MicrosoftBizTalkServer' -filter "HostName='$hostName'"
$objHostSetting.Delete()
write-SucessMessage "Deleted host $hostName"
}
catch [System.Management.Automation.RuntimeException]
{
write-Error "$hostName host could not be deleted: $_.Exception.ToString()"
}
}
# function to create BizTalk host
function Create-Bts-Host(
[string]$hostName,
[int]$hostType,
[string]$ntGroupName,
[bool]$authTrusted,
[bool]$tracking,
[bool]$32BitOnly)
{
try
{
[System.Management.ManagementObject]$objHostSetting = ([WmiClass]"root/MicrosoftBizTalkServer:MSBTS_HostSetting").CreateInstance()
$objHostSetting["Name"] = $hostName
$objHostSetting["HostType"] = $hostType
$objHostSetting["NTGroupName"] = $NTGroupName
$objHostSetting["AuthTrusted"] = $authTrusted
$objHostSetting["IsHost32BitOnly"] = $32BitOnly
$objHostSetting["HostTracking"] = $tracking
$putOptions = new-Object System.Management.PutOptions
$putOptions.Type = [System.Management.PutType]::CreateOnly;
[Type[]] $targetTypes = New-Object System.Type[] 1
$targetTypes[0] = $putOptions.GetType()
$sysMgmtAssemblyName = "System.Management"
$sysMgmtAssembly = [System.Reflection.Assembly]::LoadWithPartialName($sysMgmtAssemblyName)
$objHostSettingType = $sysMgmtAssembly.GetType("System.Management.ManagementObject")
[Reflection.MethodInfo] $methodInfo = $objHostSettingType.GetMethod("Put", $targetTypes)
$methodInfo.Invoke($objHostSetting, $putOptions)
write-SucessMessage "Host $hostName created"
}
catch [System.Management.Automation.RuntimeException]
{
write-Error "$hostName host could not be created: $_.Exception.ToString()"
}
}
function Update-Bts-Host (
[string]$hostName,
[int]$hostType,
[string]$ntGroupName,
[bool]$authTrusted,
[bool]$tracking,
[bool]$32BitOnly)
{
try
{
[System.Management.ManagementObject]$objHostSetting = ([WmiClass]"root/MicrosoftBizTalkServer:MSBTS_HostSetting").CreateInstance()
$objHostSetting["Name"] = $hostName
$objHostSetting["HostType"] = $hostType
$objHostSetting["NTGroupName"] = $ntGroupName
$objHostSetting["AuthTrusted"] = $authTrusted
$objHostSetting["IsHost32BitOnly"] = $32BitOnly
$objHostSetting["HostTracking"] = $tracking
$putOptions = new-Object System.Management.PutOptions
$putOptions.Type = [System.Management.PutType]::UpdateOnly; # This tells WMI it's an update.
[Type[]] $targetTypes = New-Object System.Type[] 1
$targetTypes[0] = $putOptions.GetType()
$sysMgmtAssemblyName = "System.Management"
$sysMgmtAssembly = [System.Reflection.Assembly]::LoadWithPartialName($sysMgmtAssemblyName)
$objHostSettingType = $sysMgmtAssembly.GetType("System.Management.ManagementObject")
[Reflection.MethodInfo] $methodInfo = $objHostSettingType.GetMethod("Put", $targetTypes)
$methodInfo.Invoke($objHostSetting, $putOptions)
write-SucessMessage "Host updated"
}
catch [System.Management.Automation.RuntimeException]
{
write-Error "$hostName host could not be updated: $_.Exception.ToString()"
}
}
# function to create BizTalk send adapter handler
function Create-Bts-SendHandler([string]$adapter, [string]$hostName)
{
try
{
[System.Management.ManagementObject]$objSendHandler = ([WmiClass]"root/MicrosoftBizTalkServer:MSBTS_SendHandler2").CreateInstance()
$objSendHandler["AdapterName"] = $adapter
$objSendHandler["HostName"] = $hostName
$objSendHandler["IsDefault"] = $false
$putOptions = new-Object System.Management.PutOptions
$putOptions.Type = [System.Management.PutType]::CreateOnly;
[Type[]] $targetTypes = New-Object System.Type[] 1
$targetTypes[0] = $putOptions.GetType()
$sysMgmtAssemblyName = "System.Management"
$sysMgmtAssembly = [System.Reflection.Assembly]::LoadWithPartialName($sysMgmtAssemblyName)
$objSendHandlerType = $sysMgmtAssembly.GetType("System.Management.ManagementObject")
[Reflection.MethodInfo] $methodInfo = $objSendHandlerType.GetMethod("Put", $targetTypes)
$methodInfo.Invoke($objSendHandler, $putOptions)
write-SucessMessage "Send handler created for $adapter / $hostName"
}
catch [System.Management.Automation.RuntimeException]
{
write-Error "Send handler for $adapter / $hostName could not be created: $_.Exception.ToString()"
}
}
# function to create BizTalk receive adapter handler
function Create-Bts-ReceiveHandler([string]$adapter, [string]$hostName)
{
try
{
[System.Management.ManagementObject]$objReceiveHandler = ([WmiClass]"root/MicrosoftBizTalkServer:MSBTS_ReceiveHandler").CreateInstance()
$objReceiveHandler["AdapterName"] = $adapter
$objReceiveHandler["HostName"] = $hostName
$putOptions = new-Object System.Management.PutOptions
$putOptions.Type = [System.Management.PutType]::CreateOnly;
[Type[]] $targetTypes = New-Object System.Type[] 1
$targetTypes[0] = $putOptions.GetType()
$sysMgmtAssemblyName = "System.Management"
$sysMgmtAssembly = [System.Reflection.Assembly]::LoadWithPartialName($sysMgmtAssemblyName)
$objReceiveHandlerType = $sysMgmtAssembly.GetType("System.Management.ManagementObject")
[Reflection.MethodInfo] $methodInfo = $objReceiveHandlerType.GetMethod("Put", $targetTypes)
$methodInfo.Invoke($objReceiveHandler, $putOptions)
write-SucessMessage "Receive handler created for $adapter / $hostName"
}
catch [System.Management.Automation.RuntimeException]
{
write-Error "Receive handler for $adapter / $hostName could not be created: $_.Exception.ToString()"
}
}
# function to create BizTalk host instance
function Create-Bts-Instance([string]$hostName, [string]$login, [string]$password, [string]$Server)
{
try
{
[System.Management.ManagementObject]$objServerHost = ([WmiClass]"root/MicrosoftBizTalkServer:MSBTS_ServerHost").CreateInstance()
$objServerHost["HostName"] = $hostName
$objServerHost["ServerName"] = $Server
$objServerHost.Map()
[System.Management.ManagementObject]$objHostInstance = ([WmiClass]"root/MicrosoftBizTalkServer:MSBTS_HostInstance").CreateInstance()
$name = "Microsoft BizTalk Server " + $hostName + " " + $Server
$objHostInstance["Name"] = $name
$objHostInstance.Install($Login, $Password, $True)
write-SucessMessage "Created host instance for $hostName on $Server"
}
catch [System.Management.Automation.RuntimeException]
{
write-Error "$hostName host instance on server $Server could not be created: $_.Exception.ToString()"
}
}
function Start-Bts-HostInstance ( [string] $HostName, [string] $Server )
{
try
{
$filter = "HostName = '" + $HostName + "' and RunningServer = '" + $Server + "'"
$HostInstance = get-wmiobject "MSBTS_HostInstance" -namespace "root\MicrosoftBizTalkServer" -filter $filter
$HostInstanceState = $HostInstance.GetState().State
write-InfoMessage "Current state of $HostName instance on server $Server: $HostInstanceState (1=Stopped, 2=Start pending, 3=Stop pending, 4=Running, 8=Unknown)"
if ($HostInstanceState -eq 1)
{
$HostInstance.Start()
$HostInstanceState = $HostInstance.GetState().State
write-SucessMessage "New state of $HostName instance on server $Server: $HostInstanceState (1=Stopped, 2=Start pending, 3=Stop pending, 4=Running, 8=Unknown)"
}
else
{
$HostInstanceState = $HostInstance.GetState().State
write-WarnMessage "Failed to start host instance $HostName on server $Server because host instance state $HostInstanceState was not the expected value of 1 (stopped)"
}
}
catch [System.Management.Automation.RuntimeException]
{
write-Error "$hostName host instance could not be started on $Server : $_.Exception.ToString()"
}
}
function Install-BTSMsi ( [string]$bts_application, [string]$msi_package, [string]$install_env )
{
write-InfoMessage "Installing $msi_package in $bts_application for $install_env"
BTSTask ImportApp /ApplicationName:$bts_application /Package:$msi_package /Overwrite /Environment:$install_env
if ($LASTEXITCODE -ne 0) {
write-ErrorMessage "Failed to Import MSI $msi_package"
}
else
{
write-SucessMessage "Installed $bts_application for $install_env"
}
}
function Remove-BTSApplication ( [string]$appServer, [string]$appDatabase, [string]$appName )
{
write-InfoMessage "Uninstalling Application: $appName "
BTSTask RemoveApp /Server:"$appServer" /ApplicationName:"$appName" /Database:"$appDatabase" #| out-null
if ($LASTEXITCODE -ne 0) {
write-ErrorMessage "Failed to remove $appServer $appName"
}
else
{
write-SucessMessage "Removed $appName from $appServer"
}
}
# Accesses SSO and will require the build user account to belong to the SSO Admins group.
# Also requires Microsoft.BizTalk.ExplorerOM.dll to be loaded.
function StartStop-BTSApplication ( [string]$appServer, [string]$appName, [string]$appCommand )
{
if ( ($appName -eq '') -or ($appName -eq $null) )
{
throw 'you must supply the application name'
}
#write-InfoMessage " Finding Application: $appServer:$appName "
$exp = New-Object Microsoft.BizTalk.ExplorerOM.BtsCatalogExplorer
$exp.ConnectionString = Get-BTSConnectionString($appServer)
$app = $exp.Applications[$appName]
if($app -eq $null)
{
if ($appCommand -eq "stop" )
{
write-WarnMessage "WARNING failed to stop $appName"
}
else
{
write-WarnMessage "FAILED to start $appName"
}
}
else
{
switch -wildcard ( $app.Status.ToString() )
{
'Stopped'
{
if ($appCommand -eq "start" ) {
write-InfoMessage "Starting Application: $appName "
$null = $app.Start([Microsoft.BizTalk.ExplorerOM.ApplicationStartOption]::StartAll)
$null = $exp.SaveChanges()
write-SucessMessage " Started Application: $appName "
} else {
write-InfoMessage "Application Already Stopped: $appName "
}
}
'*Started'
{
# includes Started and PartiallyStarted
if ($appCommand -eq "stop" ) {
write-InfoMessage "Stopping Application: $appName "
$null = $app.Stop([Microsoft.BizTalk.ExplorerOM.ApplicationStopOption]::StopAll)
$null = $exp.SaveChanges()
write-SucessMessage " Stopped Application: $appName "
} else {
write-InfoMessage "Application Already Started : $appName "
}
}
'NotApplicable'
{
write-InfoMessage "Application doesn't require $appCommand"
}
default
{
$msg = "Unkown STATUS: " + $app.Status
write-ErrorMessage $msg
}
}
}
}
function Get-BTSConnectionString ( [string] $server )
{
$group = Get-WmiObject MSBTS_GroupSetting -n root\MicrosoftBizTalkServer -computername $server
$grpdb = $group.MgmtDBName
$grpsvr = $group.MgmtDBServerName
[System.String]::Concat("server=", $grpsvr, ";database=", $grpdb, ";Integrated Security=SSPI")
write-InfoMessage " Server: $grpsvr - Database $grpdb"
}
即使您不能使用Powershell库本身,也没有什么能阻止您检查其源代码以查看它执行这些功能的功能,即与Microsoft.BizTalk.Explorer程序集交互。看起来您是从Santhosh Benjamin的脚本中借用来使用反射提交PutOptions的:
[Type[]] $targetTypes = New-Object System.Type[] 1
$targetTypes[0] = $putOptions.GetType()
$sysMgmtAssemblyName = “System.Management”
$sysMgmtAssembly = [System.Reflection.Assembly]::LoadWithPartialName($sysMgmtAssemblyName)
$objHostSettingType = $sysMgmtAssembly.GetType(“System.Management.ManagementObject”)
[Reflection.MethodInfo] $methodInfo = $objHostSettingType.GetMethod(“Put”,$targetTypes)
$methodInfo.Invoke($objHostSetting,$putOptions)
我用目前正在使用的几个脚本对此进行了测试,发现(通过纯粹的stubberness)可以简单地在对象上使用Put方法,就像在C#中一样:
干杯,
Charles。还有一个非常有用的博客,其中包含处理主机、主机实例和适配器处理程序的功能 也设置在GitHub上 他们似乎没有提到的是删除BizTalk主机
function Remove-BizTalkHost(
[string] $hostName)
{
try
{
$strQuery = "MSBTS_HostSetting.Name='$hostName'";
$objPath = New-Object System.Management.ManagementPath
$objPath.Path = $strQuery
[System.Management.ManagementObject]$objHostSetting = ([WmiClass]"root/MicrosoftBizTalkServer:MSBTS_HostSetting").CreateInstance()
$objHostSetting.Path = $objPath
$objHostSetting.Delete()
Write-Host "Host $hostName was successfully deleted" -ForegroundColor DarkGreen
}
catch [System.Management.Automation.RuntimeException]
{
if ($_.Exception.Message.Contains("No instance was found with the specified key") -eq $true)
{
Write-Host "$hostName can't be deleted because already removed from the BizTalk group." -ForegroundColor DarkRed
}
else
{
Write-Error "$hostName host could not be deleted: $_.Exception.ToString()"
}
}
}
谢谢你的回复。我有一个脚本来做主持人。在WMI中使用MSBTS_主机设置。不过,我无法让它与主机实例一起工作。PS以上脚本无法与PowerShell 1.0一起工作,因此如果您想使用它们,请升级。为什么要使用自定义
Write XxxMessage
方法?为什么不使用内置的写入错误
,写入警告
,写入主机
等?删除
在PowerShell中不受支持。如果使用动词-名词的PowerShell约定(仅使用已知动词),则这些Cmdlet将被称为Remove BizTalkReceiveHandler
。。。您可以使用Get Verb
查找正确的动词。感谢您的回复。我觉得你有点漏掉了重点。我要的是powershell示例,而不是C#示例,我可以找到很多。Delete
在powershell中不受支持。如果使用动词-名词的PowerShell约定(仅使用已知动词),则此Cmdlet将被称为Remove BizTalkHost
。您可以使用Get Verb
查找正确的谓词。这里的真正问题不是因为您不愿意使用BizTalk PowerShell提供程序,而您可以使用自定义脚本吗?反对意见是什么?
function Remove-BizTalkHost(
[string] $hostName)
{
try
{
$strQuery = "MSBTS_HostSetting.Name='$hostName'";
$objPath = New-Object System.Management.ManagementPath
$objPath.Path = $strQuery
[System.Management.ManagementObject]$objHostSetting = ([WmiClass]"root/MicrosoftBizTalkServer:MSBTS_HostSetting").CreateInstance()
$objHostSetting.Path = $objPath
$objHostSetting.Delete()
Write-Host "Host $hostName was successfully deleted" -ForegroundColor DarkGreen
}
catch [System.Management.Automation.RuntimeException]
{
if ($_.Exception.Message.Contains("No instance was found with the specified key") -eq $true)
{
Write-Host "$hostName can't be deleted because already removed from the BizTalk group." -ForegroundColor DarkRed
}
else
{
Write-Error "$hostName host could not be deleted: $_.Exception.ToString()"
}
}
}