Hasta ahí bien, pero viene el problema. Los ordenadores comparten el mismo programa pero no las mismas restricciones, de forma que copiando los valores de registro de un ordenador con el programa desactivado y pegándolos en el ordenador bloqueado consiguen desactivar la aplicación...
Si el problema es ese entonces la primera solución que te ofrecí de usar
Settings no te serviría, ya que el archivo de configuración sigue esta estructura, donde el hash sería el mismo en cada PC:
c:\Users\<username>\AppData\Local o Roaming\<companyname>\<appdomainname>_<eid>_<hash>\<verison>
Ejemplo real:
C:\Users\Administrador\AppData\Local\ElektroStudios\MasterMusik_Reports.exe_Url_q2a441mf5bc330sftjmvcdv30vohiv0o\2.0.0.0\user.config
De todas formas para otras cosas te puede interesar, aquí puedes conocer más detalles de su arquitectura, aunque es un artículo bastante antiguo:
➢
Using My.Settings in Visual Basic 2005
A ver si lo he entendido bien, sino corrígeme.
Tu tienes algo PARECIDO a este ejemplo, en el código fuente:
Dim value As Integer = 0
Select Case value
Case Is = 0
' Activar aplicaciones.
Case Is = 1
' Denegar aplicaciones.
Case Else
' ...
End Select
(muy resumido)
¿Pero cómo decides si
Value debe ser 0 o 1 al distribuirr y ejecutar el programa?, es decir, si el programa lo ejecutase yo en mi PC, ¿cómo se decide si se deben activar esas cosas que mencionas?, ¿se decide por un número?, ¿pero entonces cómo se decide el número que yo debo tener, no era aleatorio?, que lio, estoy algo espeso y no lo llego a pillar del todo.
De todas formas, ¿podrías mantener una conexión con los PCs de esas aulas? (mediante sockets), en ese caso lo que podrías hacer es administrar las activaciones de forma remota basándote en el HWID (Hardware ID) de cada equipo conectado,
de lo contrario, y si tienes acceso físico a esas aulas, entonces también puedes obtener manualmente el HWID de cada PC ejecutando un programa específico en ese PC que devuelva el HWID, es decir, obtienes los HWID de cada PC, luego creas una lista/array con los HWID predefinidos en tu código fuente y así administras las activaciones al distribuir la app, simplemente comprobando si el HWID dle equipo actual corresponde con algún HWID de la lista que compilaste.
Te dejo unas funciones que tal vez te podrían servir para pensar en algún enfoque, estas funciones sirven para obtener el identificador del procesador y de la placa base de un PC, y para cifrar un string mediante el algoritmo AES:
''' <remarks>
''' *****************************************************************
''' Title : Get CPU Identifier
''' Author: Elektro
''' Date : 03-June-2015
'''
''' Required Namespaces:
''' <see cref="System.Management"/>
'''
''' Usage Example:
''' Dim Value as String = GetCpuId()
''' *****************************************************************
''' </remarks>
''' <summary>
''' Gets the motherboard ID of the current computer machine.
''' </summary>
''' <returns>The motherboard ID.</returns>
Public Shared Function GetCpuId() As String
Using wmi As New ManagementObjectSearcher("select ProcessorID from Win32_Processor")
Using query As ManagementObjectCollection = wmi.Get
Return DirectCast(query(0), ManagementObject).Properties("ProcessorID").Value.ToString
End Using
End Using
End Function
''' <remarks>
''' *****************************************************************
''' Title : Get Motherboard Identifier
''' Author: Elektro
''' Date : 03-June-2015
'''
''' Required Namespaces:
''' <see cref="System.Management"/>
'''
''' Usage Example:
''' MsgBox(GetMotherboardId)
''' *****************************************************************
''' </remarks>
''' <summary>
''' Gets the motherboard ID of the current computer machine.
''' </summary>
''' <returns>The motherboard ID.</returns>
Public Shared Function GetMotherboardId() As String
Using wmi As New ManagementObjectSearcher("select SerialNumber from Win32_BaseBoard")
Using query As ManagementObjectCollection = wmi.Get
Return DirectCast(query(0), ManagementObject).Properties("SerialNumber").Value.ToString
End Using
End Using
End Function
''' <remarks>
''' *****************************************************************
''' Title : AES Encryptor
''' Author: Elektro
''' Date : 03-June-2015
'''
''' Required Namespaces:
''' <see cref="System.IO"/>
''' <see cref="System.Security.Cryptography"/>
''' <see cref="System.Text"/>
'''
''' Usage Example:
''' Dim encrypted As String = AESEncryptor("Hello World!", key:="My Encryption Key", size:=128)
''' *****************************************************************
''' </remarks>
''' <summary>
''' Encrypts an string using AES algorithm.
''' </summary>
''' <param name="str">The string to encrypt.</param>
''' <param name="key">The encryption key.</param>
''' <param name="size">The key size. 128, 192 or 256 bits.</param>
''' <param name="salt">The key salt.</param>
''' <param name="mode">The encryption mode.</param>
''' <returns>The encrypted string.</returns>
Public Function AESEncryptor(ByVal str As String,
ByVal key As String,
ByVal size As Integer,
Optional ByVal salt As Byte() = Nothing,
Optional ByVal mode As CipherMode = CipherMode.ECB) As String
If (size <> 128) AndAlso (size <> 192) AndAlso (size <> 256) Then
Throw New ArgumentException(message:="Key size for this algorithm should be 128, 192 or 256.", paramName:="keySize")
ElseIf (salt IsNot Nothing) AndAlso (salt.Length < 8) Then
Throw New ArgumentException(message:="Salt should contain at least 8 bytes.", paramName:="salt")
ElseIf salt Is Nothing Then
salt = {&H49, &H76, &H61, &H6E, &H20, &H4D, &H65, &H64}
End If
Using crypto As Aes = Aes.Create()
Dim pdb As Rfc2898DeriveBytes = New Rfc2898DeriveBytes(key, salt:=salt)
crypto.KeySize = size ' 128, 192 or 256 Bits.
crypto.Key = pdb.GetBytes(cb:=(size \ 8)) ' 16, 24, or 32 or Bytes (128, 192 or 256 Bits).
crypto.IV = pdb.GetBytes(cb:=16) ' 16 Bytes (128 Bits).
crypto.Mode = mode
Using ms As New MemoryStream()
Using cs As New CryptoStream(ms, crypto.CreateEncryptor(), CryptoStreamMode.Write)
Dim strBytes As Byte() = Encoding.Unicode.GetBytes(str)
cs.Write(strBytes, 0, strBytes.Length)
cs.Close()
End Using
Return Convert.ToBase64String(ms.ToArray)
End Using
End Using
End Function
''' <remarks>
''' *****************************************************************
''' Title : AES Decryptor
''' Author: Elektro
''' Date : 03-June-2015
'''
''' Required Namespaces:
''' <see cref="System.IO"/>
''' <see cref="System.Security.Cryptography"/>
''' <see cref="System.Text"/>
'''
''' Usage Example:
''' Dim decrypted As String = AESDecryptor("JRVQnb2q7f3BtIDaq5Tdcqu2+2GYGEMLyQrBT9mMjgw=", key:="My Encryption Key", size:=128)
''' *****************************************************************
''' </remarks>
''' <summary>
''' Decrypts a previously encrypted string using AES algorithm.
''' </summary>
''' <param name="str">The encrypted string to decrypt.</param>
''' <param name="key">The key used for encryption.</param>
''' <param name="size">The key size used for encryption. 128, 192 or 256 bits.</param>
''' <param name="salt">The key salt used for encryption.</param>
''' <param name="mode">The encryption mode.</param>
''' <returns>The decrypted string.</returns>
Public Function AESDecryptor(ByVal str As String,
ByVal key As String,
ByVal size As Integer,
Optional ByVal salt As Byte() = Nothing,
Optional ByVal mode As CipherMode = CipherMode.ECB) As String
If (size <> 128) AndAlso (size <> 192) AndAlso (size <> 256) Then
Throw New ArgumentException(message:="Key size for this algorithm should be 128, 192 or 256.", paramName:="keySize")
ElseIf (salt IsNot Nothing) AndAlso (salt.Length < 8) Then
Throw New ArgumentException(message:="Salt should contain at least 8 bytes.", paramName:="salt")
ElseIf salt Is Nothing Then
salt = {&H49, &H76, &H61, &H6E, &H20, &H4D, &H65, &H64}
End If
Using crypto As Aes = Aes.Create()
Dim pdb As New Rfc2898DeriveBytes(key, salt)
crypto.KeySize = size ' 128, 192 or 256 Bits.
crypto.Key = pdb.GetBytes(cb:=(size \ 8)) ' 16, 24, or 32 or Bytes (128, 192 or 256 Bits).
crypto.IV = pdb.GetBytes(cb:=16) ' 16 Bytes (128 Bits).
crypto.Mode = mode
Using ms As New MemoryStream()
Using cs As New CryptoStream(ms, crypto.CreateDecryptor(), CryptoStreamMode.Write)
Dim cipherBytes As Byte() = Convert.FromBase64String(str)
cs.Write(cipherBytes, 0, cipherBytes.Length)
cs.Close()
End Using
Return Encoding.Unicode.GetString(ms.ToArray)
End Using
End Using
End Function
Saludos