Nun habe ich mein Programm fast fertig und möchte natürlich etwas Kontrollieren, wer es nutzen darf. Dazu habe ich mir folgende Gedanken gemacht:
Es soll vom Programm die MAC-Adresse des PC's ausgelesen werden (wenn mehrere vorhanden alle)
Diese wird mit einem Server (Debian Wheezy) abgestimmt (--> ist die / eine der MAC verfügbar?)
MAC in Liste vorhanden --> Programm schreibt eine Information (in eine versteckte config Datei / die Registry) und ist somit "Lizensiert"
Die Abfrage wird erst 1 Jahr später wieder durchgeführt
Im simpelsten Fall könnte ich jetzt eine txt Datei auf meinen Server klatschen und die auslesen lassen... das könnte aber auch jeder der die IP (fest) des Servers kennt... Gibt es vielleicht eine galante Lösung, die von außen nicht so leicht zu durchschauen ist?
Es geht mir hier nicht um ein bombensicheres System... nun Ottonormaluser soll das Programm nicht auf 10000000 Rechnern nutzen können.
Wenn Du den Server nicht mehr betreibst, ist das Programm nicht mehr nutzbar ?!?!?!?!
Das muss dann jedenfalls deutlich erkennbar in den Nutzungs-Bedingungen stehen. Möglicherweise ist es aber auch schlicht illegal.
Ich verwende Programme mit einem solchen "Challenge-Rresponse" Kopierschutz von "Native Instruments". Die haben bei einem Notar einen Code hinterlegt, den man in das (und alle anderen NI-) Programm eingeben kann und es dadurch unbeschränkt nutzbar macht. Wenn NI nicht mehr existiert wird der Notar den Code veröffentlichen.
pascalts hat geschrieben:Es soll vom Programm die MAC-Adresse des PC's ausgelesen werden (wenn mehrere vorhanden alle)
Da die MAC-Adresse fest mit der Netzwerkkarte verbunden ist und nur sehr selten durch den Benutzer geändert wird, gehört sie zu den personenbezogenen Informationen. Um diese speichern zu dürfen, benötigst du eine explizite Einverständniserklärung des Nutzers (AGB/EULA reicht nicht aus). Ich würde sogar soweit gehen, dass die MAC-Adresse selbst gar nicht benötigt wird und daher gar nicht erst gespeichert werden darf. Du kannst dann eine kryptografische Hash-Funktion darauf anwenden und deren Ergebnis weiterverwenden.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Um das klar zu stellen: ich verkaufe das Programm nicht, es wird nur Firmen intern genutzt (wo auch der Server steht). Es geht einfach darum das die Funktionen nicht für jeden nutzbar sein sollen, der in der Lage ist ein Programm zu installieren, sondern nur von den wenigen ausgewählten Leuten aus, die einen speziellen (firmen-) PC besitzen... Damit ich diese Beschränkung nun nicht "hart" in das Programm coden muss, suche ich nach einer Art der Verwaltung.
Aha, du willst also gar keine Lizenzverwaltung, sondern eine Rechteverwaltung. An dieser Stelle dürfte eine Einschränkung mit Benutzername und Passwort, die sinnvollere Lösung sein.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
Das klingt gut. Aber wie sorge ich dafür, das man mit einem Nutzername sich nur EINMAL "einloggen" kann... Dazu brauche ich wieder den Server, richtig?
pascalts hat geschrieben:wie sorge ich dafür, das man mit einem Nutzername sich nur EINMAL "einloggen" kann.
und
pascalts hat geschrieben: Es geht einfach darum das die Funktionen nicht für jeden nutzbar sein sollen, der in der Lage ist ein Programm zu installieren, sondern nur von den wenigen ausgewählten Leuten aus,
{---------------------------------}
//based on lazsolutions by Silvio Clecio.
//http://code.google.com/p/lazsolutions/source/browse/trunk/Core/LSUtils.pas
function MAC_Address: string;
{$IFDEF MSWINDOWS}
type
TCreateGUIDFunction = function(AGUID: PGUID): LongInt; stdcall;
{$ENDIF}
{$IFDEF UNIX}
const
VDevice: array[0..7] of string=('eth', 'wlan', 'ppp', 'ath', 'ra', 'msh', 'venet', 'vet');
{$ENDIF}
var
{$IFDEF UNIX}
VPath : string;
i,j : byte;
{$ENDIF}
{$IFDEF MSWINDOWS}
VLibHandle: TLibHandle;
VCreateGUIDFunction: TCreateGUIDFunction;
VGUID1, VGUID2: TGUID;
{$ENDIF}
begin
Result := '';
{$IFDEF UNIX}
for i:=0 to high(VDevice) do
for j:=0 to 9 do
begin
VPath := Format('/sys/class/net/%s/address', [VDevice[i]+inttostr(j)]);
if FileExists(VPath) then
with TFileStream.Create(VPath, fmOpenRead or fmShareDenyWrite) do
try
SetLength(Result, 17);
Read(Pointer(Result)^, 17);
exit;
finally
Free;
end;
end;
{$ENDIF}
{$IFDEF MSWINDOWS}
VLibHandle := LoadLibrary('rpcrt4.dll');
try
if VLibHandle <> NilHandle then
begin
VCreateGUIDFunction := TCreateGUIDFunction(GetProcedureAddress(VLibHandle,
'UuidCreateSequential'));
if Assigned(VCreateGUIDFunction) then
if (VCreateGUIDFunction(@VGUID1) = 0) and
(VCreateGUIDFunction(@VGUID2) = 0) and (VGUID1.D4[2] = VGUID2.D4[2]) and
(VGUID1.D4[3] = VGUID2.D4[3]) and (VGUID1.D4[4] = VGUID2.D4[4]) and
(VGUID1.D4[5] = VGUID2.D4[5]) and (VGUID1.D4[6] = VGUID2.D4[6]) and
(VGUID1.D4[7] = VGUID2.D4[7]) then
Result := Format('%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x', [VGUID1.D4[2], VGUID1.D4[3],
VGUID1.D4[4], VGUID1.D4[5], VGUID1.D4[6], VGUID1.D4[7]]);
end;
finally
UnloadLibrary(VLibHandle);
end;
{$ENDIF}
end;
Ob du den MAC-String oder einen Benutzernamen in der DB speicherst und auf Duplikate prüfst, ist ja egal. Und je nach OS gibt es auch standardisierte Verfahren.