【问题标题】:How to Disable all BizTalk Hostinstances with PowerShell script如何使用 PowerShell 脚本禁用所有 BizTalk 主机实例
【发布时间】:2016-03-21 04:44:48
【问题描述】:

我正在尝试制作一个 PowerShell 脚本来停止和禁止启动所有 BizTalk 主机实例。

这段代码停止是没有问题的:

$hosts = Get-WmiObject MSBTS_HostInstance -Namespace 'root/MicrosoftBizTalkServer'
foreach($hostinst in $hosts) {
    if ( ($hostinst.ServiceState -ne 1) -and ($hostinst.ServiceState -ne 8) ) {
        Write-Host "Stop Hostinstance" $hostinst.HostName
        $hostinst.Stop()
        Write-Host "Hostinstance" $hostinst.HostName "stopped"
    }
}

但现在我正在尝试禁止所有已停止的主机实例启动。

我的第一次尝试没有出错,但什么也没做。 输出中提到了所有主机实例,但它们并未被禁用。

$hosts = Get-WmiObject MSBTS_HostInstance -Namespace 'root/MicrosoftBizTalkServer'
foreach($hostinst in $hosts) {
    if ( ($hostinst.ServiceState -eq 1) -or ($hostinst.ServiceState -eq 8) ) {
        Write-Host "disable Hostinstance" $hostinst.HostName
        $hostinst.IsDisabled = $true
        Write-Host "Hostinstance" $hostinst.HostName "is disabled"
    }
}

由于 -path 参数,我的第二次尝试出错。

$hosts = Get-WmiObject MSBTS_HostInstance -namespace 'root/MicrosoftBizTalkServer'
foreach($hostinst in $hosts) {
    if ( ($hostinst.ServiceState -eq 1) -or ($hostinst.ServiceState -eq 8) ) {
        Write-Host "disable Hostinstance" $hostinst.HostName
        Set-ItemProperty -Path $hostinst__PATH -Name IsDisabled -Value $True
        # $hostinst.IsDisabled = $true
        Write-Host "Hostinstance" $hostinst.HostName "is disabled"
    }
}

将属性IsDisabled 设置为$true$false 的正确方法是什么?

【问题讨论】:

    标签: powershell biztalk


    【解决方案1】:

    不要使用默认的 windows 服务来禁用 BizTalk 服务

    使用 WMI 获取 BizTalk 主机实例列表

    $inProcessHosts = "HostType=1"
    $nsBTS = "root/MicrosoftBizTalkServer"
    $filter = "($inProcessHosts)"     
    $hostInstances = Get-WmiObject MSBTS_HostInstance -Namespace $nsBTS -Filter $filter 
    

    在 for 每个循环中禁用项目(从 put 重定向输出)

    foreach ($hostInstance in $hostinstances)
    {
        $hostInstance.IsDisabled = $true
        $hostInstance.Put() > $null
    }
    

    编辑: 如果需要,有一种方法可以设置自动(延迟启动)

    #=== Change the startup type for BizTalk services to Automatic (Delayed Start) ===#
    get-service BTSSvc* | foreach-object -process { SC.EXE config $_.Name start= delayed-auto}
    

    来自 Technet WIKI:

    https://social.technet.microsoft.com/wiki/contents/articles/19701.biztalk-server-best-practices-create-and-configure-biztalk-server-host-and-host-instances.aspx

    【讨论】:

      【解决方案2】:

      感谢您的回答。 但是,在具有多个服务器的 BizTalk 环境中,这不能完全正常工作有两个原因。 首先,在您的解决方案中,您必须为 OTAP 中的每个环境手动配置服务器列表。使用 Get-WmiObject MSBTS_HostInstance -Namespace 'root/MicrosoftBizTalkServer' 选项,BizTalk 知道哪些服务器属于 BizTalkGroup。

      第二个(也是更重要的)当前状态是“自动(延迟启动)”。 根据几个网站,无法使用 Powershell 脚本将状态设置回自动(延迟启动)。

      我现在明白为什么 $hostinst.IsDisabled = $true 不起作用。 因为必须先保存更改。 这就是为什么我添加了一个命令来保存更改。 $script:btscatalog.SaveChanges() |外空

      不幸的是,似乎仍然没有任何改变。

      【讨论】:

      • Frank:你试过这个博客里的方法吗:metah.ch/blog/2012/09/…?它需要访问注册表。并且由于您在多服务器环境中工作,因此您需要远程访问所有这些服务器的注册表。不过还是可以的,
      • 感谢您的回答。我会试试这个选项。
      【解决方案3】:

      @Zee 很接近,但仍需要循环。这是一种方法 - 将主机名与 BTSSvc 连接

      $hosts = Get-WmiObject MSBTS_HostInstance -Namespace 'root/MicrosoftBizTalkServer'
      
      
      foreach($hostinst in $hosts) {
          if ( ($hostinst.ServiceState -ne 8) ) { # ignore isolated hosts
      
              $svcName = ('BTSSvc${0}' -f $hostinst.HostName) # get something Get-Service can work with
      
              Get-Service -Name $svcName | Stop-Service -PassThru | Set-Service -StartupType disabled        
              Write-Host "Hostinstance" $hostinst.HostName "stopped and disabled"
          }
      }
      

      如果您需要将它们设置回自动/启动:

      $hosts = Get-WmiObject MSBTS_HostInstance -Namespace 'root/MicrosoftBizTalkServer'
      
      
      foreach($hostinst in $hosts) {
          if ( ($hostinst.ServiceState -ne 8) ) { # ignore isolated hosts
      
              $svcName = ('BTSSvc${0}' -f $hostinst.HostName) # get something Get-Service can work with
      
              Get-Service -Name $svcName | Set-Service -StartupType Automatic -PassThru | Start-Service
              Write-Host "Hostinstance" $hostinst.HostName "stopped and disabled"
          }
      }
      

      还有一种方法可能更清楚:

      Get-Service | Where-Object { $_.Name.StartsWith("BTSSvc") } | Stop-Service -PassThru | Set-Service -StartupType Disabled
      

      【讨论】:

        【解决方案4】:

        BizTalk 主机实例是 Windows 服务。因此,您可以使用 powershell 的 Get-Service cmdlet 来停止和禁用它。

        假设您的主机名是 BizTalkServerApplication

        然后下面的脚本将完成这项工作:

        Get-Service -Name BTSSvc`$BizTalkServerApplication  | Stop-Service -PassThru | Set-Service -StartupType disabled
        

        还要注意“$”被转义为“`$”

        【讨论】:

          猜你喜欢
          • 2014-10-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多