none
Vb Como puedo hacer que mi proyecto al ser instalado no puedan copiar RRS feed

  • Pregunta

  • Hola a todos de la comunidad les mando un saludo =). mi problemita es que pense que al hacer un instalador de mi proyecto en visual studio 2013 solo se podia abrir si solo si se instalaba. pero para verificar copie mi proyecto ya instalado en otra pc y funionaba como si estubiera instalado. es normal eso? mi proposito es que mi proyecto no sea copeable por motivos de seguridad =). 

    si alguien me puede sacar de duda le estare muy agradecido.

    este es el metodo que uso para hacer mi instalador.

    uso la opción que esta marcada

    luego agrego mi grupo de proyecto de resoltado asi.

    me podrian decir porfa donde lo estoy realizando mal mi instalador. =)


    • Editado Gatzzu miércoles, 9 de agosto de 2017 1:12
    miércoles, 9 de agosto de 2017 1:10

Respuestas

  • Hola Gatzzu:

    Vamos a ver, tu proyecto y el de cualquiera se puede copiar en cualquier carpeta, otra cosa es que ese proyecto lo puedan abrir o no. 

    Si no lo tienes protegido con un password, control de licencia, etc., evidentemente te lo podrán abrir en cualquier máquina donde hayan copiado tus archivos de instalación.

    Para ello, te tienes que preocupar de que por lo menos para arrancar tu programa, deban introducir un código que les de acceso al programa, eso sería un sistema de licencias. La máquina lee dicho código de licencia y comprueba que sea correcto, entonces da paso al inicio del programa, posteriormente debes utilizar normalmente un código de usuario y un password para identificar si el usuario tiene o no permisos de acceso.

    Aparte de ello y si lo que precisas es que no se abra el programa, entonces tienes que crearte un método que guarde o encripte un código, sin ese código el usuario no podrá acceder a tu aplicación, es lo que viene a ser un archivo de licencia.

    Un saludo.

    Gemma

    • Propuesto como respuesta Jorge TurradoMVP miércoles, 9 de agosto de 2017 6:28
    • Marcado como respuesta Gatzzu miércoles, 9 de agosto de 2017 7:23
    • Desmarcado como respuesta Gatzzu lunes, 14 de agosto de 2017 7:46
    • Marcado como respuesta Gatzzu lunes, 14 de agosto de 2017 7:46
    miércoles, 9 de agosto de 2017 4:43
  • Como añadido a lo que dice Gemma,

    Puedes usar datos del propio pc para generar una clave que sea diferente en cada PC, podrías utilizar los IDs de varios componentes para generar tu ID de PC:

    using System; 
    using System.Management; 
    using System.Net.NetworkInformation; 
    using System.Security.Cryptography; 
    using System.IO; 
    using System.Text; 
     
    namespace UniqueID 
    { 
        class Program 
        { 
            public static void Main(string[] args) 
            { 
                Console.WriteLine(GetUniqueID()); 
                 
                // TODO: Implement Functionality Here 
                 
                Console.Write("Press any key to continue . . . "); 
                Console.ReadKey(true); 
            } 
             
     
            public static string GetCPUId() 
            { 
                string cpuInfo = String.Empty; 
                string temp = String.Empty; 
                ManagementClass mc = new ManagementClass("Win32_Processor"); 
                ManagementObjectCollection moc = mc.GetInstances(); 
                foreach (ManagementObject mo in moc) 
                { 
                    if (cpuInfo == String.Empty) 
                    {// only return cpuInfo from first CPU 
                        cpuInfo = mo.Properties["ProcessorId"].Value.ToString(); 
                    } 
                } 
                return cpuInfo; 
            } 
             
            public static string GetMotherBoardID() 
            { 
                ManagementObjectCollection mbCol = new ManagementClass("Win32_BaseBoard").GetInstances(); 
                //Enumerating the list 
                ManagementObjectCollection.ManagementObjectEnumerator mbEnum = mbCol.GetEnumerator(); 
                //Move the cursor to the first element of the list (and most probably the only one) 
                mbEnum.MoveNext(); 
                //Getting the serial number of that specific motherboard 
                return ((ManagementObject)(mbEnum.Current)).Properties["SerialNumber"].Value.ToString(); 
            } 
             
            public static string GetMacAddress() 
            { 
                string macs = ""; 
     
                // get network interfaces physical addresses 
                NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces(); 
                foreach (NetworkInterface ni in interfaces) 
                { 
                    PhysicalAddress pa = ni.GetPhysicalAddress(); 
                    macs += pa.ToString(); 
                } 
                return macs; 
            } 
             
            /// <summary> 
            /// return Volume Serial Number from hard drive 
            /// </summary> 
            /// <param name="strDriveLetter">[optional] Drive letter</param> 
            /// <returns>[string] VolumeSerialNumber</returns> 
            public static string GetVolumeSerial() 
            { 
                string strDriveLetter = ""; 
                 
                ManagementClass mc = new ManagementClass("Win32_PhysicalMedia"); 
                ManagementObjectCollection moc = mc.GetInstances(); 
                foreach (ManagementObject mo in moc) 
                { 
                    try 
                    { 
                        if ((UInt16)mo["MediaType"] == 29) 
                        { 
                            String serial = mo["SerialNumber"].ToString().Trim(); 
                            if (!String.IsNullOrEmpty(serial)) 
                            { 
                                Console.WriteLine("Harddrive serial: " + (string)mo["SerialNumber"]); 
                                strDriveLetter = (string)mo["SerialNumber"]; 
                                return strDriveLetter; 
                            } 
                        } 
                         
                    } 
                    catch{} 
                     
                } 
                return strDriveLetter; 
            } 
     
             
            public static string GetUniqueID() 
            { 
                string ID = GetCPUId() + GetMotherBoardID() + GetMacAddress() + GetVolumeSerial(); 
                // generate hash 
                HMACSHA1 hmac = new HMACSHA1(); 
                hmac.Key = Encoding.ASCII.GetBytes(GetMotherBoardID()); 
                hmac.ComputeHash(Encoding.ASCII.GetBytes(ID)); 
     
                // convert hash to hex string 
                StringBuilder sb = new StringBuilder(); 
                for (int i = 0; i < hmac.Hash.Length; i++) 
                { 
                    sb.Append(hmac.Hash[i].ToString("X2")); 
                } 
     
                return sb.ToString(); 
     
            } 
     
        } 
    } 

    (Pongo el ejemplo en c# porque es mi campo, pero seguro que no tienes problema en traducirlo)

    El hecho de generar un ID unico en cada PC, te vale para que en el caso de licenciarlo, no valga con copiar la licencia en varios PCs, o utilizar la misma en varios PC, ya que tu puedes generar la licencia en funcion del ID unico, por ejemplo, por decirte algo, que el valor de la licencia sea el Hash del ID unico del PC, de tal modo que no van a poder copiar el programa a otro PC y poder usar el mismo "SerialKey" que tu facilitas (o que generas durante la instalacion)

    Atte


    No olvides votar si mi comentario te ha ayudado y marcarlo como respuesta si ha sido la solución!

    • Marcado como respuesta Gatzzu lunes, 14 de agosto de 2017 7:45
    miércoles, 9 de agosto de 2017 7:34

Todas las respuestas

  • Hola Gatzzu:

    Vamos a ver, tu proyecto y el de cualquiera se puede copiar en cualquier carpeta, otra cosa es que ese proyecto lo puedan abrir o no. 

    Si no lo tienes protegido con un password, control de licencia, etc., evidentemente te lo podrán abrir en cualquier máquina donde hayan copiado tus archivos de instalación.

    Para ello, te tienes que preocupar de que por lo menos para arrancar tu programa, deban introducir un código que les de acceso al programa, eso sería un sistema de licencias. La máquina lee dicho código de licencia y comprueba que sea correcto, entonces da paso al inicio del programa, posteriormente debes utilizar normalmente un código de usuario y un password para identificar si el usuario tiene o no permisos de acceso.

    Aparte de ello y si lo que precisas es que no se abra el programa, entonces tienes que crearte un método que guarde o encripte un código, sin ese código el usuario no podrá acceder a tu aplicación, es lo que viene a ser un archivo de licencia.

    Un saludo.

    Gemma

    • Propuesto como respuesta Jorge TurradoMVP miércoles, 9 de agosto de 2017 6:28
    • Marcado como respuesta Gatzzu miércoles, 9 de agosto de 2017 7:23
    • Desmarcado como respuesta Gatzzu lunes, 14 de agosto de 2017 7:46
    • Marcado como respuesta Gatzzu lunes, 14 de agosto de 2017 7:46
    miércoles, 9 de agosto de 2017 4:43
  • grax darme un poco de tu tiempo =) para darme una respuesta. me sacaste la duda y me diste una idea de crear un archivo de verificacion cuando se instale mi programa. =)
    miércoles, 9 de agosto de 2017 7:23
  • Como añadido a lo que dice Gemma,

    Puedes usar datos del propio pc para generar una clave que sea diferente en cada PC, podrías utilizar los IDs de varios componentes para generar tu ID de PC:

    using System; 
    using System.Management; 
    using System.Net.NetworkInformation; 
    using System.Security.Cryptography; 
    using System.IO; 
    using System.Text; 
     
    namespace UniqueID 
    { 
        class Program 
        { 
            public static void Main(string[] args) 
            { 
                Console.WriteLine(GetUniqueID()); 
                 
                // TODO: Implement Functionality Here 
                 
                Console.Write("Press any key to continue . . . "); 
                Console.ReadKey(true); 
            } 
             
     
            public static string GetCPUId() 
            { 
                string cpuInfo = String.Empty; 
                string temp = String.Empty; 
                ManagementClass mc = new ManagementClass("Win32_Processor"); 
                ManagementObjectCollection moc = mc.GetInstances(); 
                foreach (ManagementObject mo in moc) 
                { 
                    if (cpuInfo == String.Empty) 
                    {// only return cpuInfo from first CPU 
                        cpuInfo = mo.Properties["ProcessorId"].Value.ToString(); 
                    } 
                } 
                return cpuInfo; 
            } 
             
            public static string GetMotherBoardID() 
            { 
                ManagementObjectCollection mbCol = new ManagementClass("Win32_BaseBoard").GetInstances(); 
                //Enumerating the list 
                ManagementObjectCollection.ManagementObjectEnumerator mbEnum = mbCol.GetEnumerator(); 
                //Move the cursor to the first element of the list (and most probably the only one) 
                mbEnum.MoveNext(); 
                //Getting the serial number of that specific motherboard 
                return ((ManagementObject)(mbEnum.Current)).Properties["SerialNumber"].Value.ToString(); 
            } 
             
            public static string GetMacAddress() 
            { 
                string macs = ""; 
     
                // get network interfaces physical addresses 
                NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces(); 
                foreach (NetworkInterface ni in interfaces) 
                { 
                    PhysicalAddress pa = ni.GetPhysicalAddress(); 
                    macs += pa.ToString(); 
                } 
                return macs; 
            } 
             
            /// <summary> 
            /// return Volume Serial Number from hard drive 
            /// </summary> 
            /// <param name="strDriveLetter">[optional] Drive letter</param> 
            /// <returns>[string] VolumeSerialNumber</returns> 
            public static string GetVolumeSerial() 
            { 
                string strDriveLetter = ""; 
                 
                ManagementClass mc = new ManagementClass("Win32_PhysicalMedia"); 
                ManagementObjectCollection moc = mc.GetInstances(); 
                foreach (ManagementObject mo in moc) 
                { 
                    try 
                    { 
                        if ((UInt16)mo["MediaType"] == 29) 
                        { 
                            String serial = mo["SerialNumber"].ToString().Trim(); 
                            if (!String.IsNullOrEmpty(serial)) 
                            { 
                                Console.WriteLine("Harddrive serial: " + (string)mo["SerialNumber"]); 
                                strDriveLetter = (string)mo["SerialNumber"]; 
                                return strDriveLetter; 
                            } 
                        } 
                         
                    } 
                    catch{} 
                     
                } 
                return strDriveLetter; 
            } 
     
             
            public static string GetUniqueID() 
            { 
                string ID = GetCPUId() + GetMotherBoardID() + GetMacAddress() + GetVolumeSerial(); 
                // generate hash 
                HMACSHA1 hmac = new HMACSHA1(); 
                hmac.Key = Encoding.ASCII.GetBytes(GetMotherBoardID()); 
                hmac.ComputeHash(Encoding.ASCII.GetBytes(ID)); 
     
                // convert hash to hex string 
                StringBuilder sb = new StringBuilder(); 
                for (int i = 0; i < hmac.Hash.Length; i++) 
                { 
                    sb.Append(hmac.Hash[i].ToString("X2")); 
                } 
     
                return sb.ToString(); 
     
            } 
     
        } 
    } 

    (Pongo el ejemplo en c# porque es mi campo, pero seguro que no tienes problema en traducirlo)

    El hecho de generar un ID unico en cada PC, te vale para que en el caso de licenciarlo, no valga con copiar la licencia en varios PCs, o utilizar la misma en varios PC, ya que tu puedes generar la licencia en funcion del ID unico, por ejemplo, por decirte algo, que el valor de la licencia sea el Hash del ID unico del PC, de tal modo que no van a poder copiar el programa a otro PC y poder usar el mismo "SerialKey" que tu facilitas (o que generas durante la instalacion)

    Atte


    No olvides votar si mi comentario te ha ayudado y marcarlo como respuesta si ha sido la solución!

    • Marcado como respuesta Gatzzu lunes, 14 de agosto de 2017 7:45
    miércoles, 9 de agosto de 2017 7:34
  • Gracias amigo por mandarme tu codigo =). soy nuevo en programacion y estoy intentando desifrar lo que me mandaste me sera muy util. y gracias por darme un poco de tu tiempo =).
    lunes, 14 de agosto de 2017 7:45