之前有程序加密的需求,但机器码加密程序的方式太过单一,只能通过机器码和授权码在一台机器上进行加密,在淘宝上看到用硬件加密的加密狗,于是有了想法(游戏开始时读取U盘序列号,匹配通过后即可进入游戏),但无奈在C#实现功能后生成在类库,在Unity中居然用不了,这就很坑了,不过在此和大家分享一下C#读取U盘序列号的方法!
直接上代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management;
namespace USBFlashDriveOperation
{
public class GetData
{
private static void Main()
{
Console.WriteLine(CompareID("000000000272"));
}
public static bool CompareID(string inputID)
{
bool compareResult = false;
MatchDriveLetterWithSerial();
string[] idArray = _serialNumber.ToArray();
foreach (string id in idArray)
{
if(id.Equals(inputID))
{
compareResult = true;
}
else
{
compareResult = false;
}
}
return compareResult;
}
private static List<string> _serialNumber = new List<string>();
private static void MatchDriveLetterWithSerial()
{
string[] diskArray;
string driveNumber;
var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDiskToPartition");
foreach (ManagementObject dm in searcher.Get())
{
GetValueInQuotes(dm["Dependent"].ToString());
diskArray = GetValueInQuotes(dm["Antecedent"].ToString()).Split(',');
driveNumber = diskArray[0].Remove(0, 6).Trim();
var disks = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive");
foreach (ManagementObject disk in disks.Get())
{
if (disk["Name"].ToString() == ("\\\\.\\PHYSICALDRIVE" + driveNumber) & disk["InterfaceType"].ToString() == "USB")
{
_serialNumber.Add(ParseSerialFromDeviceID(disk["PNPDeviceID"].ToString()));
}
}
}
foreach (string id in _serialNumber)
{
Console.WriteLine(id);
}
}
private static string ParseSerialFromDeviceID(string deviceId)
{
string[] splitDeviceId = deviceId.Split('\\');
int arrayLen = splitDeviceId.Length - 1;
string[] serialArray = splitDeviceId[arrayLen].Split('&');
string serial = serialArray[0];
return serial;
}
private static string GetValueInQuotes(string inValue)
{
int posFoundStart = inValue.IndexOf("\"");
int posFoundEnd = inValue.IndexOf("\"", posFoundStart + 1);
string parsedValue = inValue.Substring(posFoundStart + 1, (posFoundEnd - posFoundStart) - 1);
return parsedValue;
}
}
}
在这里编译器可能会报错哦,需要添加System.Management的引用,按照1-4流程走一遍添加就行了。
OK了,可以看到我在方法里面将_serialNumber链表内容打印出来了,在插入U盘的情况下,控制台会出现一串数字(下面就出来了),在插入U盘的情况下控制台打印了U盘的序列号,通过CompareID方法可进行ID的匹配。
好了,C#获取U盘序列号就分享到这里!