2011-04-07 5 views
7

나는 잠시 동안 Codeplex에서 우수한 BizTalk Provider for PowerShell을 사용해 왔습니다. 그러나 새 회사에서는 빌드 팀이 사용하기가 쉽지 않으므로 사용하지 않기 위해 모든 편리한 구성 스크립트를 다시 작성해야합니다.PowerShell PowerShell 용 BizTalk 공급자를 사용하지 않는 BizTalk 스크립트

나는 그들의 대부분을 다시 수행했지만 다음 두 가지를 수행하는 방법의 예를 찾는 몇 가지 문제가 오전

: 어댑터 투수에게 수신/

  • 보내기를 만들기

    1. 만들기 호스트 인스턴스를

    누구든지 BizTalk 용 PowerShell 공급자없이 이러한 작업을 수행하는 방법에 대한 예제를 알려줄 수 있습니까? 나는 약간의보고를했고 그것은 모두가 지금 이것을 사용하는 것처럼 보인다.

    미리 감사드립니다.

    2의
  • +0

    사용자 지정 스크립팅을 사용할 수있을 때 BizTalk PowerShell 공급자를 사용하는 것이 실제적인 문제가 아닙니까? 이의는 무엇입니까? –

    답변

    10

    확인 여기 내 완성 해키 파워 쉘의 기능은 다음과 같습니다 당신이 파워 쉘 라이브러리 자체를 사용할 수없는 경우에도

    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에서 작동하지 않으므로 사용하려면 업그레이드하십시오. –

    +1

    공유 해 주셔서 감사합니다. – mousio

    +0

    왜 커스텀'Write-XxxMessage' 메소드가 필요합니까?왜'Write-Error','Write-Warning','Write-Host' 등의 내장 명령을 사용하지 않으시겠습니까? –

    2

    ) 당신은 당신이 필요로하는 무엇을 제공해야 ReceiveHandlerSendHandler를 사용 Microsoft.BizTalk.ExplorerOM

    으로 보일 것입니다.

    그러나 ExplorerOM을 사용하는 호스트 인스턴스 만 제어 할 수있는 방법은 없습니다. 다른 사람이 그들을 필요로하는 경우

    +0

    답변 해 주셔서 감사합니다. 호스트를 할 수있는 스크립트가 있습니다. WMI에서 MSBTS_HostSetting을 사용합니다. 내가 호스트 인스턴스와 함께 작동하도록 할 수 없습니다. –

    1

    를, 아무것도 그것이 무엇을보고 소스를 검사에서 당신을 중지하지 않습니다 Microsoft.BizTalk.ExplorerOM 어셈블리와 상호 작용하는 해당 기능을 수행합니다.

    [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을 통해) 알게 당신이 간단하게 할 수 있습니다 당신이 반사를 사용하여 PutOptions 제출 Santhosh 벤자민의 스크립트에서 차용처럼

    +0

    답변 해 주셔서 감사합니다. 나는 당신이 약간의 요점을 놓치고 있다고 느낀다. 나는 powershell 샘플을 요구했지만 C# 샘플은 찾지 못했다. –

    2

    이 보이는 당신은 C#에서 사용 된 것처럼, 개체에 올리기 방법을 사용하십시오

    $objHostSetting.Put($putOptions) 
    

    건배, 찰스.

    +0

    아마도 Charles에게 감사합니다. –

    1

    GitHub의

    가 커버에 보이지 않았다 하나는 삭제 된에 호스트, 호스트 인스턴스 및 어댑터 처리기

    또한 Tomas Restrepo 세트를 처리하는 기능을 Sandro Pereira에 의해 매우 유용한 블로그가있다 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'를 사용하여 올바른 동사를 찾을 수 있습니다. –

    관련 문제