2011-04-07 19 views
7

He estado usando el excelente proveedor BizTalk para PowerShell de Codeplex desde hace un tiempo. Sin embargo, en mi nueva compañía, el equipo de desarrollo no se siente cómodo al usarlo, así que necesito volver a escribir todos mis guiones de configuración prácticos para no usarlo.Guiones de PowerShell BizTalk SIN el proveedor de BizTalk para PowerShell

he vuelto a hacer la mayor parte de ellos, pero estoy teniendo algunos problemas para encontrar ejemplos de cómo hacer las dos cosas siguientes:

  1. Crear instancias de host
  2. Crear envío/recepción zurdos adaptador

¿Alguien me puede indicar ejemplos de cómo hacer estas cosas SIN el proveedor de PowerShell para BizTalk, por favor? He hecho algunas búsquedas y parece que todos usan esto ahora.

Muchas gracias de antemano.

+0

¿No es el verdadero problema aquí la renuencia a utilizar el proveedor de BizTalk PowerShell, cuando puede utilizar scripts personalizados? ¿Cuáles son las objeciones? –

Respuesta

10

bien aquí están mis terminados funciones powershell hacky si alguien más los necesita:

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

PD las secuencias de comandos anteriores no funcionarán con PowerShell 1.0 así que actualícela si desea usarlas. –

+1

Gracias por compartir – mousio

+0

¿Por qué los métodos personalizados 'Write-XxxMessage'?¿Por qué no usas los comandos 'Write-Error',' Write-Warning', 'Write-Host', etc.? –

2

Para 2) usted debe buscar en Microsoft.BizTalk.ExplorerOM

Usando ReceiveHandler y SendHandler debe darle lo que necesita.

Sin embargo, parece que no hay forma de controlar las instancias del host, solo los hosts, usando ExplorerOM.

+0

Gracias por su respuesta. Tengo un script para hacer los hosts. Utiliza MSBTS_HostSetting en WMI. Sin embargo, no puedo hacer que funcione con las instancias de host. –

1

Incluso si usted no puede utilizar la biblioteca de Powershell en sí, nada le impide examinar su fuente para ver lo que hace para realizar esas funciones, que es interactuar con el ensamblado Microsoft.BizTalk.ExplorerOM.

+0

Gracias por su respuesta. Sin embargo, creo que te estás perdiendo el punto. Estaba pidiendo muestras de Powershell, no muestras de C#, de las cuales puedo encontrar muchas. –

2

Parece que tomó prestado de los guiones de Santhosh Benjamin presentar los PutOptions utilizando la reflexión:

[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) 

He probado esto con varios guiones Actualmente estoy trabajando en, y descubrí (por pura stubbernness) que pueda simplemente utilizar el método put sobre el objeto, del mismo modo que estábamos acostumbrados en C#:

$objHostSetting.Put($putOptions) 

Cheers, Charles.

+0

Muy posiblemente, gracias a Charles –

1

También hay un blog muy útil por Sandro Pereira con funciones para el manejo de los ejércitos, las instancias de host y controladores de adaptador

Y también Tomas Restrepo conjunto en GitHub

El único que no parecía que la portada fue borrando una Host de 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

'Eliminar' no es un verbo compatible en PowerShell. Si utilizó la convención de PowerShell de Verb-Noun, con solo verbos conocidos, este Cmdlet se llamaría 'Remove-BizTalkHost'. Puede buscar los verbos correctos usando 'Get-Verb'. –

Cuestiones relacionadas