Topic: Как организовать проверку подлинности экземпляра программы?

Здравствуйте! Сделал программку для нужд своего подразделения. Хотелось бы защитить её от пиратского копирования.
Можно ли организовать проверку подлинности экземпляра по имени компьютера, на котором установлена программа? Примерно так: есть таблица machine с колонкой name. При запуске проекта имя в таблице сверяется с именем компьютера. В случае несоответствия проект закрывается.

Не боги горшки лепят!

Re: Как организовать проверку подлинности экземпляра программы?

Приветствую,


В принципе можно, узнать имя компьютера можно с помощью функции GetUserName


а имена компьютеров, на которых программа будет работать можно перечислить непосредственно в скрипте, так будет проще.

Dmitry.

3 (edited by kunar80 2015-03-09 09:51:33)

Re: Как организовать проверку подлинности экземпляра программы?

А как этот скрипт записать? Программу устанавливаю на машину лично я. И хотелось бы, чтобы этот экземпляр работал только на этой машине. При несанкционированном копировании на другую - отключение кнопки входа.

Не боги горшки лепят!

Re: Как организовать проверку подлинности экземпляра программы?

Можете создать событие OnShow у главной формы с кодом

procedure Form1_OnShow (Sender: string; Action: string);
begin
    if GetUserName<>'PCName' then Form1.Close;
end;

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

Dmitry.

Re: Как организовать проверку подлинности экземпляра программы?

Спасибо! Всё отлично работает!

Не боги горшки лепят!

Re: Как организовать проверку подлинности экземпляра программы?

Для демонстрационной версии записал такую процедуру:

procedure OnTimer (Sender: TObject);
     iSeconds := iSeconds + 1;
     if iSeconds > 300 then
     begin
          iSeconds := 0;
          ShowMessage('Внимание! Вы пользуетесь демонстрационной версией........'); // предупреждение (через 300 секунд)
             Memos.TableGrid1.ClearRows;
             Memos.TableGrid2.ClearRows;
             Letters.TableGrid1.ClearRows;
             Letters.TableGrid2.ClearRows;
             start.Close;
     end;

При закрытии ShowMessage, появляющегося через 300 секунд, гриды очищаются и программа закрывается. Но при этом записи из базы не удаляются и при следующей загрузке программы они в гридах вновь есть. А как прописать, чтобы они удалились безвозвратно?

Не боги горшки лепят!

Re: Как организовать проверку подлинности экземпляра программы?

Для этого необходимо выполнить SQL запрос

SQLExecute ('DELETE FROM tablename');
Dmitry.

Re: Как организовать проверку подлинности экземпляра программы?

Спасибо, работает.

Не боги горшки лепят!

9 (edited by kunar80 2015-03-10 08:46:51)

Re: Как организовать проверку подлинности экземпляра программы?

DriveSoft wrote:

Можете создать событие OnShow у главной формы с кодом

procedure Form1_OnShow (Sender: string; Action: string);
begin
    if GetUserName<>'PCName' then Form1.Close;
end;

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

В данном случае это имя пользователя. И это работает.
А если на одном компьютере несколько пользователей? Если это локальная сеть? В таком случае, видимо, нужно именно имя компьютера, на котором программа установлена? Как это записать? Пробовал вместо GetUserName написать GetComputerName и, соответственно, его имя. Даёт ошибки "Незадекларированный идентификатор:..." и "Access violation at address 008ABECB in module 'ПРОГА.exe'. Read of address 00000000."

Не боги горшки лепят!

Re: Как организовать проверку подлинности экземпляра программы?

К сожалению функция GetComputerName не реализована в текущей версии.

Dmitry.

Re: Как организовать проверку подлинности экземпляра программы?

Жаль. А планируется ли реализация GetComputerName? В локальной сети при наличии такой защиты (if GetUserName<>'UserName' then Form1.Close;) программа работает только на компьютере, на котором она установлена.

Не боги горшки лепят!

Re: Как организовать проверку подлинности экземпляра программы?

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

procedure Form1_OnShow (Sender: string; Action: string);
begin
    if (GetUserName<>'User1') AND
       (GetUserName<>'User2') AND
       (GetUserName<>'User3') AND
       (GetUserName<>'User4') AND
       (GetUserName<>'User5') 
       then Form1.Close;
end;
Dmitry.

Re: Как организовать проверку подлинности экземпляра программы?

Так и сделаю. Спасибо.

Не боги горшки лепят!

Re: Как организовать проверку подлинности экземпляра программы?

Записал так:

procedure Form1_OnShow (Sender: string; Action: string);
    begin
        if (GetUserName<>'МоёИмя') AND (GetUserName<>'User1') AND (GetUserName<>'User2') AND (GetUserName<>'User3')
        then MessageDlg(('ВАМ ОТКАЗАНО В ДОПУСКЕ' + #13#10+ 'К ПРОГРАММЕ "ProgramName"'),mtError, mbOK, 0);

        if (GetUserName<>'МоёИмя') AND (GetUserName<>'User1') AND (GetUserName<>'User2') AND (GetUserName<>'User3')
        then Form1.Close;
    end;

Работает.

Не боги горшки лепят!

Re: Как организовать проверку подлинности экземпляра программы?

Можно чуть проще

procedure Form1_OnShow (Sender: string; Action: string);
begin
       if (GetUserName<>'МоёИмя') AND (GetUserName<>'User1') AND (GetUserName<>'User2') AND (GetUserName<>'User3') then
       begin
            MessageDlg(('ВАМ ОТКАЗАНО В ДОПУСКЕ' + #13#10+ 'К ПРОГРАММЕ "ProgramName"'),mtError, mbOK, 0);
            Form1.Close;
       end; 
end;
Dmitry.

16 (edited by kunar80 2015-03-14 13:32:08)

Re: Как организовать проверку подлинности экземпляра программы?

А можно ли это реализовать через форму frmUsers, чтобы не трогать скрипт при добавлении нового пользователя? Т.е. в таблице users помимо колонок login и password иметь колонку GetUserName, в которую при добавлении нового пользователя записывать его GetUserName. При запуске проекта сравниваются актуальный GetUserName со всеми значениями, записанными в таблице. Если совпадения нет, то доступ запрещается. Если совпадение найдено, то любой из зарегистрированных пользователей может войти в проект под своим логином.
Попробовал так:

var
   sUser: string = '';  sGetUserName: string = '';  sBlock: string = '';
   idUser: integer;

procedure frmLogin_ComboBox1_OnChange (Sender: string);
var
   s: string;
begin
   frmLogin.Edit1.Text := frmLogin.ComboBox1.Text; // запись выбранного в комбобоксе логина в текстбокс
          //проверка прав работы с программой
          s := VarToStr( SQLExecute('SELECT GetUserName FROM users WHERE (GetUserName = ''' + sGetUserName + ''');') );
          if s<>'1' then
             begin
                MessageDlg(('ВАМ ОТКАЗАНО В ДОСТУПЕ'),mtError, mbOK, 0);
                //frmLogin.Close;
             end;
end;

но кроме выскакивания MessageDlg это ничего не даёт, что свидетельствует о том, что s := VarToStr( SQLExecute('SELECT GetUserName FROM users WHERE (GetUserName = ''' + sGetUserName + ''');') ); не работает.

Не боги горшки лепят!

Re: Как организовать проверку подлинности экземпляра программы?

данный скрипт необходимо разместить на кнопке OK, которую нажимают после ввода логина и пароля, скрипт будет примерно такой:

if SQLExecute('SELECT Count(*) FROM users WHERE GetUserName LIKE ''' + GetUserName + '''') = 0 then
begin
                MessageDlg(('ВАМ ОТКАЗАНО В ДОСТУПЕ'),mtError, mbOK, 0);
                frmLogin.Close;
end;
Dmitry.

Re: Как организовать проверку подлинности экземпляра программы?

Проверьте, есть ли в таблице users, поле GetUserName

Dmitry.

Re: Как организовать проверку подлинности экземпляра программы?

Прошу прощения. Моя ошибка: в таблице UserName, а в скрипте GetUserName

Не боги горшки лепят!

Re: Как организовать проверку подлинности экземпляра программы?

Три способа защиты проекта от несанкционированного использования:
http://myvisualdatabase.com/forum/misc. … download=1

Не боги горшки лепят!