Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.94/88: Рейтинг темы: голосов - 88, средняя оценка - 4.94
8 / 9 / 3
Регистрация: 18.11.2009
Сообщений: 676

Получение серийного номера материнской платы

26.09.2015, 13:04. Показов 18788. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
насколько это надежно работает? будет ли он ТОЧНО получен или скажем так- получен но не для всех моделей. Кто нибудь знает подробности? Или может рациональнее получать какую нибудь другую черту hardware(чтобы потом использовать как элемент защиты программы)
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.09.2015, 13:04
Ответы с готовыми решениями:

Получение серийного номера тома NTFS
Приветствую! Есть необходимость читать серийный номер тома NTFS. В классе DriveInfo такого свойства или метода я не нашел. Стал...

Как можно узнать номер материнской платы?
Здравствуйте! Как можно узнать номер материнской платы? Искал в гугле, примеры есть но ничего не выходит.

Подмена id процессора, материнской платы и жесткого диска
Собственно возможно ли на какое-то время их изменить, а потом вернуть обратно?

22
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
26.09.2015, 13:11
Цитата Сообщение от Анарион Посмотреть сообщение
насколько это надежно работает?
Я использую этот способ, пока никаких проблем не возникало.
0
8 / 9 / 3
Регистрация: 18.11.2009
Сообщений: 676
26.09.2015, 13:31  [ТС]
а не подскажете в коде как это реализуется в общих чертах хотя бы? по поиску здесь на форуме есть один пример но он не работает. или может лучше использовать серийный номер процессора?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
26.09.2015, 13:50
Лучший ответ Сообщение было отмечено Ev_Hyper как решение

Решение

Цитата Сообщение от Анарион Посмотреть сообщение
в коде как это реализуется в общих чертах хотя бы?
Ну вот ниже полностью работающий пример.
Цитата Сообщение от Анарион Посмотреть сообщение
по поиску здесь на форуме есть один пример но он не работает
Быть такого не может. Если правильно помню, в ветке по VB.NET есть работающий пример. Переписать его на шарп проблем не составляет.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Management;
using System.Reflection;
using System.Security.Cryptography;
 
namespace MyNanespace {
    static class Protector {
        
        //Код машины где запущена программа
        public static string FullMachineInfo { get; private set; }
        //Путь к файлу ключа
        static string keyFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Filename.bin");
 
        //Статический конструктор
        static Protector() {
            //Построение строки-кода
            string mcuID = new string(GetProcessor_ID().Select(ch => (char)(ch + 1)).ToArray());
            string mbID=new string(GetMotherBoard_ID().Select(ch=>(char)(ch+1)).ToArray());
            FullMachineInfo=string.Join("@",mcuID, mbID);
        }
 
        //Открытый метод проверки наличия и корректности ключа
        public static bool GetRegisterResult() {
            if (!File.Exists(keyFilePath)) {
                return false;
            }
            if (!Decrypt(keyFilePath)) {
                return false;
            }
            return true;
        }
 
        //Метод дешифрования-файла ключа
        static bool Decrypt(string path) {
            //Формирование ключа дешифровки с подгонкой под размер
            List<byte> providerKey = new List<byte>(Encoding.Default.GetBytes(FullMachineInfo));
            if (providerKey.Count < 0x20) {
                providerKey.AddRange(new byte[0x20 - providerKey.Count]);
            }
            else {
                providerKey.RemoveRange(0x20, providerKey.Count - 0x20);
            }
            //Формирование вектора инициализации дешифровки
            byte[] providerIV = Enumerable.Range(0, 0x10).Select(i => (byte)i).ToArray();
 
            //Текущая исполняемая сборка
            Assembly asm = Assembly.GetExecutingAssembly();
 
            //Тело точки входа
            MethodBody mainMethodBody = asm.EntryPoint.GetMethodBody();
 
            //CIL код оригинальной точки входа как массива байт
            byte[] entryPointOriginal = mainMethodBody.GetILAsByteArray();
 
            //Массив байт файла-ключа(зашифрованная точка входа)
            byte[] entryPointEncrypted = File.ReadAllBytes(path);
 
            //Объект-шифровальщик
            using (Aes provider = Aes.Create()) {
                //Ключ и вектор инициализации шифровальщика
                provider.IV = providerIV;
                provider.Key = providerKey.ToArray();
 
                //Дешифратор
                using (ICryptoTransform decryptor = provider.CreateDecryptor()) {
                    //Блок обработки ошибок
                    try {
                        //Массив расшифрованной точки входа из файла ключа
                        byte[] entryPointDecrypted =
                            decryptor.TransformFinalBlock(entryPointEncrypted, 0, entryPointEncrypted.Length);
                        //Сравнение по размеру
                        if (entryPointOriginal.Length != entryPointDecrypted.Length) {
                            return false;
                        }
 
                        //Сравнение по значениям
                        for (int i = 0; i < entryPointDecrypted.Length; i++) {
                            if (entryPointDecrypted[i] != entryPointOriginal[i]) {
                                return false;
                            }
                        }
                    }
                    catch {
                        //Возврат false при ошибке расшифровки
                        return false;
                    } 
                }
            }
            return true;
        }
        #region NOT_USED
        //Метод получения информации о целевом ПК
        static void GetUserConfigurationInfo() {
            SelectQuery[] queries = new SelectQuery[3]{
                new SelectQuery("Win32_Processor"),
                new SelectQuery("Win32_BaseBoard"),
                new SelectQuery("Win32_VideoController")
            };
            string[] infoQueries = { "processorId", "SerialNumber", "AdapterRAM" };
            string[] results = new string[3];
            int index = 0;
 
            foreach (SelectQuery query in queries) {
                ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
                ManagementObjectCollection.ManagementObjectEnumerator enumerator =
                    searcher.Get().GetEnumerator();
                while (enumerator.MoveNext()) {
                    ManagementObject info = (ManagementObject)enumerator.Current;
                    results[index] = info[infoQueries[index]].ToString().Trim();
                }
                index++;
            }
            FullMachineInfo = new string(string.Join("@", results).Select(ch => (char)(ch + 1)).ToArray());
        }
        #endregion
        #region USED
        //Метод для получения ProcessorID
        private static string GetProcessor_ID() {
            string ProcessorID = string.Empty;
            SelectQuery query = new SelectQuery("Win32_processor");
            ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
            ManagementObjectCollection.ManagementObjectEnumerator enumerator = searcher.Get().GetEnumerator();
            while (enumerator.MoveNext()) {
                ManagementObject info = (ManagementObject)enumerator.Current;
                ProcessorID = info["processorId"].ToString().Trim();
            }
            return ProcessorID;
        }
        //Метод для получения MotherBoardID
        private static string GetMotherBoard_ID() {
            string MotherBoardID = string.Empty;
            SelectQuery query = new SelectQuery("Win32_BaseBoard");
            ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
 
 
            ManagementObjectCollection.ManagementObjectEnumerator enumerator = searcher.Get().GetEnumerator();
            while (enumerator.MoveNext()) {
                ManagementObject info = (ManagementObject)enumerator.Current;
                MotherBoardID = info["SerialNumber"].ToString().Trim();
            }
            return MotherBoardID;
        }
        //Метод для получения VideoController_RAM
        private static string GetVideoAdapter_ID() {
            string MotherBoardID = string.Empty;
            SelectQuery query = new SelectQuery("Win32_VideoController");
            ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
 
 
            ManagementObjectCollection.ManagementObjectEnumerator enumerator = searcher.Get().GetEnumerator();
            while (enumerator.MoveNext()) {
                ManagementObject info = (ManagementObject)enumerator.Current;
                MotherBoardID = info["AdapterRAM"].ToString().Trim();
            }
            return MotherBoardID;
        }
        #endregion
    }
}
6
8 / 9 / 3
Регистрация: 18.11.2009
Сообщений: 676
26.09.2015, 14:15  [ТС]
спасибо за код! но он же еще и другое делает. не объясните что это за ключ и его проверка? и в чем смысл наличия такого ключа?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
26.09.2015, 17:07
Цитата Сообщение от Анарион Посмотреть сообщение
он же еще и другое делает
Естественно. Это практически полный код придуманной мной защиты.
Цитата Сообщение от Анарион Посмотреть сообщение
что это за ключ
Файл ключа (ну, скажем так, лицензионный файл).
Цитата Сообщение от Анарион Посмотреть сообщение
в чем смысл наличия такого ключа?
Без такого ключа программа просто не запускается.
0
8 / 9 / 3
Регистрация: 18.11.2009
Сообщений: 676
26.09.2015, 17:45  [ТС]
а если пользователь попросту скопирует другому пользователю программу вместе с ключем))?
в чем же смысл тогда здесь?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
26.09.2015, 18:38
Цитата Сообщение от Анарион Посмотреть сообщение
если пользователь попросту скопирует другому пользователю программу вместе с ключем))?
И? Это не приведет к желаемому результату)))
Цитата Сообщение от Анарион Посмотреть сообщение
в чем же смысл тогда здесь?
См. выше)))
0
 Аватар для DELAKEY
6 / 6 / 3
Регистрация: 20.11.2013
Сообщений: 249
26.09.2015, 19:36
Цитата Сообщение от Анарион Посмотреть сообщение
а если пользователь попросту скопирует другому пользователю программу вместе с ключем))?
в чем же смысл тогда здесь?

Не по теме:

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

0
8 / 9 / 3
Регистрация: 18.11.2009
Сообщений: 676
26.09.2015, 20:11  [ТС]
ха! а если пользователь который купил у вас программу сменит материнку, что ему тогда делать))?

Добавлено через 24 секунды
кстати а не подскажете почему недостаточно просто проверку if-ом делать на наличие ключа, зачем шифрованные точки входа?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
26.09.2015, 20:20
Цитата Сообщение от Анарион Посмотреть сообщение
если пользователь который купил у вас программу сменит материнку, что ему тогда делать))?
А вы часто меняете материнскую плату?

Добавлено через 32 секунды
Цитата Сообщение от Анарион Посмотреть сообщение
зачем шифрованные точки входа?
Мне так показалось интереснее (по некоторым причинам).
0
8 / 9 / 3
Регистрация: 18.11.2009
Сообщений: 676
26.09.2015, 20:33  [ТС]
А вы часто меняете материнскую плату?
--------
а у вас много софта становится негодным после смены материнской платы?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
26.09.2015, 20:36
Цитата Сообщение от Анарион Посмотреть сообщение
а у вас много софта становится негодным после смены материнской платы?
Анарион, вы вольны делать защиту своей программы каким угодно способом, и это ваши (и только ваши) проблемы. Вы просили код - он у вас есть.
Что касается моих программ - их пользователей устраивает тот способ, что я применяю, и не надо мне говорить, что лучше, а что хуже. Это мои программы, и вы не их пользователь, так что думайте о своих.
1
8 / 9 / 3
Регистрация: 18.11.2009
Сообщений: 676
26.09.2015, 21:14  [ТС]
за код большое спасибо. про серийный номер я! А мои посты не имели не малейший оттенок претензий. просто как раз сам думаю над тем, как это сделать но чтобы не нужно было каждый раз перезаправшивать ключ к новым комплектующим.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
26.09.2015, 21:19
Цитата Сообщение от Анарион Посмотреть сообщение
как это сделать но чтобы не нужно было каждый раз перезаправшивать ключ к новым комплектующим.
Да практически никак, если программа не привязана к сети. Так или иначе, к чему-то надо привязываться. Но по моему опыту, материнки летят не часто, да и я веду базу с пользователями, даже если и один лишний раз дам кому-то активацию - не велика беда.

Добавлено через 1 минуту
А вот если программа сетевая - там все проще, и надежность защиты намного выше (как и контроль за поведением пользователей). Такой вариант у меня тоже кое-где используется.
1
8 / 9 / 3
Регистрация: 18.11.2009
Сообщений: 676
26.09.2015, 22:14  [ТС]
а как у вас решился вопрос с "дать активацию" для этого теоретически они вам должны послать номер платы, чтобы по нему вы ключ составили. или как?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
26.09.2015, 22:28
Цитата Сообщение от Анарион Посмотреть сообщение
а как у вас решился вопрос с "дать активацию"
Если программа не активирована, она сама при запуске создает в том же каталоге текстовый файл с необходимым кодом. Пользователь потом просто присылает мне этот файл и все.
0
8 / 9 / 3
Регистрация: 18.11.2009
Сообщений: 676
27.09.2015, 12:31  [ТС]
добавил все using
но почему то не находит в пространстве имен это
ManagementObjectSearcher
и вот это
ManagementObjectCollection
и это
ManagementObject
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
27.09.2015, 12:37
Цитата Сообщение от Анарион Посмотреть сообщение
почему то не находит в пространстве имен это
Надо добавить ссылку на библиотеку, а потом импортировать пространство имен.
Пространство имен: System.Management
Сборка: System.Management (в System.Management.dll)
1
8 / 9 / 3
Регистрация: 18.11.2009
Сообщений: 676
27.09.2015, 12:46  [ТС]
а не подскажете можно эту длл-ку поместить в папку с программой? она будет работать?
а то вдруг она не во всех виндоус имеется.

Добавлено через 1 минуту
или может это часть NET framework?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.09.2015, 12:46
Помогаю со студенческими работами здесь

Получение сведений о материнской плате
всем привет!) подскажите как получить значения мат. платы? копался в WMI, но там какое бы значение я не брал везде выводит Motherboard,...

Получение серийного номера USB исключение
Привет, есть мониторинг событий на форме. Выглядит он так. // Для перехвата сообщений в WPF private const int...

Получение серийного номера диска с помощью GetVolumeInformation
Хотел вывести серийный номер диска, ошибка на строку вызова функции public partial class Form1 : Form { ...

Способ получения из реестра серийного номера и модели активного (подключенного в данный момент) монитора
Есть способ получения из реестра серийного номера и модели активного (подключенного в данный момент) монитора. private void...

Узнать модель материнской платы
Как узнать модель материнки, а также частоту оперативной памяти.... Нашел статью как узнать модель процессора.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru