vijay_bale Ответов: 3

Блокировка моего программного обеспечения после указанного времени в C#


Я написал некоторый код для блокировки моего программного обеспечения после указанного времени. Для этого я использовал реестр.
I created One sub-key and checking there whether my software is running first time or not. If first time then I am creating sub-key and storing installation date.I am reading that date and adding some days and checking every time when user opened my software . Here Everything is working fine but after locked the software if user changes date and restore data then I am unable to track that. So I added other sub-key for that and when ever i am locking software I am replacing that sub-key value with 1.using that I want to check already one time locked software so if he restored data and changed date also I can lock the software. Here only I am getting problem. after locking software system is not adding value to that sub-key and giving error that "cannot write to the registry". So where I did mistake, I am unable to find. I checked net also and I found one post here that telling how to edit values of registry sub-keys. I tried that also but problem not rectified.

Здесь я также публикую свой код

//code to lock software after specified date
            Microsoft.Win32.RegistryKey key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\OurSettings");
            if (key != null)
            {
                Microsoft.Win32.RegistryKey subkey = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\OurSettings\other");
                if (subkey != null)
                {
                    uncheck();
                }
                else
                {
                    checkService();
                    getipl();
                    crelogin();
                    chklogin();
                    chkpass();
                }
            }
            else
            {
                RegistryKey subkey = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\OurSettings\other");
                MessageBox.Show("Created");
                
                subkey.SetValue("InstallDate", DateTime.Now.ToBinary(), RegistryValueKind.QWord);
                subkey.SetValue("number", cn, RegistryValueKind.QWord);//cn is for checking whether locked or not.cn is public variable declared as public void int cn=0
                subkey.Close();
                uncheck();
            }
            checkService();
            getipl();
            crelogin();
            chklogin();
            chkpass();
        }
        public void uncheck()
        {
            Microsoft.Win32.RegistryKey subkey = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\OurSettings\other");
            try
            {
                var result = (long)subkey.GetValue("InstallDate", "date");
                var date = DateTime.FromBinary(result);
                MessageBox.Show("Install Date" + " " + date.ToString());
                var comp = date.AddDays(30);// locking days after installation.
                var dt = DateTime.Now;
                //var num = (long)key.GetValue("state", "number");
                MessageBox.Show("next Lock Date" + " " + comp.ToString());
                //MessageBox.Show("state"+" "+num.ToString());
                if (date >= comp)
                {
                    Microsoft.Win32.RegistryKey subkey = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\OurSettings\other");
                    con.Close();
                    con.Open();
                    SqlCommand cmd = new SqlCommand("delete  comapny where ctype='b'", con);
                    cmd.ExecuteNonQuery();
                    con.Close();
                    cn = 1;
                    subkey.SetValue("number", cn, RegistryValueKind.QWord);
                    subkey.Close();
                    Form2 frm2 = new Form2();
                    frm2.ShowDialog();//calling other window to show message
                    this.Close();
                }
                else if (dt >= comp)
                {
                    Microsoft.Win32.RegistryKey subkey = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\OurSettings\other");
                    con.Open();
                    SqlCommand cmd = new SqlCommand("delete  comapny where ctype='b'", con);
                    cmd.ExecuteNonQuery();
                    con.Close();
                    //cn = 1;
                    //key.SetValue("number", cn, RegistryValueKind.QWord);
                    //key.Close();
                    Form2 frm2 = new Form2();
                    frm2.ShowDialog();//calling other window to show message
                    this.Close();
                }
                else
                {
                    checkService();
                    getipl();
                    crelogin();
                    chklogin();
                    chkpass();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Software Is Locked. Contact 9290345689");
                this.Close();
            }
        }


Что я уже пробовал:

I checked net also and i found one post here that telling how to edit values of registry sub-keys. I tried that also but problem not rectified.

Sinisa Hajnal

Ты не проверить, если ключ существует способ снять. Идите шаг за шагом, выясните, какая строка вызывает ошибку, и проверьте только эту часть.

vijay_bale

Я проверяю наверху, существует ли ключ или нет. если нет, то я создаю ключ.Если существует,
просто я выхожу из цикла и иду к следующему шагу checkService();

3 Ответов

Рейтинг:
4

vijay_bale

Я нашел решение и исправил проблему. Спасибо Йохену и OriginalGriff.

ниже я вставляю полный окончательный код. Может быть, это кому-то пригодится.

Я нашел в Сети решение, которое они сказали добавить true while opensubkey. Я добавил И это решило мою проблему

//code to lock software after specified date
            Microsoft.Win32.RegistryKey key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\OurSettings");
            if (key != null)
            {
                key.Close();
                Microsoft.Win32.RegistryKey subkey = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\OurSettings\other");
                if (subkey != null)
                {
                    subkey.Close();
                    uncheck();
                }
                else
                {

                    checkService();
                    getipl();
                    crelogin();
                    chklogin();
                    chkpass();
                }
            }
            else
            {
                RegistryKey subkey = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\OurSettings\other");
                MessageBox.Show("Created");
                
                subkey.SetValue("InstallDate", DateTime.Now.ToBinary(), RegistryValueKind.QWord);
                subkey.SetValue("number", cn, RegistryValueKind.QWord);
                subkey.Close();
                uncheck();
            }
            checkService();
            getipl();
            crelogin();
            chklogin();
            chkpass();
        }
        public void uncheck()
        {
            Microsoft.Win32.RegistryKey subkey = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\OurSettings\other",true);
            try
            {
                var stat = (long)subkey.GetValue("number", "st");
                var result = (long)subkey.GetValue("InstallDate", "date");
                var date = DateTime.FromBinary(result);
                MessageBox.Show("Install Date" + " " + date.ToString());
                DateTime comp = date.AddDays(1);//specifing days after inatallation date to lock
                var dt = DateTime.Now;
                
                MessageBox.Show("next Lock Date" + " " + comp.ToString());
                
                if (date >= comp)
                {
                    
                    con.Close();
                    con.Open();
                    SqlCommand cmd = new SqlCommand("delete  comapny where ctype='b'", con);
                    cmd.ExecuteNonQuery();
                    con.Close();
                    cn = 1;//already define as public. (public static int cn=0;)
                    subkey.SetValue("number", cn, RegistryValueKind.QWord);
                    subkey.Close();
                    Form2 frm2 = new Form2();
                    frm2.ShowDialog();//calling other window to show message
                    this.Close();
                }
                else if (dt >= comp)
                {
                    
                    con.Open();
                    SqlCommand cmd = new SqlCommand("delete  comapny where ctype='b'", con);
                    cmd.ExecuteNonQuery();
                    con.Close();

                    cn = 1;
                    subkey.SetValue("number", cn, RegistryValueKind.QWord);
                    subkey.Close();
                    Form2 frm2 = new Form2();
                    frm2.ShowDialog();//calling other window to show message
                    this.Close();
                }
                else if (stat!= 0)
                {
                    
                    con.Open();
                    SqlCommand cmd = new SqlCommand("delete  comapny where ctype='b'", con);
                    cmd.ExecuteNonQuery();
                    //Not calling any message window
                    con.Close();
                    subkey.Close();

                }

                else
                {

                    checkService();
                    getipl();
                    crelogin();
                    chklogin();
                    chkpass();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Software Is Locked. Contact 9290345689");
                this.Close();
            }
        }


Рейтинг:
27

OriginalGriff

Правило первое: прекратите пользоваться реестром.
Доступ к реестру стал более ограниченным, чем раньше, и, вероятно, станет еще более ограниченным. И ваша проблема, скорее всего, будет заключаться в том, что часть реестра, которую вы пытаетесь отредактировать, нуждается в доступе администратора, что означает использование ОАЭ и получение разрешения от пользователя на повышение уровня вашего приложения.

Вместо этого рассмотрите возможность использования файла конфигурации, в котором можно добавлять, удалять и редактировать записи по мере необходимости.


vijay_bale

Хорошо, взяв настройки из другого файла, я попробую это сделать.

То, что ты сказал, Может быть, и правильно. Но мой логин-это только логин администратора. уже один суб-ключ я создаю и добавляю. Я запускаю visual studio также в режиме администратора.

vijay_bale

Я могу хранить настройки, но не могу читать из этого файла.

OriginalGriff

И без малейшего представления о коде, который вы использовали, я должен сделать что?

vijay_bale

Вы ничего не должны делать. Просто я сказал.Как опытный программист, может быть, вы можете дать любую идею. Вот почему я рассказал.

OriginalGriff

Как опытный программист, я знаю, что существует большое количество способов делать вещи правильно, и еще большее количество способов делать их неправильно! Но я понятия не имею, какой код вы использовали, потому что я не могу получить доступ к вашему жесткому диску или увидеть ваш экран...

Рейтинг:
19

Jochen Arndt

Вы должны закрыть ключи, прежде чем их можно будет снова открыть. В вашем коде вы никогда не закрываете ключ к "SOFTWARE\OurSettings" (который не заботится, потому что он нигде не используется, но также должен быть закрыт). То же самое относится и к ключу для "SOFTWARE\OurSettings\other", открытому сразу после вышеизложенного. Тогда вы звоните uncheck() который снова пытается открыть тот же ключ. При создании ключа вы делаете это правильно, закрывая ключ перед вызовом uncheck().

Всегда закрывайте ключи, когда они не используются anmyore. В вашем примере вы также можете передать ключ в качестве аргумента uncheck() функционируйте и закройте его после этого.

[РЕДАКТИРОВАТЬ]
Если вы хотите сделать запись в реестр, вы должны открыть подраздел с доступом на запись. Фактически используемый метод с одним параметром откроет подраздел только для чтения. Видеть Регистрационный номер.Метод OpenSubKey (Microsoft.Win32)[^] для методов, имеющих параметры доступа.

Я только что отметил также, что вы открываете тот же подраздел поверх uncheck() функция как key а потом еще раз позже как subkey.

Обратите также внимание, что такие обнаружения в конце пробного периода можно просто обойти, удалив ключи.
[/РЕДАКТИРОВАТЬ]


vijay_bale

Я сделал то, что ты сказал. Но та же ошибка.

Jochen Arndt

Смотрите мой обновленный ответ.

vijay_bale

Это я тоже изменил.Та же проблема.Я изменил свой код выше.

Jochen Arndt

Внимательно проверьте свой код. Тем временем он должен отличаться от вашего опубликованного кода, но все равно может содержать неправильные вызовы.

Также до сих пор неясно, где именно происходит ошибка (в какой строке кода).

Для тестирования вы также можете попытаться прочитать значение перед его записью.

Наконец, чтобы быть в безопасности, вы можете завершить сеанс Windows, чтобы убедиться, что ключи все еще не открыты (я не знаю точно, закрыты ли незакрытые дескрипторы реестра при закрытии приложения).

vijay_bale

ОК. Я посмотрю еще раз, как ты сказал. время творения какое значение я сохранил, то есть только там.Дату я могу хранить в шестнадцатеричном формате и читать ее.Это значение int является проблемой предоставления.Этот int также я пытаюсь сохранить в виде строки. Но это бесполезно.