WMI seriale hard disk

venerdì 11 novembre 2005 - 09.58

Seventyone Profilo | Newbie

Salve a tutti
in un accesso di pazzia avrei deciso di implementare una protezione ad una applicazione facendo in modo di creare un codice di attivazione che sia derivato dal SerialNumber dell’HD dove è installato il programma, ovviamente non il seriale creato dalla formattazione ma quello univoco assegnato dalla casa costruttrice.
Utilizzando la System.Management e quindi WMI riesco a trovare i seriali degli HD ed anche l’HD su cui si trova l’eseguibile dell’applicazione, il problema si pone perché non riesco a collegare le due cose perché il seriale dell’hd lo trovo con la query “SELECT * FROM Win32_PhysicalMedia” mentre l’eseguibile lo trovo con "SELECT * FROM CIM_DataFile where FileName='NomeMiaApplicazione' and FileType='Applicazione'" da qui si possono ricavare altre informazioni, quella che avevo pensato di utilizzare è “Drive” che mi dà la lettera associata a quell’HD (o partizione dello stesso cambia poco) e qui mi sono bloccato perché non sono riuscito a trovare un modo per associare questo risultato alla query per trovare il numero seriale dell’HD,
ho pensato di associare “Drive” al CIM_LogicalDisk ma non c’è niente che possa essere associato al risultato della prima query, qualche idea su come risolvere il problema?

Brainkiller Profilo | Guru

>ho pensato di associare “Drive” al CIM_LogicalDisk ma non c’è
>niente che possa essere associato al risultato della prima query,
> qualche idea su come risolvere il problema?

Ciao,
non ho ben capito dove ti stai bloccando. Ho capito che vuoi creare un codice composito da serial number del disco fisso, unità di avvio ed eseguibile dell'applicazione.

Allora il serial number mi pare che già l'hai recuperato con le classi WMI, l'unità pure e anche l'eseguibile. (Fra parentesi unità e eseguibile li puoi recuperare anche senza WMI).

Ora il problema qual è ?
Ciao

David De Giacomi
Microsoft MVP
http://blogs.dotnethell.it/david/

Seventyone Profilo | Newbie

scusami probabilmente mi sono espresso male, io vorrei creare il codice di attivazione dal SerialNumber del disco fisso ora se il pc ha un unico disco il problema non si pone perchè basta la query "SELECT * FROM Win32_PhysicalMedia" da cui estraggo il seriale, ma se gli hd sono più di uno devo prendere il seriale di quello dove è installato il programma e qui utilizzo la seconda query (che in verità diventa la prima) "SELECT * FROM CIM_DataFile where FileName='NomeMiaApplicazione' and FileType='Applicazione'" questa query mi restituisce (tra gli altri) il valore “Drive” in questo caso è “c:” e nessun altro riferimento all’hd, quindi tramite il valore di “Drive” dovrei risalire al serialNumber dell’hd ma non riesco a trovare una terza query che mi faccia da collegamento fra le due query precedenti

quindi riassumendo faccio la query
"SELECT * FROM CIM_DataFile where FileName='NomeMiaApplicazione' and FileType='Applicazione'"
estraggo il valore “Drive”
nuova query che in base a “Drive” mi trovi l’hd tra quelli logici
"SELECT * FROM CIM_LogicalDisk where DeviceID='"+drive+"'"
ultima query per trovare i valori di quell’hd
"SELECT * FROM Win32_PhysicalMedia"
da qui estraggo il serial number
il problema è che nella seconda query (quella sui dischi logici) nessun valore è associabile all’ultima (dischi fisici)


Seventyone Profilo | Newbie

per cortesia potresti indicarmi come recuperare questi valori anche senza WMI

Brainkiller Profilo | Guru

>per cortesia potresti indicarmi come recuperare questi valori
> anche senza WMI

Ciao,
allora, mi viene in mente un'altra soluzione. Mi sembra che la stai facendo più complicata di quanto realmente è.
Allora, io direi che ti basta tanto per cominciare un'enumerazione dei dischi. Lì avrai come risultato oltre ai vari serial number dei dischi anche le lettere C, D, Ecc. Poi da .NET vedi senza fare query ma con le istruzioni di .NET sull'Environment, dove è localizzato l'eseguibile esempio c:\programmi\ecc. prendi la prima lettera cioè il volume su cui è installato e fai un ciclo sulle lettere dei dischi rilevati con WMI, dove c'è corrispondenza (verifichi con un banale IF e con un ciclo For) prendi il Serial Number e poi crei il tuo codice di attivazione.

Non so se mi sono spiegato.
Ciao

David De Giacomi
Microsoft MVP
http://blogs.dotnethell.it/david/

Seventyone Profilo | Newbie

Ciao, scusa il ritardo ma ero fuori
utilizzare l'Environment è sicuramente un'ottima soluzione, sicuramente più veloce di quella che avevo trovato io, la utilizzerò sicuramente,
però non sono riuscito a capire come vorresti prendere il seriale fisico di quell'HD, la query che restituisce serial number e lettere di unità è la "SELECT * FROM CIM_LogicalDisk" ma restituisce i seriali logici non fisici e quindi soggetti a variazione se l'HD viene formattato, io ho utilizzato i WMI Tools per le query e non mi è parso ci fossero altre classi su cui fare la query per farmi restituire sia la lettera di unità che il serial number ma può darsi che non l'abbia vista, tu ne hai trovate altre?

Brainkiller Profilo | Guru

>fisico di quell'HD, la query che restituisce serial number e

Ok ora ho capito, devi usare la classe Win32_PhysicalMedia che ha una proprietà che è Serial che corrisponde al seriale fisico del disco fisso.

>lettere di unità è la "SELECT * FROM CIM_LogicalDisk" ma restituisce
>i seriali logici non fisici e quindi soggetti a variazione se
>l'HD viene formattato, io ho utilizzato i WMI Tools per le query
>e non mi è parso ci fossero altre classi su cui fare la query
>per farmi restituire sia la lettera di unità che il serial number

In effetti ho provato a cercare anche io in questo senso per vedere se c'è un valore che può collegare in una sorta di Join volume logico con disco fisico. Non l'ho trovato ma credo ci sia. Scarica questo Tool intanto che si chiama Scriptomatic 2.0 non so se è simile a quello che usi tu ma io mi trovo molto bene:
http://www.microsoft.com/downloads/details.aspx?FamilyID=09dfc342-648b-4119-b7eb-783b0f7d1178&displaylang=en&Hash=WTJS3BC

ciao


David De Giacomi
Microsoft MVP
http://blogs.dotnethell.it/david/
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5