我想保护我的应用程序。所以我读取了硬盘序列号并进行了比较。该应用程序在管理员用户模式下效果良好,但在标准用户模式下效果不佳。
我用 C# 编写了我的应用程序。但是为了读取硬盘序列号,我使用了我在 Delphi 中编写的 dll 文件。
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;
}
在标准用户模式下:
- 如果是 Delphi dll,它会抛出拒绝访问错误
- 在 WMI 的情况下,标准用户与管理员用户的输出不同。
注意:此问题(NO.2)仅在 Windows 7 中。