ISV add-on license model

mseifert
Member Posts: 4
Hi
We have developed a Navision add-on for VMI and are designing the license structure. The license will be rather expensive that thus, we would like to be able to sell user licenses as well. We would like the license to follow the number of NAV licenses, but that is not possible, according to Microsoft. They suggested that we would write some code to accommodate it.
Have any of you experience in license models for NAV add-on and could guide us in what it possible (and practical)?
// Morten Seifert
We have developed a Navision add-on for VMI and are designing the license structure. The license will be rather expensive that thus, we would like to be able to sell user licenses as well. We would like the license to follow the number of NAV licenses, but that is not possible, according to Microsoft. They suggested that we would write some code to accommodate it.
Have any of you experience in license models for NAV add-on and could guide us in what it possible (and practical)?
// Morten Seifert
// Morten
0
Comments
-
NAV itself really does not work for this.
You can do concurrent users, but you have to store the max count somewhere. And that can be changed by a skilled SQL programmer, or anyone with a NAV Designer's License. Same deal with named users I guess. You'll have to think outside the NAV box. Maybe store it in the registry or in a dll file somewhere.
I'm a little surprised you can't have two granules in your add-on. One for user count and one for the actual software. So they would buy 10 of the user granule for your add-on and 1 of the code granule. I guess even with that there'd be a way around it. You'd be writing code to limit the number of records in a custom table with a SQL Developer / NAV Developer could remove.
Definitely an interesting challenge.0 -
We have solved it with some combination of NAV code and signed config file ("license" file) which we are generating for each customer.0
-
I like the idea of using a user granule. I have created the following code, which keeps track of sessions using my application (each object would need to called the Codeunit to check for license).
I then have a table "Pitory Setup", which holds the number of licenses allowed. However, as matttrax said, it could be modified from a SQL Server.
By using the table "License Information", I should be able to find the user granule and the number of times it has been purchased and use that number is stead of my "Pitory Setup"."Concurrent Users".
Any thoughts?OBJECT Table 6077825 Pitory User Session { OBJECT-PROPERTIES { Date=01-03-10; Time=14:17:21; Modified=Yes; Version List=; } PROPERTIES { } FIELDS { { 1 ; ;Connection ID ;Integer } { 2 ; ;User ID ;Text30 } } KEYS { { ;Connection ID,User ID ;Clustered=Yes } } FIELDGROUPS { } CODE { BEGIN END. } } OBJECT Codeunit 6077824 Pitory User Mgt. { OBJECT-PROPERTIES { Date=01-03-10; Time=11:26:51; Modified=Yes; Version List=; } PROPERTIES { OnRun=BEGIN StartSession(); END; } CODE { PROCEDURE StartSession@1000000000(); VAR PitorySetup@1000000002 : Record 6077824; Session@1000000000 : Record 2000000009; PitorySession@1000000001 : Record 6077825; TXT_ConcurrentUsersExceeded@1000000003 : TextConst 'DAN=Antallet af samtidigere brugere overskredet.\Antal brugere: %1\Antal licenser: %2'; BEGIN // Clean Sessions IF PitorySession.FINDSET(TRUE) THEN REPEAT IF NOT Session.GET(PitorySession."Connection ID") THEN PitorySession.DELETE() ELSE IF PitorySession."User ID" <> UPPERCASE(Session."User ID") THEN PitorySession.DELETE(); UNTIL PitorySession.NEXT = 0; // Insert Session.RESET(); Session.SETRANGE("My Session", TRUE); Session.FINDFIRST(); PitorySession.INIT(); PitorySession."Connection ID" := Session."Connection ID"; PitorySession."User ID" := UPPERCASE(Session."User ID"); IF NOT PitorySession.INSERT() THEN ; // OK // Count PitorySetup.GET(''); PitorySession.RESET(); IF PitorySession.COUNT() > PitorySetup."Concurrent Users" THEN ERROR(TXT_ConcurrentUsersExceeded, PitorySession.COUNT(), PitorySetup."Concurrent Users"); END; BEGIN END. } }
// Morten0 -
May be good is to add the Login date and time to the table to check these two values for change.0
-
mseifert wrote:By using the table "License Information", I should be able to find the user granule and the number of times it has been purchased and use that number is stead of my "Pitory Setup"."Concurrent Users".
But again, if this is NAV code that just looks at the License Information table instead, people like me can go in and change it. Just stick an EXIT(99999) at the top of the function that returns the max user count.
Even if it is a dll file that can be de-compiled and re-compiled. I don't know much about signing config files and how that works, but it sounds promising.0 -
mseifert wrote:I like the idea of using a user granule. I have created the following code, which keeps track of sessions using my application (each object would need to called the Codeunit to check for license).
I then have a table "Pitory Setup", which holds the number of licenses allowed. However, as matttrax said, it could be modified from a SQL Server.
I think you are making it too complex.
Start out buy acknowledging that no matter what you do, some customer will crack the code if you want to. Then work on the basis that your customers are not criminals at heart.
Now put basic code in there that counts users and give a warning. But don't go out of your way to make it hacker proof. Sure you will get some customers that try to cheat, but really most will be honest and not steal your software.
Just make it very very clear to the end user that if they exceed the user count they are in breach of contract, and have a contract that makes it worth your while to sue them if they do.David Singleton0 -
David Singleton wrote:Start out buy acknowledging that no matter what you do, some customer will crack the code if you want to.
This is true with every piece of software. Given NAV's "open source" nature, it becomes even more true. Most customer's don't have developer licenses and they would have to go through a partner to make this kind of change. Hopefully the partner(s) you would be dealing with would not do this kind of thing.0
Categories
- All Categories
- 73 General
- 73 Announcements
- 66.6K Microsoft Dynamics NAV
- 18.7K NAV Three Tier
- 38.4K NAV/Navision Classic Client
- 3.6K Navision Attain
- 2.4K Navision Financials
- 116 Navision DOS
- 851 Navision e-Commerce
- 1K NAV Tips & Tricks
- 772 NAV Dutch speaking only
- 617 NAV Courses, Exams & Certification
- 2K Microsoft Dynamics-Other
- 1.5K Dynamics AX
- 320 Dynamics CRM
- 111 Dynamics GP
- 10 Dynamics SL
- 1.5K Other
- 990 SQL General
- 383 SQL Performance
- 34 SQL Tips & Tricks
- 35 Design Patterns (General & Best Practices)
- 1 Architectural Patterns
- 10 Design Patterns
- 5 Implementation Patterns
- 53 3rd Party Products, Services & Events
- 1.6K General
- 1.1K General Chat
- 1.6K Website
- 83 Testing
- 1.2K Download section
- 23 How Tos section
- 252 Feedback
- 12 NAV TechDays 2013 Sessions
- 13 NAV TechDays 2012 Sessions