如何从另一台服务器远程获取 Biztalk 应用程序列表

How to get list of Biztalk applications from another server remotely

我有下面的代码来获取 ServerB 中的 Biztalk 应用程序。如果我 运行 它在服务器 B 中工作正常。我如何 运行 来自 ServerA 的相同脚本并从 ServerB 获取 Biztalk 应用程序。远程调用命令似乎不起作用。

# Get local BizTalk DBName and DB Server from WMI
$btsSettings = get-wmiobject MSBTS_GroupSetting -namespace 'root\MicrosoftBizTalkServer'
$dbInstance = $btsSettings.MgmtDbServerName
$dbName = $btsSettings.MgmtDbName

# Load BizTalk ExplorerOM
[void] [System.reflection.Assembly]::LoadWithPartialName("Microsoft.BizTalk.ExplorerOM")
$BizTalkOM = New-Object Microsoft.BizTalk.ExplorerOM.BtsCatalogExplorer
$BizTalkOM.ConnectionString = "SERVER=$dbInstance;DATABASE=$dbName;Integrated Security=SSPI"

$apps = $BizTalkOM.Applications | Select-Object Name,Status | Where-Object {$_.name -in 'BT.Order.CustomerOrder','BT.Order.FControl'}
$apps

要在任何计算机上运行 该脚本,必须安装 BizTalk WMI 组件。 WMI 组件随 BizTalk Server 管理工具一起安装,因此您至少需要安装这些组件。

然后,只需更改连接字符串以指向您需要的任何管理数据库。

如果您没有安装或无法安装 BizTalk WMI/ExplorerOM(想一想 - 您正试图在其中显式加载 Microsoft.BizTalk.ExplorerOM dll),您可以通过只有一个 Invoke-Sqlcmd - 但请注意,这比使用 OM 更脆弱,可能会破坏新版本,在生产中应格外小心使用,等等......如果有动态发送,它也可能不起作用正在运行的端口(我目前没有部署任何要测试的端口)。

$sql = "SELECT app.nvcName as Name,
    CASE
        WHEN SUM(o.nOrchestrationStatus) IS NULL AND SUM(r.Disabled) IS NULL AND SUM(sprt.nPortStatus) IS NULL  THEN 'N/A'
        WHEN SUM(CASE WHEN o.nOrchestrationStatus IS NULL THEN 3 ELSE o.nOrchestrationStatus END) = COUNT(*) * 3 AND SUM(CASE WHEN r.Disabled IS NULL THEN 0 ELSE r.Disabled END) = 0          AND sum(CASE WHEN sprt.nPortStatus IS NULL THEN 3 ELSE sprt.nPortStatus END) = count(sprt.nPortStatus) * 3  THEN 'Started' 
        WHEN SUM(CASE WHEN o.nOrchestrationStatus IS NULL THEN 1 ELSE o.nOrchestrationStatus END) = count(*)     AND SUM(CASE WHEN r.Disabled IS NULL THEN -1 ELSE r.Disabled END) = -COUNT(*) AND sum(CASE WHEN sprt.nPortStatus IS NULL THEN 1 ELSE sprt.nPortStatus END) = count(*) THEN 'Stopped'       
        ELSE 'Partially Started' 
    END as Status
FROM bts_application app WITH(NOLOCK)
LEFT JOIN (
    SELECT asm.nApplicationID, orch.nvcName, orch.nOrchestrationStatus FROM bts_assembly asm WITH(NOLOCK)
    inner join bts_orchestration orch WITH(NOLOCK)
    on asm.nid = orch.nAssemblyID) o
ON o.nApplicationID = app.nID

LEFT JOIN bts_sendport sprt with(nolock)
ON sprt.nApplicationID = app.nID

LEFT JOIN (
    select rprt.nApplicationID, rprt.nvcName as rprtName, rloc.Name as rlocName, rloc.Disabled from bts_receiveport rprt with(nolock)
    INNER JOIN  adm_ReceiveLocation rloc with(nolock)
    on rprt.nID = rloc.ReceivePortId) r
on r.nApplicationID = app.nid

--WHERE app.nvcName IN ('BT.Order.CustomerOrder','BT.Order.FControl')
GROUP BY app.nvcName"

Invoke-Sqlcmd -ServerInstance 'localhost' -Database 'BizTalkMgmtDb' -Query $sql | Where-Object { $_.Name -in 'BT.Order.CustomerOrder','BT.Order.FControl'}

请注意,您也可以通过取消注释 sql 字符串中的 WHERE 子句来限制 SQL 级别的结果。

请注意,如果您真的只需要应用程序而不关心它们的状态,则可以极大地 简化此查询 - 就像 Select nvcName from bts_application.

远程处理应该有效。您确定不 运行 进入 "double hop" 问题吗?如果您的 SQL 服务器在 ServerB 之外的另一台机器上,您将会这样做(您将因匿名登录而不是您正在使用的用户帐户而登录失败)。查看 https://technet.microsoft.com/en-us/library/hh849872.aspx 以确保将您的凭据委托给 SQL 服务器。您应该允许您的客户端发送凭据并允许服务器接收凭据。通过将您的凭据添加到 Invoke-Command,它应该可以工作。