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

时间:2016-04-14 11:54:44

标签: powershell scripting biztalk

我有以下代码来获取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

3 个答案:

答案 0 :(得分:2)

如果你没有安装BizTalk WMI / ExplorerOM或者不能(考虑一下 - 你试图在那里显式加载Microsoft.BizTalk.ExplorerOM dll),你只需要一个{ {1}} - 但请注意,这比使用OM更脆弱,可能会破坏新版本,应该在生产中极其谨慎使用等等......如果有动态发送端口在运行,它也可能无法工作(我目前没有任何部署用于测试)。

Invoke-Sqlcmd

请注意,您可以通过取消注释sql字符串中的$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'} 子句来限制SQ​​L级别的结果。

请注意,如果您真的只想要应用程序并且不关心其状态,则此查询可以非常简化 - 它只是WHERE

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

远程处理应该有效。你确定你没有遇到“双跳”问题吗?如果您的SQL Server位于除ServerB之外的另一台计算机上,您将获得匿名登录的登录失败而不是您正在使用的用户帐户。查看https://technet.microsoft.com/en-us/library/hh849872.aspx以确保将您的凭据委派给SQL服务器。您应该允许您的客户端发送凭据并允许服务器接收凭据。通过将您的凭据添加到Invoke-Command,它应该可以工作。