Activation Issues (TurboActivate Wizard says activated, app says not)?Solved

TurboActivate.dll/.exe version: 4.0.9.6DaysBetweenChecks = 7;GracePeriodLength = 30;

(Our software has three builds with their own TurboActivate.dat files: Live, Beta and Test.)

We're getting issues coming in from one of our corporate customers. Our software is reporting not registered on installs that have been in place since late last year or early this year. They re-run TurboActivate.exe and receive the "activation successful" message. However, on the next heartbeat, our software is reporting not registered again.

I deactivated their product key on my dashboard and reran TurboActiviate.exe; which reports the "activation successful" message. However, their product key was not reactivated on my dashboard. I then revoked, and then deleted the product key altogether and TurboActiviate.exe still reports the "activation successful".

Next, I reinstalled the Beta build of our software that the customer had installed earlier this year -- the product key for which has been deleted for ~6 months: TurboActiviate.exe reports the "activation successful" message. Shenanigans! Of course, our software reports not activated.

Finally, I installed an internal Test build that has never been installed on the customer's computer before and used my "floating" product key, and everything activated just fine.

So, what gives? First priority: getting our customers back up and running. Can I delete TA out of their registry so I can start them from scratch? Is there a way to *force* TurbaActivate.exe to accept a new product key? We don't even get the option right now.

Thanks!

This is a code problem (in your code). It's also covered in all of our examples and articles.

You didn't say what programming language you're using, so find the appropriate article here: https://wyday.com/limelm/help/using-turboactivate/

For example, here's the relevant C# code snippet showing how to correctly handle errors and return codes from TA_IsGenuineEx(): https://wyday.com/limelm/help/using-turboactivate-with-csharp/#check-activation

There are a whole bunch of comments explaining exactly what you need to do and *why* you need to do it.

Lastly, upgrade to the latest TurboActivate. As of today that is 4.1.6.0.

Thanks for the quick response. I'm using C# with .NET 4.7.2 and VS 2017. Our application has been up and running with TurboActivate for 18 months or so.

I added some logging to a local build I'm running on the customer's PC and I'm getting code TA_FAIL in our software when it calls Native64.TA_IsGenuineEx(). There *is no valid product key to validate* as it was deleted; so, maybe this is the correct response? Either that or TA_E_ACTIVATE. However, TurboActivate.exe returns "activated"; which is incorrect.

I'm experimenting with the current version of TurboActivate now...

>> "I added some logging to a local build I'm running on the customer's PC and I'm getting code TA_FAIL in our software when it calls Native64.TA_IsGenuineEx()"

This is covered in the example I linked to. https://wyday.com/limelm/help/using-turboactivate-with-csharp/#check-activation

// If IsGenuineEx() is telling us we're not activated // but the IsActivated() function is telling us that the activation // data on the computer is valid (i.e. the crypto-signed-fingerprint matches the computer) // then that means that the customer has passed the grace period and they must re-verify // with the servers to continue to use your app.

//Note: DO NOT allow the customer to just continue to use your app indefinitely with absolutely // no reverification with the servers. If you want to do that then don't use IsGenuine() or // IsGenuineEx() at all -- just use IsActivated().

The article (and example code) continue by showing you how to correctly handle it.

I figured it out. After trial and error, I determined that whatever the Native64.TA_IsGenuine() call does differently than the Native64.TA_IsGenuineEx() resets something internally. I was not using the ReVerifyNow window -- where the former call is located in the example code -- and was handling things graphically through our own application. This call was the only difference.

TA_IsGenuineEx() will return result TA_E_FAIL. Running TurboActivate.exe after this will just show the "Activation Successful" message without actually hitting the LimeLM servers.

TA_IsGenuine() will return result TA_E_ACTIVATE. This is the secret sauce! The next time TurboActivate.exe is ran, it will actually allow an alternate product key to be entered.

This testing was done when the product key was invalid. I'm not sure why this was failing with a *valid* product key earlier. I had already deleted all relevant product keys as part of my investigation prior to finding out about TA_IsGenuine(). So, I can't validate what was going on.

>> "I'm not sure why this was failing with a *valid* product key earlier."

It's explained in the portion of the article I linked to as well as the example code. Follow that example. I've already linked to it twice in this post.

Also, don't call the "Native.x" and "Native64.x" functions directly. They're internal for a reason.

I'm not calling methods in TurboActivate.dll directly. I made minimal modifications to TurboActivate.cs. I have the TA_BOTH_DLL compilation symbol declared in my project and the ternary operator is calling the Native64 option. (Maybe the symbol declaration is the issue?)

#if TA_BOTH_DLL int ret = IntPtr.Size == 8 ? Native64.TA_IsGenuine(handle) : Native.TA_IsGenuine(handle);#else int ret = Native.TA_IsGenuine(handle);#endif

I assume you mean this link: https://wyday.com/limelm/help/using-turboactivate-with-csharp/#check-activation

I reread this again. Nowhere does it talk about divergent behavior between the IsGenuine(*null*) and IsGenuine(x,y,z) methods. These methods are only directly mentioned twice: the first mentions "IsGenuine()" but in context is actually referring to the IsGenuine(x,y,z) call at the top of the form's constructor; the second is explicitly referencing the IsGenuine(x,y,z) method just underneath the code snippet at "3.".

The actual IsGenuine(*null*) method is never referenced in code on this page.

Internally, IsGenuine(*null*) calls TA_IsGenuine() and IsGenuine(x,y,z) calls TA_IsGenuineEx(). These two internal methods *return different result codes* -- TA_E_ACTIVATE and TA_FAIL respectively. The former is what is needed to 'reset' TurnboActivate.exe to actually reach out to LimeLM's servers.

Side note: from the code comments, I assume IsGenuine(x,y,z) used to be called IsGenuineEx(). That makes sense.

Am I missing something?

>> "I'm not calling methods in TurboActivate.dll directly. I made minimal modifications to TurboActivate.cs. I have the TA_BOTH_DLL compilation symbol declared in my project and the ternary operator is calling the Native64 option. (Maybe the symbol declaration is the issue?)"

Scroll up in the same article. We explain this in detail. https://wyday.com/limelm/help/using-turboactivate-with-csharp/#target-anycpu

In short: either target x86, or, if you're targeting AnyCPU, make sure you name the dlls correctly.

>> "Side note: from the code comments, I assume IsGenuine(x,y,z) used to be called IsGenuineEx(). That makes sense. "

No, it's always been overloaded in C# / VB.NET. In C, it's called TA_IsGenuineEx() because overloads don't exist in the "C" language (that's not exactly true, but it's close enough for the purposes of this discussion).

Long story short, just follow the example. Don't call ta.IsGenuine() with no parameters.