Почему результат от WMI отличается в стандартном режиме и от администратора пользователя в Windows 7? - PullRequest
0 голосов
/ 08 июня 2019

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

Я написал свое приложение на C #.Но для чтения серийного номера жесткого диска я использовал файл dll, который я написал в Delphi.

hDevice := CreateFile( '\\.\PhysicalDrive0:', GENERIC_READ or GENERIC_WRITE ,
        FILE_SHARE_READ or FILE_SHARE_WRITE , nil, OPEN_EXISTING, 0, 0 );

Я пытаюсь использовать NET, поэтому я использовал класс WMI Win32_DiskDrive, но этот метод также имеет плохие результаты в стандартном пользовательском режиме.

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;
} 

В стандартном пользовательском режиме:

  1. В случае Delphi dll выдает ошибку отказа в доступе
  2. В случае WMI выводотличается от обычного пользователя от администратора.

Примечание : эта проблема (№ 2) существует только в Windows 7.

Ответы [ 2 ]

0 голосов
/ 26 июня 2019

Пожалуйста, посмотрите это Ссылка .Результаты различаются в зависимости от версии Windows, от того, выполняется ли код от имени администратора или нет, а также от того, используется ли класс Win32_PhysicalMedia или класс Win32_DiskDrive.Кажется довольно ненадежным, вам, возможно, придется написать свой собственный слой абстракции, чтобы обрабатывать его самостоятельно, как описано в этих сообщениях на форуме.

Я попробовал это сам и обнаружил, что получил два разных серийных номера в зависимости от admin против normal и Win32_PhysicalMedia против Win32_DiskDrive:

VB38bb50ab-0de50c12

и

42563833626230356261302d6564303531632032

Обратите внимание, что вторая строка на самом деле hex-encoded иbyte-reversed версия первой строки!

0 голосов
/ 09 июня 2019

Пожалуйста, используйте следующий код при вызове CreateFile для доступа к физическому диску.Он работает без прав администратора и позволяет читать свойства диска:

hDisk := CreateFile ('\\.\PHYSICALDRIVE0', 0, FILE_SHARE_WRITE, NIL, OPEN_EXISTING,
                     FILE_ATTRIBUTE_NORMAL or FILE_FLAG_NO_BUFFERING, 0);

Обратите также внимание, что имя диска, переданное в качестве первого параметра CreateFile, не содержит двоеточие ":" вконец.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...