mzandi Ответов: 3

Как получить серийный номер жесткого диска windows 7, когда разрешение пользователя является стандартным


i want protect of my application .so i read serial number hard drive and compare.  the application  has good result in mode administrator user but it has bad result in mode standard user.
i wrote my application with c#.but for read serial number hard i used of  a dll file  that i wrote with delphi. 
<pre>hDevice := CreateFile( '\\.\PhysicalDrive0:', GENERIC_READ or GENERIC_WRITE ,
        FILE_SHARE_READ or FILE_SHARE_WRITE , nil, OPEN_EXISTING, 0, 0 );

эта строка кода в режиме стандартного пользователя возвращает ошибку.

Что я уже пробовал:

i try use of .net. so i using of WMI class(Win32_DiskDrive) but this method has result bad  in mode standard user too.
private string getserial()
        {
            string SerialNumber = "";
            string dataForSerial = string.Empty;
            
                        ManagementObjectSearcher Finder = new ManagementObjectSearcher("Select * from Win32_OperatingSystem");
            string Name = "";
            
            foreach (ManagementObject OS in Finder.Get()) Name = OS["Name"].ToString();

            //Name = "Microsoft Windows XP Professional|C:\WINDOWS|\Device\Harddisk0\Partition1"

            int ind = Name.IndexOf("Harddisk") + 8;
            int HardIndex = Convert.ToInt16(Name.Substring(ind, 1));
            Finder = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive WHERE Index=" + HardIndex);
            foreach (ManagementObject HardDisks in Finder.Get())
                foreach (ManagementObject HardDisk in HardDisks.GetRelated("Win32_PhysicalMedia"))
                    SerialNumber = HardDisk["SerialNumber"].ToString();

            // SerialNumber = dataForSerial;
          
            return SerialNumber;
        }
please help me. thank you

phil.o

Репост из Команда Run функция CreateFile в Win32 в качестве обычного пользователя[^]
Ответ Дейва Кресковяка может быть не таким, как вы ожидали, но вот факт: доступ к необработанным устройствам, как вы пытаетесь сделать, требует привилегий администратора, по соображениям безопасности Более того, попытка защитить ваше приложение, полагаясь на серийный номер жесткого диска, не является универсальным решением, которое будет работать в любом случае: некоторые установки не устанавливают никакого серийного номера на жестком диске. Не говоря уже о том, что приложение C# может быть реверсивно спроектировано за считанные секунды для любого, кто достаточно мотивирован, чтобы взломать ваше приложение.

Dave Kreskowiak

Я только что попробовал проверить вашу схему. Мой рабочий ноутбук вернул определенный серийный номер. Затем я проверил свой рабочий стол, и он вернул серийный номер, который был немного другим. Ладно, ничего страшного.

У меня есть дюжина виртуальных машин, работающих на рабочем столе, и я проверил каждую из них. Виртуальные машины Windows 7 возвращали два разных серийных номера, хотя один из них был одинаковым для настольной машины. Все виртуальные машины Windows 10 возвращали один и тот же серийный номер. А еще лучше, они вернули точно такой же серийный номер, что и мой ноутбук!

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

mzandi

я хочу знать, почему результат WMI является deffrent в стандартном режиме и пользователь администратор в Windows 7

3 Ответов

Рейтинг:
1

Dave Kreskowiak

Опять же, ваш существующий код не будет работать, потому что он делает очень плохие предположения о том, как данные выложены в WMI, и не может надежно вернуть "загрузочный диск".

Кроме того, опять же, вы делаете предположение, что каждый диск даже имеет серийный номер. Но это не так.

Как насчет того, чтобы попытаться получить серийный номер на виртуальной машине с виртуальным жестким диском? Физического диска не существует. Еще лучше, что несколько машин, сделанных из одного и того же изображения, могут иметь один и тот же серийный номер, если он вообще существует! Ты ведь об этом не подумал, правда?

Не используйте серийный номер жесткого диска в качестве единственного "ключа" для идентификации системы. Это совсем ненадежно.


Рейтинг:
0

jsc42

Учитывая предостережения в решениях 1 и 2 выше, вы можете легко получить серийный номер no с помощью MS-DOS. Запуска оболочки() и собрать стандартный вывод с помощью команды

dir c:\. 2>nul: | Find "Volume Serial Number"


Результат будет выглядеть так
Volume Serial Number is D078-97C2


MadMyche

Плакат ищет серийный номер жесткого диска, а не серийный номер тома.
Том SN ненадежен: он может быть изменен, не уникален и даже может иметь 2 экземпляра с одним и тем же значением одновременно на машине.