在asp.net应用程序中获取卷序列号的最佳方法?

在asp.net应用程序中获取卷序列号的最佳方法?,asp.net,permissions,pinvoke,Asp.net,Permissions,Pinvoke,我在一个ASP.Net应用程序上工作,它是现有winforms桌面应用程序的web版本。桌面应用程序读取定义已启用功能的许可证文件以适应其行为。要将应用程序锁定到特定计算机,许可证文件的设置之一是第一个系统卷的序列号。启动时,应用程序将检查许可证文件中的序列号是否与卷序列号匹配。获取卷序列号是通过PInvoking kernel32.dll的GetVolumeInformation函数完成的。 但是,在asp.net版本中,使用本地服务或本地网络标识的标准应用程序池没有PInvoke权限,因此无

我在一个ASP.Net应用程序上工作,它是现有winforms桌面应用程序的web版本。桌面应用程序读取定义已启用功能的许可证文件以适应其行为。要将应用程序锁定到特定计算机,许可证文件的设置之一是第一个系统卷的序列号。启动时,应用程序将检查许可证文件中的序列号是否与卷序列号匹配。获取卷序列号是通过PInvoking kernel32.dll的
GetVolumeInformation
函数完成的。
但是,在asp.net版本中,使用本地服务或本地网络标识的标准应用程序池没有PInvoke权限,因此无法检查许可证文件是否有效。如何在应用程序启动时检查许可证

我可以想到以下几种选择:

  • 使用不需要特殊权限即可获取卷序列号的方法替换PInvoke(WMI是否存在这种情况?)
  • 将所有许可证检查代码放在一个单独的程序集中,并将其安装到GAC以使其执行
  • 在安装过程中仅为我的应用程序创建具有管理员标识的应用程序池
第一种解决方案是最好的,但我不知道是否可行。

我还有其他的可能性吗?每种方法的优缺点是什么?哪一个是最好的?

我建议使用WMI。Win32_Volume类具有卷的序列号。您可以使用以下内容:

using System.Management;
SelectQuery query = new SelectQuery("Win32_Volume");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
foreach (ManagementObject obj in searcher.Get())
{
    Console.WriteLine("{0} {1}", obj["DriveLetter"], obj["SerialNumber"]);
}