如何使 c# windows 窗体应用程序仅在单台 PC 上运行?
Posted
技术标签:
【中文标题】如何使 c# windows 窗体应用程序仅在单台 PC 上运行?【英文标题】:How to make c# windows form application run only on a single PC? 【发布时间】:2019-10-29 06:45:38 【问题描述】:我想配置我的 C# Windows 窗体应用程序,以便在运行应用程序之前识别与当前机器的硬盘驱动器序列号匹配。如果硬盘序列号与配置的序列号匹配,则运行应用程序,否则不执行任何操作。
我想让它只在一台机器上运行,以防止应用程序的重新分发,因为这是一个仅为有一些特殊要求的客户开发的自定义应用程序。
以下代码获取当前机器的硬盘序列号、型号和接口类型。
ManagementObjectSearcher moSearcher = new ManagementObjectSearcher("select * from Win32_DiskDrive");
foreach (ManagementObject wmi_HDD in moSearcher.Get())
HardDrive hdd = new HardDrive();
hdd.Model = wmi_HDD["Model"].ToString();
hdd.SerialNo = wmi_HDD["SerialNumber"].ToString();
hdd.Type = wmi_HDD["InterfaceType"].ToString();
HDDArrayList.Add(wmi_HDD);
txtHDDModel.Text = hdd.Model;
txtHDDSerialNo.Text = hdd.SerialNo;
txtHDDType.Text = hdd.Type;
此代码当前在单击按钮时运行。我希望它在 main 方法之前运行,它可以获得当前机器硬盘驱动器序列号并将其与我的目标序列号(我想要允许的序列号)进行比较。
有没有更好的方法来解决这个问题以及比较过程?
【问题讨论】:
我认为你不能在 main 之前运行任何东西。只需让你的方法返回一个布尔值,从 main 中调用该方法,如果它为 false,则返回。 在设计器模式下双击表单,它会创建一个加载事件函数,只需将代码粘贴在其中。函数名称应该类似于Form1_Load
@TerryTyson 我同意这种方法。是否真的可以从 main 方法调用另一个方法并在那里进行一些比较操作?根据您的评论,这是可能的。但是我可以对此有所了解吗?
@AmineMessaoudi 我尝试调用我的form_load event
中的代码,在那里我将当前机器的硬盘序列号与一个字符串进行了比较,但它对我不起作用。
@pashagoroshko 与我的问题相比,您的评论和建议的问题都无关紧要。这两种情况完全不同。
【参考方案1】:
这应该适合你:
static class Program
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
if (ValidHD() != true)
return;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
private static bool ValidHD()
string hdSN = String.Empty;
ManagementObjectSearcher moSearcher = new ManagementObjectSearcher("select * from Win32_DiskDrive");
foreach (ManagementObject wmi_HDD in moSearcher.Get())
hdSN = wmi_HDD["SerialNumber"].ToString();
if (hdSN == "Your_SN_Here")
return true;
else
return false;
要通过用户名限制使用,您可以使用:
static class Program
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
if (ValidUser() != true)
return;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
private static bool ValidUser()
if (System.Environment.UserName == "Your_Username_Here")
return true;
else
return false;
希望这会有所帮助。
【讨论】:
该解决方案对我有用。但是,我无法以正确的方式获取当前机器的硬盘序列号。它不匹配 我不明白你在说什么。您是否尝试记录其他尝试使用该程序的机器? 不,我实际上阻止其他机器使用这个应用程序。所以,我想使用机器的序列号(我想允许这个应用程序)作为字符串并在代码中进行比较(就像你为我做的那样)。但不知何故,我使用的代码hdSN = wmi_HDD["SerialNumber"].ToString();
没有得到序列号。该方法的其余部分是完美的,我已经接受它作为我的答案。
@teccraft 我不知道为什么它不适合你,因为这个对象一直追溯到 .Net 1.1。如果有帮助的话,我已经更新了我的答案,包括使用用户名而不是 HD SN。
如果我有 SDD 应该有什么变化吗?我尝试运行将笔记本电脑的序列号添加到引号内的代码,但它引发了未处理的异常。有没有办法解决这个问题? @特里泰森以上是关于如何使 c# windows 窗体应用程序仅在单台 PC 上运行?的主要内容,如果未能解决你的问题,请参考以下文章