If you have been using the Dotnet ClickOnce technology to roll out your Dynamics NAV / 365 Business Central Windows Clients, you know it have some limitations (click here to read all about the limitations).
But if you start pulling the ClickOnce technology apart, you will find that the client files are in fact present on your harddrive, but in a obscure directory – which can be hard to locate (actually you can just start the client and go to task manager. Right click the running program and select to open the directory).
What if someone could make a small program or script that would locate all installed ClickOnce Dynamics NAV / 365 Business Central Windows Clients, present you with a list to choose from and then simply start the selected client with the appropriate parameters?
Maybe we can even register this small program or script as the protocol handler for the DynamicsNAV:// protocol?
Well, here is my first attempt of a PowerShell script I call NAVBCProtocolHandlerHelper.ps1 :-):
# Version: 2019-08-06
$SearchPath = "C:\Users\$($env:UserName)\AppData\Local\Apps\2.0\"
$WindowsClientFileName = "Microsoft.Dynamics.Nav.Client.exe"
$ClientUserSettingsFileName = "ClientUserSettings.config"
if(($args[0] -eq "?") -or ($args[0] -eq "-?") -or ($args[0] -eq "-h") -or ($args[0] -eq "-help")) {
Write-Host "#######################################################################" -ForegroundColor Cyan
Write-Host "# Microsoft Dynamics NAV/365 Business Central Protocol Handler Helper #" -ForegroundColor Cyan
Write-Host "#######################################################################" -ForegroundColor Cyan
Write-Host "# Copyright 2019, Gert Lynge, www.dabbler.dk #" -ForegroundColor Cyan
Write-Host "#######################################################################" -ForegroundColor Cyan
Write-Host "# This script is free to use, modify and distribute as long as these #" -ForegroundColor Cyan
Write-Host "# lines are kept intact. NO WARRANTY! Use at your own risk! #" -ForegroundColor Cyan
Write-Host "#######################################################################" -ForegroundColor Cyan
Write-Host ""
Write-Host "Examples:" -ForegroundColor Cyan
Write-Host ""
Write-Host "Install NAV/365BC Protocol Handler:" -ForegroundColor Cyan
Write-Host "$($MyInvocation.MyCommand.Definition) -InstallProtocolHandler"
Write-Host "Be warned: This will override any existing DynamicsNAV:// protocol handler" -ForegroundColor Red
Write-Host ""
Write-Host "Remove NAV/365BC Protocol Handler:" -ForegroundColor Cyan
Write-Host "$($MyInvocation.MyCommand.Definition) -RemoveProtocolHandler"
Write-Host "Be warned: This will remove any DynamicsNAV:// protocol handler installed" -ForegroundColor Red
Write-Host ""
Write-Host "Show list of NAV/365BC ClickOnce Windows Clients and let you select one to start:" -ForegroundColor Cyan
Write-Host "$($MyInvocation.MyCommand.Definition)"
Write-Host ""
Write-Host "Show this help page:" -ForegroundColor Cyan
Write-Host "$($MyInvocation.MyCommand.Definition) -help"
exit
}
elseif(($args[0] -eq "InstallProtocolHandler") -or ($args[0] -eq "-InstallProtocolHandler")) {
$currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())
if(-not $currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
Throw "Installing the DynamicsNAV:// Protocol handler requires this script to be run as Administrator"
}
New-PSDrive -Name HKCR -PSProvider Registry -Root "HKEY_CLASSES_ROOT" -ErrorAction SilentlyContinue | Out-Null
New-Item -Path "HKCR:\DynamicsNAV" -Force | Out-Null
New-ItemProperty -Path "HKCR:\DynamicsNAV" -Name "(Default)" -Value "Dynamics NAV Protocol" -Force | Out-Null
New-ItemProperty -Path "HKCR:\DynamicsNAV" -Name "URL Protocol" -Force | Out-Null
New-Item -Path "HKCR:\DynamicsNAV\DefaultIcon" -Force | Out-Null
New-ItemProperty -Path "HKCR:\DynamicsNAV\DefaultIcon" -Name "(Default)" | Out-Null
New-Item -Path "HKCR:\DynamicsNAV\Shell" -Force | Out-Null
New-ItemProperty -Path "HKCR:\DynamicsNAV\Shell" -Name "(Default)" | Out-Null
New-Item -Path "HKCR:\DynamicsNAV\Shell\Open" -Force | Out-Null
New-ItemProperty -Path "HKCR:\DynamicsNAV\Shell\Open" -Name "(Default)" | Out-Null
New-Item -Path "HKCR:\DynamicsNAV\Shell\Open\Command" -Force | Out-Null
New-ItemProperty -Path "HKCR:\DynamicsNAV\Shell\Open\Command" -Name "(Default)" -Value "PowerShell.exe -WindowStyle Hidden -File ""$($MyInvocation.MyCommand.Definition)"" ""%1""" | Out-Null
Write-Host "Protocol Handler DynamicsNAV:// installed" -ForegroundColor Green
exit
}
elseif(($args[0] -eq "RemoveProtocolHandler") -or ($args[0] -eq "-RemoveProtocolHandler")) {
$currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())
if(-not $currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
Throw "Removing the DynamicsNAV:// Protocol handler requires this script to be run as Administrator"
}
New-PSDrive -Name HKCR -PSProvider Registry -Root "HKEY_CLASSES_ROOT" -ErrorAction SilentlyContinue | Out-Null
Remove-Item -Path "HKCR:\DYNAMICSNAV" -Recurse -Force | Out-Null
Write-Host "Protocol Handler DynamicsNAV:// removed" -ForegroundColor Green
exit
}
$WindowsClients = New-Object System.Data.DataTable
$WindowsClients.Columns.Add("Product","System.String") | Out-Null
$WindowsClients.Columns.Add("Server","System.String") | Out-Null
$WindowsClients.Columns.Add("Port","System.String") | Out-Null
$WindowsClients.Columns.Add("Instance","System.String") | Out-Null
$WindowsClients.Columns.Add("Tenant","System.String") | Out-Null
$WindowsClients.Columns.Add("Authentication","System.String") | Out-Null
$WindowsClients.Columns.Add("Version","System.Version") | Out-Null
$WindowsClients.Columns.Add("Path","System.String") | Out-Null
foreach($File in Get-ChildItem -Path "$SearchPath$WindowsClientFileName" -Recurse | Select-Object FullName) {
$Path = (Split-Path -Path $File.FullName -Parent)
if(Test-Path "$Path\$ClientUserSettingsFileName" -PathType Leaf) {
[xml]$XmlDocument = Get-Content -Path "$Path\$ClientUserSettingsFileName"
$ChildNodes = $XmlDocument.configuration.appSettings.ChildNodes
$WindowsClient = $WindowsClients.NewRow()
$WindowsClient.Path = $Path
$WindowsClient.Version = [System.Version][System.Diagnostics.FileVersionInfo]::GetVersionInfo($File.FullName).FileVersion
$WindowsClient.Server = ($ChildNodes | Where-Object {($_.key -eq "Server")}).value
$WindowsClient.Port = ($ChildNodes | Where-Object {($_.key -eq "ClientServicesPort")}).value
$WindowsClient.Instance = ($ChildNodes | Where-Object {($_.key -eq "ServerInstance")}).value
$WindowsClient.Tenant = ($ChildNodes | Where-Object {($_.key -eq "TenantId")}).value
$WindowsClient.Authentication = ($ChildNodes | Where-Object {($_.key -eq "ClientServicesCredentialType")}).value
$WindowsClient.Product = ($ChildNodes | Where-Object {($_.key -eq "ProductName")}).value
$WindowsClients.Rows.Add($WindowsClient)
}
}
$WindowsClients = $WindowsClients | Group-Object -Property Server,ClientServicesPort,ServerInstance,TenantId | `
foreach { $_.Group | Sort-Object @{Expression="Version";Descending="$True"} | Select-Object -First 1 }
$Picked = $WindowsClients | Out-GridView -PassThru -Title "Select which Microsoft Dynamics NAV/365 Business Central ClickOnce Windows Client to run"
if(-not $Picked) {
exit
}
$Command = "$($Picked.Path)\$WindowsClientFileName"
if($args[0]) {
& "$Command" "-protocolhandler" $args[0]
}
else {
& "$Command"
}
Please run NAVBCProtocolHandlerHelper.ps1 from a powershell CLI with the -help parameter and read the possibilities. It has five ways of running:
- Show the help:
NAVBCProtocolHandlerHelper.ps1 -help - Install itself as the DynamicsNAV:// protocol handler (OVERWRITING the existing one):
NAVBCProtocolHandlerHelper.ps1 -InstallProtocolHandler - Remove ANY DynamicsNAV:// protocol handler (also ones the script did not install itself):
NAVBCProtocolHandlerHelper.ps1 -RemoveProtocolHandler - Show list of installed ClickOnce Windows Clients for Dynamics NAV/365 Business Central and lets you choose one. The chosen one is started:
NAVBCProtocolHandlerHelper.ps1 - Started through the DynamicsNAV:// protocol.
A list of installed ClickOnce Windows Clients for Dynamics NAV/365 Business Central will be shown. When you chose one, it is started and the URL is passed as a parameter to it (just like if it was called directly from the protocol handler):
DynamicsNAV://<your parameters>
This is still work in progress and can be improved in many ways. Feel free to send me your comments and wishes.
You can use and modify this free of charge as long as you keep the blocks shown in the help intact.
This is completely without any warranty of any kind – so use at your own risk!
Parameters and functionalities are subject to changes as this is work in progress.






