Often our
customers ask whether it is possible to use e-Mail address instead of PC
hardware information for license activation. I would say that from my point of
view using of the e-Mail address isn’t as secure as using of the hardware
profile, but answer is “yes, you can use e-Mail address for license
activation”. In this post I’ll describe how you can use “Custom Profile”
feature for these purposes.
I suppose
you’ve read following topics in the Manco .NET Licensing System documentation:
1. Quick start using “Unlock Key”
licensing schema.
2. Online product activation.
3. Include custom information to the PC
profile.
Product
documentation is a part of the installation package (you can get it here: http://www.mancosoftware.com/licensing/download.htm). After installation you can find
product documentation in the Windows Start menu at the “All Programs->Manco
Software->Licensing System”, file name is “Manco .NET Licensing System –
Documentation.pdf”. It contains about 220 pages with different aspects of using
of our system.
Using
“Custom Profile” feature you can add custom information to the PC profile, or
even completely replace it with your own value. To do it you have to use
CustomProfileMode and CustomProfile properties of the license object. The
CustomProfileMode property sets value which indicates how the custom profile
will be combined with system information. It can have following values:
- None – indicates that custom profile will not be used.Combine – indicates that custom profile will be added to the hardware information.
- Combine – indicates that custom profile will be added to the hardware information.
- Override – indicates that custom profile will override hardware information.
The
CustomProfile property sets value which will be used as custom profile.
Since we
would like to use customer’s e-Mail address for license activation we should
override PC system information with e-Mail address. So we should set
CustomProfileMode to the “Override” and put e-Mail address to the CustomProfile.
We also should provide an application with ability to store entered e-Mail
address. We can use license custom value for these purposes.
Here are
the changes we should make in the basic code of the “Unlock Key with Activation”
licensing schema to be able to activate license against e-Mail address:
[C#]
public MainWindow(){
InitializeComponent();
// Instantiate license object and assign assemblies for validation.
this.license = (Manco.Licensing.License)LicenseManager.Validate(
typeof(MainWindow), this);
this.license.LicensedAssembly = typeof(MainWindow).Assembly;
// We will override PC profile with custom value.
this.license.CustomProfileMode = CustomProfileMode.Override;
// Read e-Mail address from the custom license value
// and use it as custom PC profile.
this.license.CustomProfile = this.license.GetCustomValue("EMailAddress");
this.licenseProperties = this.license.GetLicenseProperties();
this.licenseState = this.license.GetLicenseState(true);
}
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
// Check if the current license is evaluation license or not valid
if (this.licenseState.IsEvaluation || !this.licenseState.IsValid)
{
// This is evaluation or not valid license,
// so we should show evaluation dialog
// Clear saved keys to allow enter all keys from the scratch.
license.ClearUnlockKeys();
EvaluationWindow loForm = new EvaluationWindow(license);
loForm.Owner = this;
if (loForm.ShowDialog() == true
&& loForm.UnlockKey.Trim() != string.Empty
&& loForm.ActivationKey.Trim() != string.Empty)
{
// Check whether license REQUIRE the calling of the AWS
// and it has been called from the license form.
if (loForm.IsAwsCalled || !this.licenseProperties.DoForceValidation)
{
// License information have been entered.
// Pass it to the license object for the
// following validation.
license.UnlockKey = loForm.UnlockKey;
license.ActivationKey = loForm.ActivationKey;
// Save entered e-Mail address for the future using.
this.license.SetCustomValue("EMailAddress",
loForm.EMailAddress);
}
else
{
MessageBox.Show("You must click 'Activate' button on the valuation form"
+
"to activate
your copy of the product on this PC.");
}
}
else if (this.licenseState.IsEvaluationExpired){
// The evaluation license has been expired and
// no license information have been entered,
// so we should close application.
Application.Current.Shutdown();
return;
}
}
// ...
}
private void ActivateLicense(object sender, RoutedEventArgs e)
{
// If "Unlock Key" has been entered
if (!string.IsNullOrEmpty(this.UnlockKey)
&& !string.IsNullOrEmpty(this.EMailAddress))
{
// Pass "Unlock Key" to the license object
this.license.UnlockKey = this.UnlockKey;
// Pass e-Mail address as custom profile.
this.license.CustomProfile = this.EMailAddress;
// Get instance of the Activation Service
TimeSpan loAWSTimeout = TimeSpan.FromSeconds(120);
ActivationWebService.ActivationServiceSoapClient loAWSClient =
AwsHelper.InitializeAwsClient(
"http://localhost/ActivationService/ActivationService.asmx",
loAWSTimeout,
loAWSTimeout);
try
{
bool isActivated;
if (loAWSClient.LicenseExists(this.license.ProductID, out isActivated))
{
// Get product ID from the license and try to activate it
// Instruct AWS do NOT send copy of the key to the
// customer's e-Mail
string lsActivationKey =
loAWSClient.ActivateProductGetKey(
this.license.ProductID, false);
if (lsActivationKey != null)
{
// AWS has been called
m_bAWSCalled = true;
txtActivationKey.Text = lsActivationKey;
MessageBox.Show("Activation Key has been succesfully"
+ " generated and passed to the text box."
+ " Click OK to continue.");
}
}
}
catch (SoapException exc)
{
if (exc.Message.Contains("Manco.Licensing.ActivationWebService.Exceptions.AllowedActivationsExceededException"))
{
// Process AllowedActivationsExceededException
MessageBox.Show("Number of the allowed activations exceeded.");
}
else
{
MessageBox.Show("Exception during activation:\n" + exc.ToString));
}
}
catch (Exception exc)
{
MessageBox.Show("Exception during activation:\n" + exc.ToString());
}
}
else
{
MessageBox.Show("Enter Unlock Key and e-Mail address to be able activate product");
}
}
[VB.NET]
Public Sub New()InitializeComponent()
' Instantiate license object and assign assemblies for validation.
Me.license = DirectCast(LicenseManager.Validate(GetType(MainWindow), Me), Manco.Licensing.License)
Me.license.LicensedAssembly = GetType(MainWindow).Assembly
' We
will override PC profile with custom value.
Me.license.CustomProfileMode = CustomProfileMode.Override
'
Read e-Mail address from the custom license value
' and
use it as custom PC profile.Me.license.CustomProfile = Me.license.GetCustomValue("EMailAddress")
Me.licenseProperties = Me.license.GetLicenseProperties()
Me.licenseState = Me.license.GetLicenseState(True)
End Sub
Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs)
' Check if the current license is evaluation license or not valid
If Me.licenseState.IsEvaluation OrElse Not Me.licenseState.IsValid Then
' This is evaluation or not valid license,
' so we should show evaluation dialog
' Clear saved keys to allow enter all keys from the scratch.
license.ClearUnlockKeys()
Dim loForm As New EvaluationWindow(license)
loForm.Owner = Me
If loForm.ShowDialog() = True _
AndAlso loForm.UnlockKey.Trim() <> String.Empty _
AndAlso loForm.ActivationKey.Trim() <> String.Empty Then
' Check whether license REQUIRE the calling of the AWS
' and it has been called from the license form.
If loForm.IsAwsCalled _
OrElse Not Me.licenseProperties.DoForceValidation Then
' License information have been entered.
' Pass it to the license object for the
' following validation.
license.UnlockKey = loForm.UnlockKey
license.ActivationKey = loForm.ActivationKey
' Save entered e-Mail address for the future using.
Me.license.SetCustomValue("EMailAddress", loForm.EMailAddress)
Else
MessageBox.Show("You must click 'Activate' button on the evaluation form" _
& "to activate your copy of the product on this PC.")
End If
ElseIf Me.licenseState.IsEvaluationExpired Then
' The evaluation license has been expired and
' no license information have been entered,
' so we should close application.
Application.Current.Shutdown()
Return
End If
End If
' ...
End Sub
Private Sub ActivateLicense(sender As Object, e As RoutedEventArgs)
' If "Unlock Key"
has been enteredIf Not String.IsNullOrEmpty(Me.UnlockKey) _
AndAlso Not String.IsNullOrEmpty(Me.EMailAddress) Then
' Pass "Unlock Key" to the license object
Me.license.UnlockKey = Me.UnlockKey
' Pass e-Mail address as custom profile.
Me.license.CustomProfile = Me.EMailAddress
' Get instance of the Activation Service
Dim loAWSTimeout As TimeSpan = TimeSpan.FromSeconds(120)
Dim loAWSClient As ActivationWebService.ActivationServiceSoapClient = _
AwsHelper.InitializeAwsClient( _
"http://localhost/ActivationService/ActivationService.asmx", _
loAWSTimeout, _
loAWSTimeout)
Try
Dim isActivated As Boolean
If loAWSClient.LicenseExists(Me.license.ProductID, isActivated) Then
' Get product ID from the license and try to activate it
' Instruct AWS do NOT send copy of the key to the
' customer's e-Mail
Dim lsActivationKey As String = loAWSClient.ActivateProductGetKey(Me.license.ProductID, False)
If lsActivationKey IsNot Nothing Then
' AWS has been called
m_bAWSCalled = True
txtActivationKey.Text = lsActivationKey
MessageBox.Show("Activation Key has been succesfully" _
& " generated and passed to the text box." _
& " Click OK to continue.")
End If
End If
Catch exc As SoapException
If exc.Message.Contains("Manco.Licensing.ActivationWebService.Exceptions.AllowedActivationsExceededException") Then
' Process AllowedActivationsExceededException
MessageBox.Show("Number of the allowed activations exceeded.")
Else
MessageBox.Show("Exception during activation:" _
& vbLf & exc.ToString())
End If
Catch exc As Exception
MessageBox.Show("Exception during activation:" _
& vbLf & exc.ToString())
End Try
Else
MessageBox.Show("Enter Unlock Key and e-Mail address to be able activate product")
End If
End Sub
You can find sample solution which demonstrates how the custom profile can be used to activate license against e-Mail address here: http://www.mancosoftware.com/licensing/download.htm