BizTalk exposes the .Net API to manage the orchestrations. The following script demonstrates how to use PowerShell to invoke the API so that unenlisting and starting the orchestrations could be done atomically.
To use the script, update
$connectionString
and the expressions in $unenlisting
and $starting
variables so that they could match the assembly qualified names of the orchestrations. The script also takes one argument "test" or "trial" so that you could test out whether the expressions are correct.
### Settings of the script ### $test = $FALSE If ($args.Count -gt 0) { $test = ($args[0] -eq "test") -or ($args[0] -eq "trial") } $connectionString = "SERVER=.;DATABASE=BizTalkMgmtDb;Integrated Security=SSPI" $unenlisting = ` @( ` '^Test.*' ` ) $starting = ` @( ` '.*SubOrchestration.*' ` ) ### Initialize BizTalk catalog explorer ### add-type -assemblyName "Microsoft.BizTalk.ExplorerOM, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" $catalog = New-Object -TypeName Microsoft.BizTalk.ExplorerOM.BtsCatalogExplorer $catalog.ConnectionString = $connectionString ### Matching orchestration's assembly qualified name with the regular expressions in $unenlisting and $starting array ### If ($test) { Write-Host "TEST MODE" -foregroundcolor white Write-Host } Try { $catalog.Applications | ForEach-Object { $_.Orchestrations | ForEach-Object { $target = $_ ### -like is the wildcard operator ### -match is the regular expression operator # $unenlisting | Where-Object {($target.AssemblyQualifiedName -like $_) -and ($target.Status -ne [Microsoft.BizTalk.ExplorerOM.OrchestrationStatus]::Unenlisted)} | ForEach-Object { $unenlisting | Where-Object {($target.AssemblyQualifiedName -match $_) -and ($target.Status -ne [Microsoft.BizTalk.ExplorerOM.OrchestrationStatus]::Unenlisted)} | ForEach-Object { Write-Host "Unenlisting" $target.FullName $target.BtsAssembly.Version "..." -foregroundcolor yellow $target.Status = [Microsoft.BizTalk.ExplorerOM.OrchestrationStatus]::Unenlisted } # $starting | Where-Object {($target.AssemblyQualifiedName -like $_) -and ($target.Status -ne [Microsoft.BizTalk.ExplorerOM.OrchestrationStatus]::Started)} | ForEach-Object { $starting | Where-Object {($target.AssemblyQualifiedName -match $_) -and ($target.Status -ne [Microsoft.BizTalk.ExplorerOM.OrchestrationStatus]::Started)} | ForEach-Object { Write-Host "Starting " $target.FullName $target.BtsAssembly.Version "..." -foregroundcolor green $target.Status = [Microsoft.BizTalk.ExplorerOM.OrchestrationStatus]::Started } } } Write-Host If ($test) { $catalog.DiscardChanges() Write-Host "Changes rolled-back for test mode" -foregroundcolor white } Else { $catalog.SaveChanges() Write-Host "Changes committed" -foregroundcolor white } } Catch { $catalog.DiscardChanges() Write-Host "Changes rolled-back" -foregroundcolor red Write-Host $Error cyan } Write-Host