[C#] 纯文本查看 复制代码 internal class Agile
{
// 注册表路径和键名,用于硬件锁验证
static string registryPath = @"SOFTWARE\Tecnomatix\TUNE\AdminTools\Options\EMS";
static string registryKeyName = "WinVmp"; // 假设注册表键的名字是 "HardwareInfo"
// 静态缓存变量,用于保存验证后的结果,避免重复验证
private static bool? _isLicenseValid = null;
// 检查许可证的方法,包含硬件锁和时间锁的验证逻辑
public static int Check()
{
// 如果已缓存验证结果,则直接返回
if (_isLicenseValid.HasValue)
{
return _isLicenseValid.Value ? 0 : 2;
}
try
{
// 1. 首先尝试获取 AgileDotNetLicense 对象
AgileDotNetLicense license = AgileDotNetLicenseProvider.Validate(null, null, false);
if (license != null)
{
// 验证时间锁和硬件锁,如果两个都有效,返回 0
if (ValidateTimeLock(license) && ValidateHardwareLock(license))
{
_isLicenseValid = true; // 缓存结果为有效
return 0;
}
else
{
_isLicenseValid = false; // 缓存结果为无效
return 1;
}
}
// 2. 如果许可证为空,读取 localhost.ini 文件
string key = null;
string baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
string filePath = Path.Combine(baseDirectory, "DotNetCommands", "SimTool", "localhost.ini");
if (File.Exists(filePath))
{
// 读取 localhost.ini 文件中的路径
string licensePath = File.ReadAllText(filePath).Trim();
// 检查路径是否为局域网路径 (路径以 `\\` 开头)
if (licensePath.StartsWith(@"\\"))
{
string[] licenseFiles = Directory.GetFiles(licensePath, "*.lic");
// 遍历所有 .lic 文件并读取第一个许可证文件内容
foreach (string licenseFile in licenseFiles)
{
if (File.Exists(licenseFile))
{
key = File.ReadAllText(licenseFile).Trim(); // 读取许可证文件内容
break;
}
}
}
}
// 3. 如果 key 仍然为空,使用固定的 key
if (key == null)
{
key = "mGTbwQ6uf7rWmM78yGXa7V4PEhE6SvcdFNjikjpEHS6rLoJxUrDJ9Pv4RGvuLXNq4c4u7FfJXXQOYpIUrfsKcp+WjRuILY5wHY0KE7hQCP4mg0hLFQUieZOgprZybM5RwklbW59s";
}
// 使用 key 创建 AgileDotNetLicense 对象并验证
AgileDotNetLicense fallbackLicense = AgileDotNetLicenseProvider.CreateLicenseFromString(key);
// 如果两个锁都验证成功,返回 0
if (ValidateTimeLock(fallbackLicense) && ValidateHardwareLock(fallbackLicense))
{
_isLicenseValid = true; // 缓存结果为有效
return 0;
}
else
{
_isLicenseValid = false; // 缓存结果为无效
return 1;
}
}
catch (Exception ex)
{
// 捕获异常,记录错误并返回失败状态
MessageBox.Show("许可证验证失败: " + ex.Message);
_isLicenseValid = false;
return 1;
}
}
// 验证时间锁的方法
private static bool ValidateTimeLock(AgileDotNetLicense license)
{
TimeLock[] timeLocks = license.GetLocks<TimeLock>();
if (timeLocks != null && timeLocks.Length > 0)
{
foreach (TimeLock timeLock in timeLocks)
{
// 如果有一个时间锁未过期,则时间锁有效
if (timeLock.DaysToExpire > 0)
{
return true;
}
}
}
return false; // 时间锁无效
}
// 验证硬件锁的方法,通过注册表匹配硬件信息
private static bool ValidateHardwareLock(AgileDotNetLicense license)
{
HardwareProfileLock hardwareLock = license.GetLocks<HardwareProfileLock>().FirstOrDefault();
if (hardwareLock != null)
{
string hardwareHashFromLicense = hardwareLock.ProfileHash;
// 打开注册表路径并读取硬件指纹信息
try
{
using (RegistryKey key = Registry.LocalMachine.OpenSubKey(registryPath))
{
if (key != null)
{
object registryValue = key.GetValue(registryKeyName);
if (registryValue != null && registryValue.ToString() == hardwareHashFromLicense)
{
return true; // 硬件信息匹配
}
}
}
}
catch (Exception ex)
{
// 捕获异常,记录错误并返回失败状态
MessageBox.Show("读取注册表时发生错误: " + ex.Message);
}
}
return false; // 硬件信息不匹配
}
}
自己花了两天研究了一下Agile.Net许可代码,可以实现日期验证和硬件的验证,但是硬件验证会卡几秒 不知道是这个软件的问题还是API用的不对 麻烦有大佬看到帮忙解决下 三克油 |