如何使 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 上运行?的主要内容,如果未能解决你的问题,请参考以下文章

如何在单台机器上管理/组合多台服务器?

在 C# 中为 Windows 窗体创建向导

C#如何在 Windows 窗体应用程序中使用事件

在 C# Windows 窗体中对字典进行排序[重复]

c# windows 窗体 如何 设置菜单的权限

如何制作一个 C# Windows 窗体应用程序,为 Windows 应用商店转换,从 Windows 开始