2016-04-14 3 views
2

Ich habe den folgenden Code, um die BizTalk-Anwendungen in ServerB zu erhalten. funktioniert gut, wenn ich es in Server B ausführen. Wie kann ich das gleiche Skript von ServerA ausführen und die BizTalk-Anwendungen von ServerB abrufen. Invoke-Command Remoting scheint nicht zu funktionieren.So erhalten Sie eine Liste von BizTalk-Anwendungen von einem anderen Server remote

# 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 
+0

Auf ServerA, haben Sie auch BizTalk installiert? –

+0

Nein, ich habe BizTalk nicht in ServerA installiert. – medinibster

Antwort

2

Wenn Sie BizTalk WMI/ExplorerOM nicht installiert haben oder nicht (denken Sie daran - Sie versuchen, die Microsoft.BizTalk.ExplorerOM DLL dort explizit zu laden), könnten Sie mit nur einem Invoke-Sqlcmd - aber beachten Sie, dass dies fragiler ist als die Verwendung des OM, könnte mit neuen Versionen brechen, sollte mit äußerster Vorsicht in der Produktion verwendet werden, etc ... Es funktioniert möglicherweise auch nicht, wenn es dynamische Send-Ports im Spiel gibt (I don ' t haben derzeit keine zum Testen bereitgestellt.

$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'} 

Beachten Sie, dass Sie die Ergebnisse auf SQL-Ebene durch uncommenting die WHERE-Klausel in der SQL-Zeichenfolge als auch begrenzen könnte.

Und beachten Sie, dass diese Abfrage kann erheblich vereinfacht werden, wenn Sie wirklich nur Anwendungen wollen und nicht über ihre Status - es wäre nur etwas wie Select nvcName from bts_application.

+0

Hallo Dan, ich habe dies in Server A ausgeführt und jetzt habe ich den folgenden Fehler: Invoke-Sqlcmd: Beim Herstellen einer Verbindung zu SQL Server ist ein netzwerkbezogener oder instanzspezifischer Fehler aufgetreten. Der Server wurde nicht gefunden oder war nicht erreichbar. Stellen Sie sicher, dass der Instanzname korrekt ist und , dass SQL Server für Remoteverbindungen konfiguriert ist. (Anbieter: Named Pipes Provider, Fehler: 40 - Verbindung zu SQL Server konnte nicht hergestellt werden) At-Zeile: 27 Zeichen: 1 – medinibster

+0

Stellen Sie sicher, dass der SQL Server, mit dem Sie eine Verbindung herstellen möchten, Remoteverbindungen zulässt und über Zugriffsrechte verfügt verbinden (und Sie haben den Server/Instanznamen korrekt). –

+0

Siehe http://stackoverflow.com/questions/1975780/sql-server-enable-remote-connections-without-ssms –

1

Um dieses Skript auf einem beliebigen Computer auszuführen, müssen die BizTalk WMI-Komponenten installiert sein. Die WMI-Komponenten werden mit den BizTalk Server-Verwaltungstools installiert, sodass Sie diese mindestens installieren müssen.

Dann ändern Sie einfach die Verbindungszeichenfolge, um auf die von Ihnen benötigte Verwaltungsdatenbank zu verweisen.

0

Remoting sollte funktionieren. Bist du sicher, dass du nicht auf das "Double Hop" Problem stößt? Sie werden, wenn Ihr SQL Server auf einem anderen Computer als ServerB ist (Sie erhalten eine Anmeldung für eine anonyme Anmeldung anstelle des Benutzerkontos, mit dem Sie arbeiten). Sehen Sie sich https://technet.microsoft.com/en-us/library/hh849872.aspx an, um sicherzustellen, dass Sie Ihre Anmeldeinformationen an den SQL-Server delegieren. Sie sollten Ihrem Client ermöglichen, die Anmeldeinformationen zu senden und dem Server zu ermöglichen, die Anmeldeinformationen zu erhalten. Wenn Sie Ihre Anmeldeinformationen zum Invoke-Befehl hinzufügen, sollte es funktionieren.

Verwandte Themen