2011-04-07 58 views
7

我一直在使用Codeplex的PowerShell優秀的BizTalk提供程序一段時間了。然而,在我的新公司中,構建團隊並不習慣使用它,所以我需要重寫所有我方便的配置腳本以避免使用它。PowerShell BizTalk腳本無需使用BizTalk提供程序的PowerShell

我已經重新做了大部分,但我有一些問題找到如何做以下兩件事情的例子:

  1. 創建主機實例
  2. 創建發送/接收適配器左撇子

任何人都可以告訴我如何做這些事情的例子沒有BizTalk的PowerShell提供程序嗎?我已經做了一些看,現在似乎每個人都使用它。

非常感謝提前。

+0

這裏不是真正的問題,當您可以使用自定義腳本時,不願意使用BizTalk PowerShell提供程序嗎?什麼是反對意見? – 2015-01-08 08:33:20

回答

10

OK的,如果別人需要他們我完成的哈克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" 
} 
+0

PS上述腳本不適用於PowerShell 1.0,因此如果要使用它們,請升級。 – 2011-04-11 14:43:01

+1

感謝分享 – mousio 2011-04-12 19:03:02

+0

爲什麼自定義的'Write-XxxMessage'方法?爲什麼不使用內建的'Write-Error','Write-Warning','Write-Host'等。 – 2015-01-08 08:28:47

2

對於2)你應該看看Microsoft.BizTalk.ExplorerOM

使用ReceiveHandlerSendHandler應該給你你需要什麼。

但是似乎沒有辦法使用ExplorerOM控制主機實例,只有主機。這裏

+0

感謝您的回覆。我有一個腳本去做主持人。在WMI中使用MSBTS_HostSetting。儘管如此,我無法讓它與主機實例一起工作。 – 2011-04-07 13:05:50

1

即使你無法使用PowerShell的庫本身,沒有什麼阻止你檢查它的源代碼,看看它做什麼執行那些與Microsoft.BizTalk.ExplorerOM程序集進行交互的功能。

+0

感謝您的回覆。我覺得你略微錯過了這一點。我要求的是powershell示例,而不是C#示例,我可以找到很多。 – 2011-04-12 07:09:43

2

看起來你從Santhosh本傑明的腳本借來使用反射來提交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) 

我有幾個劇本我目前的工作進行了測試,發現了(通過純粹的stubbernness),您可以簡單地使用put方法的對象上,就像你在C#中使用:

$objHostSetting.Put($putOptions) 

乾杯, 查爾斯。

+0

很可能,感謝Charles – 2012-08-28 06:18:33

1

還有由Sandro Pereira一個非常有用的博客與處理GitHub上

他們似乎沒有蓋子的一個被刪除的主機,主機實例和適配器處理

而且還Tomas Restrepo集功能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()" 
     } 
    } 
} 
+1

'Delete'在PowerShell中不是支持的動詞。如果你使用Verb-Noun的PowerShell慣例,只有已知的動詞,這個Cmdlet將被稱爲'Remove-BizTalkHost'。你可以用'Get-Verb'來查找正確的動詞。 – 2015-01-08 08:31:08