Retrieve the BTSNTSvc.exe PID with PowerShell

Again another post in the series of more advanced things you can do with the PowerShell provider for BizTalk.

When debugging BizTalk solutions you find yourself many times in a situation where you need to attach the Visual Studio debugger to the running BizTalk host instance. This is very easy to do. In Visual Studio you simply select ‘Debug’ then ‘Attach to Process’. From the dialog you select the ‘BTSNTSvc.exe’ process and finally click the ‘Attach’ button.


It gets a little more tricky when you have multiple host instances running on your development box. The dialog now shows all host instances and you need to pick the one running the artifact (pipeline component, orchestration, etc.) that you want to debug. The bad thing is that there is no readable name displayed and the only property that distinguishes between the instances is the PID (column: ID). So how do you know how to pick the correct one and go on debugging?

There are basically two approaches:

– You select all the ‘BTSNTSvc.exe’ process in order to attach the debugger to all of them.

– You use some tooling to find out the PID.

Although the first option works, it is not the best solution. Attaching to all processes takes more time and resources so it is better to just pick the right one.

Now this is nothing new and there have been a number of smart people that blogged about methods to find out the PID for a host instance. Samples are here and here.

In this post I want to show the PowerShell way of doing this.

When I use the ‘Get-ChildItems’ cmdlet on the host instances container PowerShell shows a list of ‘BTSHostInstance’ objects in the console:


Since the process id is not a property of the ‘BTSHostInstance’ object it is not shown in the list.

Fortunately the nice thing about PowerShell is that you can extend properties with extra members using the Add-Member cmdlet. In the script below I create a function that adds a a property containing the process id to every non isolated host.

function GetHostPID
    Get-ChildItem -Path 'Biztalk:\Platform Settings\Host Instances' | ForEach-Object {

        if ($_.HostType -ne 'Isolated')
            [string]$a = (Get-WmiObject Win32_Process -filter "CommandLine Like '%$($_.HostName)%'").ProcessId
            $_ | Add-Member -MemberType NoteProperty -Name PID -Value $a
            Write-Output $_
    } | Format-Table PID, Name, HostName, NTGroupName, RunningServer, HostType, ServiceState

When I execute the function I get a nice list similar to the list above but with the PID added to every row:


I can add this function to my function library so it loads automatically on startup and is always available in my PowerShell console.

Of course you can do this without the PowerShell provider for BizTalk and use WMI only. In that case it would be hard and require far more lines of code to get a nice formatted list like show above.


5 Responses to Retrieve the BTSNTSvc.exe PID with PowerShell

  1. […] Retrieve the BTSNTSvc.exe PID with PowerShell […]

  2. […] Retrieve the BTSNTSvc.exe PID with PowerShell « BizTalk Messages This entry was posted in BizTalk, Development. Bookmark the permalink. ← TeamViewer – kostenlose Fernwartung und Remote Desktop Sharing per Internet Azure Integration with BizTalk ESB by Brian Loesgen → […]

  3. Brett says:

    A simpler, if less pretty, way of finding the correct PID is to use the inbuilt ‘tasklist’ command.
    No scripts, no powershell requirements, works on all versions of BizTalk.

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: