Страницы: 1
RSS
Получение средствами VBA серийного номера процессора
 
Можно ли средствами VBA получить серийный номер процессора? Или какие-нибудь другие уникальные физические параметры компьютера?
 
Код
Sub SNProc()
    Set WMI = GetObject("winmgmts:" _
                      & "{impersonationLevel=impersonate}!\\.\root\cimv2")
    Set it = WMI.ExecQuery("Select * from Win32_Processor")
    For Each i In it
        MsgBox i.ProcessorId
    Next
End Sub
Я сам - дурнее всякого примера! ...
 
Первый раз слышу что бы у процессора (CPU, я правильно понял?) был уникальный серийный номер! Т.е. он, конечно есть, но выгравирован на крышке и нигде не прошит. Если вы хотите привязаться к компьютеру можете попробовать прочесть серийный номер HDD.
 
тут много чего было
ссылка
 
Цитата
Первый раз слышу что бы у процессора (CPU, я правильно понял?) был уникальный серийный номер!
Тогда что за номер выдает код который написал KukIP?

Цитата
Если вы хотите привязаться к компьютеру можете попробовать прочесть серийный номер HDD
А его как прочесть?

Цитата
тут много чего было
Тут про учетные записи. А мне нужно привязаться к компьютеру именно физически.
Изменено: Olelucoye - 11.08.2013 23:24:16
 
Код
SN = CreateObject("scripting.filesystemobject").GetDrive("c:\").SerialNumber
Я сам - дурнее всякого примера! ...
 
Ну, скажем так - на эту тему сломано кучу копий. Любая защита ломается. Даже все возможные hard lock'и. Но если просто от пользователя, проще всего привязаться к номеру тома. К номеру винта сложнее, т.к. требуются низкоуровневые операции. Минус - он меняется при форматировании, да и может быть изменен руками. Но мы же надеемся на то что пользователь лопух! :)

вот где-то так:
Код
Private Declare Function GetVolumeInformation Lib "Kernel32" Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long) As Long

Private Const Original_Vol_SN = 1032938

Private Sub Check_SerNum()
    Dim Vol_SN As Long
    Dim DrvPath As String
    DrvPath = Left(Application.Path, 3) ' смотрим откуда запустили нашу программу
    GetVolumeInformation DrvPath, vbNullString, 0, Vol_SN, 0, 0, vbNullString, 0
    If Vol_SN <> Original_Vol_SN Then
        MsgBox "Вы, мерзкие пиратишки, украли мою гениальную программу!", vbCritical
    End If
End Sub



Где константа Original_Vol_SN - текушй сер.номер тома
 
caban_2001, чем Ваш способ определения с/н л. диска лучше предложенного в 6-м посте? К-во буковок преимуществом считать не будем  :D
Я сам - дурнее всякого примера! ...
 
Спасибо. Варианты с привязкой к лог.диску подойдут.
И все же есть какой-нибудь идентификатор компьютера, который не меняется в процессе эксплуатации, при условии, что оборудование меняться не будет?
 
Серийный номер физического диска. Он НЕ меняется ни при каком форматировании. Но без спецпрограмм к нему добраться будет тяжело.
Я сам - дурнее всякого примера! ...
 
Тоже хотел об этом сказать caban_2001))) А вот логический - да. Так что всё наоборот)
 
Может для идентификации использовать МАС-адрес
 
О mac-адресе я тоже думал. Но мне показалось, что это не лучший вариант. На компьютере их может быть несколько. Да и меняется легко.
 
Можно комбинацию нескольких параметров попробовать. Добавить туда ещё какие-нибудь свойства документа))
 
Эх, хотел лечь спать пораньше... Можно, конечно, и к mac-адресу привязаться. Запросить его через тот же WMI "SELECT * FROM Win32_NetworkAdapterConfiguration WHERE MACAddress IS NOT NULL". И, кстати, заменить его гораздо сложнее, чем серийный номер тома. Не все драйвера это так просто позволяют.
Там же можно посмотреть железный, не изменяемый, серийный номер HDD.
Просто замените команду на "SELECT * FROM Win32_DiskDrive WHERE Index = 0" и проверяйте параметр .SerialNumber.
Я просто привел пример с номером тома, т.к. это самая простая защита от л.. пользователя.
Прикол в том, что это был мой первый опыт с VBA пару лет назад. Ну, привязал программист к железу софт, но реально комп накрылся, а данные нужны! Защиту с проекта я снял, погуглив 5 минут. И еще через пару минут вместо "<>", поставил "=".
Я это к чему говорю: любая программная зашита ломается при желании!! А для уж совсем дремучих юзеров любой метод пойдет и не стоит огород городить...
Изменено: caban_2001 - 12.08.2013 03:47:31
 
Через WMI SerialNumber определяется только для IDE-накопителей, SATA-не распознает.
Я сам - дурнее всякого примера! ...
 
Цитата
Через WMI SerialNumber определяется только для IDE-накопителей, SATA-не распознает.

Я попробовал - все мои пять винтов, все SATA, один из них SSD, и всем четко определен серийный номер.
Может еще в ОС дело? У меня Windows 7 x64, под XP нет возможности проверить.

Код
Sub GetHDD_SerNum()
    Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
    Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_DiskDrive", , 48)
    For Each Item In colItems
        MsgBox Item.SerialNumber
    Next
End Sub


Для первого HDD можно в запрос добавить "WHERE Index=0"
 
Под ХР.
Я сам - дурнее всякого примера! ...
 
У меня аналогично (ХР)
Страницы: 1
Читают тему
Наверх