Monthly Archives: November 2019

Your program license does not permit more users to work simultaneously

Today I was asked by a customer how many times the maximum concurrent users license limit was reached. Interesting question in my opinion. Why? Because I reminded in the past I saw an Application Log warning event about this but I wasn’t sure. So I did some research in my lab Nav 2017 environment. First I reproduced the error by logging on a multiple users. The license limit was reached. Message:

Your program license does not permit more users to work simultaneously. Wait until another user has stopped using the program. Contact your system administrator if you want to allow more simultaneous users on your system
Warning the user will see when the Nav License limit has been reached.

Full warning text: Your program license does not permit more users to work simultaneously. Wait until another user has stopped using the program. Contact your system administrator if you want to allow more simultaneous users on your system

We all probably know this message, right? If not you now know. Now I checked the application logs on the service tier machine and yes… the above message has also been logged on the server in the application log:

Server instance: NST100TestCronus
Category: License
ClientSessionId: 7b6b163b-5c54-471f-b4b9-1809614cb7a3
ClientActivityId: bec67c3b-9fe6-43aa-b7be-a41dd02d2d53
ServerSessionUniqueId: ad7a2e4a-4a96-4fc8-b098-58ede70f4571
ServerActivityId: 4245b653-fb6d-4288-aaa2-2f284c1a3465
EventTime: 11/05/2019 14:44:19
Message (NavLicenseViolationException): Your program license does not permit more users to work simultaneously. Wait until another user has stopped using the program. Contact your system administrator if you want to allow more simultaneous users on your system.
ExceptionStackTrace:

CallerStackTrace:
at Microsoft.Dynamics.Nav.Runtime.NavLicenseValidator.ValidateUsersHasAnActiveConnectionOrThereIsRoomForOneMore(NavSession session)
at Microsoft.Dynamics.Nav.Runtime.NavLicenseValidator.ValidateLicenseForNewSession(NavSession session)
at Microsoft.Dynamics.Nav.Runtime.NavSession.Open(Boolean useUserPersonalization, Byte[] licenseToUse, Boolean allowAppsDisabledMode)
at Microsoft.Dynamics.Nav.Service.NSService.OpenConnection(ConnectionRequest connectionRequest)
at SyncInvokeOpenConnection(Object , Object[] , Object[] )
at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
at Microsoft.Dynamics.Nav.Service.ServiceOperationInvoker.ErrorMappingCombinator(ServiceOperation innerOperation, NSServiceBase serviceInstance, String syncMethodName, Object[] inputs, Object[]& outputs)
at Microsoft.Dynamics.Nav.Service.ServiceOperationInvoker.<>c__DisplayClass23_0.b__1(NSServiceBase serviceInstance, Object[] inputs, Object[]& outputs)
at Microsoft.Dynamics.Nav.Service.ServiceOperationInvoker.PushPopCombinator(ServiceOperation innerOperation, NSServiceBase serviceInstance, String syncMethodName, Object[] inputs, Object[]& outputs)
at Microsoft.Dynamics.Nav.Service.ServiceOperationInvoker.<>c__DisplayClass23_0.b__1(NSServiceBase serviceInstance, Object[] inputs, Object[]& outputs)
at Microsoft.Dynamics.Nav.Service.ServiceOperationInvoker.CreateNewSessionCombinator(ServiceOperation innerOperation, NSServiceBase serviceInstance, Boolean requireNavUser, Object[] inputs, Object[]& outputs)
at Microsoft.Dynamics.Nav.Service.ServiceOperationInvoker.<>c__DisplayClass23_0.b__1(NSServiceBase serviceInstance, Object[] inputs, Object[]& outputs)
at Microsoft.Dynamics.Nav.Service.ServiceOperationInvoker.<>c__DisplayClass8_0.b__0()
at Microsoft.Dynamics.Nav.Runtime.NavPerformanceCounterSetter.UpdatePerformanceCountersWithAverageServiceOperationDuration(Stopwatch stopWatch, Action action)
at Microsoft.Dynamics.Nav.Runtime.NavPerformanceCounterSetter.UpdatePerformanceCountersWithAverageServiceOperationAction(Action action, NavSession session)
at Microsoft.Dynamics.Nav.Service.ServiceOperationInvoker.PerformanceCounterCombinator(ServiceOperation innerOperation, NSServiceBase serviceInstance, String syncMethodName, Object[] inputs, Object[]& outputs)
at Microsoft.Dynamics.Nav.Service.ServiceOperationInvoker.<>c__DisplayClass23_0.b__1(NSServiceBase serviceInstance, Object[] inputs, Object[]& outputs)
at Microsoft.Dynamics.Nav.Service.ServiceOperationInvoker.InitClientTelemetryIdsCombinator(ServiceOperation innerOperation, NSServiceBase serviceInstance, String syncMethodName, Object[] inputs, Object[]& outputs)
at Microsoft.Dynamics.Nav.Service.ServiceOperationInvoker.<>c__DisplayClass23_0.b__1(NSServiceBase serviceInstance, Object[] inputs, Object[]& outputs)
at Microsoft.Dynamics.Nav.Service.ServiceOperationInvoker.TlsClearCombinator(ServiceOperation innerOperation, NSServiceBase serviceInstance, String syncMethodName, Object[] inputs, Object[]& outputs)
at Microsoft.Dynamics.Nav.Service.ServiceOperationInvoker.<>c__DisplayClass23_0.b__1(NSServiceBase serviceInstance, Object[] inputs, Object[]& outputs)
at Microsoft.Dynamics.Nav.Service.ServiceOperationInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)
at System.ServiceModel.Dispatcher.MessageRpc.Wrapper.Resume(Boolean& alreadyResumedNoLock)
at System.ServiceModel.Dispatcher.ThreadBehavior.ResumeProcessing(IResumeMessageRpc resume)
at Microsoft.Dynamics.Nav.Runtime.NavSynchronizationContext.<>c__DisplayClass1_0.b__0(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
at System.Threading.ThreadPoolWorkQueue.Dispatch()


ProcessId: 6572
Tag: 00000IA
ThreadId: 6
CounterInformation:

Eventviewer warning when the license limit has been reached.

Very useful information in my opinion, because if you filter on this type of message you could report to your application administrator to maybe buy more licenses for example. You don’t want complaining users right? This is a very good basis to ask for more licences if the limit is reached regularly.

To summarize: filter on Event ID 705 on the service tier machine to get all the Warning events. These events are related to Nav license limits which has been reached.

Maybe a useful tip: instead of reactive checking of the application log you could attach a task to this ‘event’. This task could be something like starting a program or sending an email for example.