Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Protezione PC tramite USBKEY.
Forum - C# / VB.NET - Protezione PC tramite USBKEY. - Pagina 2

Pagine: [ 1 2 3 4 ] Precedente | Prossimo
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 22:43
Venerdì, 01/01/2010
Testo quotato

Postato originariamente da swet:

Ragazzi per il momento funziona contando le unità ogni X secondi e confrontarle con quelle che c' erano all' avvio del programma.
Codice sorgente - presumibilmente VB.NET

  1. If driveiniziali > drivecontrollo Then 'quindi la pennina è stata rimossa
  2.             Stato.Text = "Inserire la pendrive"
  3.         Else
  4.             For Each drive In Directory.GetLogicalDrives
  5.                 Cercaseriale()
  6.                 If Seriale = serialeunità Then
  7.                     Stato.Text = "PENDRIVE RILEVATA   " & drive
  8.                     Exit For 'da verificare
  9.                 End If
  10.             Next
  11.         End If



Come vedete faccio una ricerca della pendrive attraverso il seriale.
Il tutto è eseguito da un timer ogni 1500ms. Vi sembra pesante?


Pesante? Per nulla... molto più pulito e veloce dell'esempio che ho scritto in precedenza.

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 11:02
Sabato, 02/01/2010
Testo quotato

Postato originariamente da NetProgrammer:

Scusate ma perchè usare tutti questi cicli for do..loop ecc.. swet chiede come bloccare il pc alla rimozione di una chiave usb; basta controllare con un if se questa chiavetta intesa come drive è presente o meno e se non lo è blocca il pc. I vantaggi??
1) Niente cicli solo un if,
2) Niente combobox e quant'altro qundi risparmio in termini di spazio su disco e di pesantezza nel caricamento.
3) La possibilità di usare un timer senza appesantire ne il programma ne la memoria.



Sono d'accordo sulle listbox (totalmente inutili dato che non serve visualizzare nulla), ma non occupano spazio su disco (a meno che non vengano memorizzati nell'area di swap, ma questo avviene solo quando il processo è in pausa): tutti i dati relativi all'esecuzione vanno nella memoria di lavoro.

Inoltre, questo metodo del "guardare quanti ce ne sono" può funzionare in molti casi, ma non in tutti. Se, ad esempio, all'attivazione del programma esiste un dispositivo che viene poi rimosso, ma mentre la pendrive è ancora inserita, avrai che, nonostante l'inserimento della chiave, il programma rileva meno drives di quelli necessari a far partire il controllo. Quindi potresti togliere l'If e lasciare solamente il For, poiché presumiamo che il seriale dell'unità sarà unico indipendentemente dal numero di drives.

PM Quote
Avatar
swet (Normal User)
Pro


Messaggi: 128
Iscritto: 01/01/2009

Segnala al moderatore
Postato alle 11:13
Sabato, 02/01/2010
Usando questo codice:
Codice sorgente - presumibilmente VB.NET

  1. For Each drive In Directory.GetLogicalDrives
  2.             Cercaseriale()
  3.             If Seriale = serialeunità Then
  4.                 Stato.Text = "PENDRIVE RILEVATA   " & drive
  5.                 Exit For 'da verificare
  6.             Else
  7.                 Stato.Text = ("Pendrive non trovata")
  8.             End If
  9.         Next


ho il problema che ogni 1500ms mi riesegue il ciclo, quindi la stato.text mi cambia sempre. Se la label cambia sempre significa che il pc si blocca e si sblocca ogni 1500ms. L' unica cosa che mi viene in mente è fermare il timer, però poi come faccio a sapere se la pendrive è stata rimossa?
Grazie

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 11:25
Lunedì, 04/01/2010
Testo quotato

Postato originariamente da swet:

Usando questo codice:
Codice sorgente - presumibilmente VB.NET

  1. For Each drive In Directory.GetLogicalDrives
  2.             Cercaseriale()
  3.             If Seriale = serialeunità Then
  4.                 Stato.Text = "PENDRIVE RILEVATA   " & drive
  5.                 Exit For 'da verificare
  6.             Else
  7.                 Stato.Text = ("Pendrive non trovata")
  8.             End If
  9.         Next


ho il problema che ogni 1500ms mi riesegue il ciclo, quindi la stato.text mi cambia sempre. Se la label cambia sempre significa che il pc si blocca e si sblocca ogni 1500ms. L' unica cosa che mi viene in mente è fermare il timer, però poi come faccio a sapere se la pendrive è stata rimossa?
Grazie



Ma, semplicemente, non usare l'If dentro al For. A te serve che almeno uno dei dispositivi sia quello voluto. Perciò bisogna controllari al massimo tutti, ma il testo deve essere modificato una sola volta.
Inoltre, ti suggerisco di rendere CercaSeriale() una funzione: il codice sarà più ordinato e comprensibile. Ad esempio in questo modo:
Codice sorgente - presumibilmente VB.NET

  1. Dim PenDriveOn As Boolean = False
  2. For Each drive In Directory.GetLogicalDrives()
  3.   If CercaSeriale(drive) = Seriale Then
  4.     PenDriveOn = True
  5.     Exit For
  6.   End If
  7. Next
  8.  
  9. If PenDriveOn Then
  10.   Stato.Text = "PenDrive rilevata"
  11. Else
  12.   Stato.Text = "PenDrive non trovata"
  13. End If



La label non può cambiare a meno che si rimuova la pendrive.

PM Quote
Avatar
swet (Normal User)
Pro


Messaggi: 128
Iscritto: 01/01/2009

Segnala al moderatore
Postato alle 13:06
Lunedì, 04/01/2010
Ciao totem , ho provato a mettere tutto in una funzione , ma purtroppo non riesco a farlo funzionare, cioè mi dice sempre che la pendrive è collegata.Il codice che ho usato è questo sicuramente c'è qualche errore:
Codice sorgente - presumibilmente VB.NET

  1. Dim Seriale As String
  2.  
  3.     Dim serialeunità As String = "977A2C8C"
  4.  
  5.     Function Cercaseriale(ByVal drive As String) As String
  6.         Try
  7.             Dim HardDiskInfo As New ManagementObject(String.Format("Win32_LogicalDisk.DeviceID=""{0}""", Mid(drive, 1, 2)))
  8.             Seriale = HardDiskInfo.Properties("Volumeserialnumber").Value.ToString()
  9.         Catch
  10.             Stato.Text = "Si è verificato un errore"
  11.         End Try
  12.         Return Seriale
  13.     End Function
  14.  
  15.     Private Sub controllo()
  16.         Dim PenDriveOn As Boolean = False
  17.         For Each drive In Directory.GetLogicalDrives()
  18.             If Cercaseriale(drive) = Seriale Then
  19.                 PenDriveOn = True
  20.                 Exit For
  21.             End If
  22.         Next
  23.  
  24.         If PenDriveOn = True Then
  25.             Stato.Text = "PenDrive rilevata"
  26.         Else
  27.             Stato.Text = "PenDrive non trovata"
  28.         End If
  29.     End Sub



Puoi aiutarmi?

EDIT: Funziona alla grande! Il problema è che con il tuo codice facevo la verifica del seriale con la variabile seriale invece che con la veriabile serialeunità. Che errore stupido!!!! Grazie mille!!!
Ora ho un altro problema. Il software, adesso funziona(ovviamente) solo il seriale della mia pendrive, se volessi farlo funzionare anche con altri seriali, di altre pendrive? Scrivo i seriali in un file? E se il file venisse cancellato, la protezione andrebbe a farsi benedire giusto? Idee?! Grazie

Ultima modifica effettuata da swet il 04/01/2010 alle 13:47
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 17:57
Giovedì, 07/01/2010
Quello che ti propongo è poco "ortodosso", ma rende il seriale logicamente indistruttibile. Salvare quei dati su un qualsiasi supporto li rende sempre vulnerabili. Seguendo lo stesso ragionamento, anche il programma stesso potrebbe essere cancellato, ma di questo vedo che non te ne preoccupi. Se, allora, il programma non è un problema, salvare il seriale dentro il programma stesso lo rende imperdibile: se venisse rimosso, significherebbe che non esiste più neanche il programma, ma in quel caso avresti altro di cui preoccuparti.

Invece di salvarlo in un file qualsiasi, lo salvi direttamente nel programma eseguibile, scrivendo i dati alla fine del file. Essendo legato da specifiche di formato, non dovrebbe causare problemi l'aggiunta di bytes alla fine dell'exe. Io l'ho fatto e non ho avuto problemi.

Certo, in questo modo l'aggiunta o la modifica dei seriali diventa più difficile. Vedi tu come procedere...

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 20:03
Giovedì, 07/01/2010
Testo quotato

Postato originariamente da Il Totem:

Invece di salvarlo in un file qualsiasi, lo salvi direttamente nel programma eseguibile, scrivendo i dati alla fine del file. Essendo legato da specifiche di formato, non dovrebbe causare problemi l'aggiunta di bytes alla fine dell'exe. Io l'ho fatto e non ho avuto problemi.

Certo, in questo modo l'aggiunta o la modifica dei seriali diventa più difficile. Vedi tu come procedere...



Al posto di inserirlo alla fine dell'exe integralo come risorsa

PM Quote
Avatar
swet (Normal User)
Pro


Messaggi: 128
Iscritto: 01/01/2009

Segnala al moderatore
Postato alle 23:14
Giovedì, 07/01/2010
Cioè? Puoi spiegarmi cosa intendi? Grazie

PM Quote
Pagine: [ 1 2 3 4 ] Precedente | Prossimo