Как заставить приложение Windows Forms с # работать только на одном ПК?

Я хочу настроить свое приложение Windows Form на C # так, чтобы перед запуском приложения оно определяло совпадение серийного номера жесткого диска текущего компьютера. Если серийный номер жесткого диска совпадает с настроенным серийным номером, приложение запускает приложение, в противном случае ничего не делает.

Я хочу запустить его только на одном компьютере, чтобы предотвратить распространение приложения, потому что это настраиваемое приложение, разработанное только для клиента с некоторыми особыми требованиями.

Следующий код получает серийный номер жесткого диска текущего компьютера, модель и тип интерфейса.

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;
            }

Этот код в настоящее время запускается по нажатию кнопки. Я хочу, чтобы он запускался до того, как основной метод может получить текущий серийный номер жесткого диска машины и сравнить его с моим целевым серийным номером (тем, который я хочу разрешить).

Есть ли лучший подход для этого, а также для процесса сравнения?


person teccraft    schedule 14.06.2019    source источник
comment
Я не думаю, что вы можете запустить что-нибудь перед main. Просто сделайте так, чтобы ваш метод возвращал bool, вызовите метод из main и, если он ложный, вернитесь.   -  person Terry Tyson    schedule 14.06.2019
comment
Дважды щелкните форму в режиме дизайнера, она создаст функцию события загрузки, просто вставьте в нее код. Имя функции должно быть примерно Form1_Load.   -  person Amine Messaoudi    schedule 14.06.2019
comment
@TerryTyson Я согласен с таким подходом. Действительно ли возможно вызвать другой метод из основного метода, а также выполнить там некоторую операцию сравнения? Согласно вашему комментарию, это возможно. Но можно мне кое-что узнать об этом?   -  person teccraft    schedule 14.06.2019
comment
@AmineMessaoudi Я попытался вызвать код в моем form_load event, где я сравнил серийный номер жесткого диска текущей машины со строкой, и у меня это не сработало.   -  person teccraft    schedule 14.06.2019
comment
повторяющийся вопрос stackoverflow.com/questions/19147/   -  person pasha goroshko    schedule 14.06.2019
comment
@pashagoroshko Этот вопрос касается единственного процесса на любом компьютере, а не ограничения приложения на одном компьютере.   -  person itsme86    schedule 14.06.2019
comment
@pashagoroshko Ваш комментарий и предложенный вопрос не имеют отношения к моему вопросу. Оба эти случая совершенно разные.   -  person teccraft    schedule 14.06.2019
comment
@teccraft вам нужно что-то вроде лицензионного ключа   -  person pasha goroshko    schedule 14.06.2019
comment
Могу я спросить, в чем причина запускать до основного? это все еще может быть первым делом, которое вы делаете прежде всего   -  person nalnpir    schedule 14.06.2019
comment
@teccraft, вы можете сделать это, проверив MAC-адрес компьютера. Сохранение его в файле, где эта информация скрывается и проверяется, является ли MAC-адрес первым запущенным приложением.   -  person Mikev    schedule 14.06.2019
comment
предположим, вы используете обфускатор, иначе декомпиляция была бы простой ... И, вероятно, лучше использовать физический ключ RSA вместо того, чтобы предоставить пользователю доступ с каждого ПК и безопасный, хотя даже это не дает гарантии от взлома   -  person Vladimir    schedule 15.06.2019


Ответы (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;
        }
    }
}

Надеюсь это поможет.

person Terry Tyson    schedule 14.06.2019
comment
У меня решение работает. Однако я почему-то не могу правильно получить серийный номер жесткого диска текущего компьютера. Это как-то не совпадает - person teccraft; 14.06.2019
comment
Я не понимаю, что ты говоришь. Вы пытаетесь регистрировать другие машины, которые пытаются использовать программу? - person Terry Tyson; 14.06.2019
comment
Нет, я действительно запрещаю другим машинам использовать это приложение. Итак, я хочу использовать серийный номер машины (для которого я хочу разрешить это приложение) в качестве строки и сравнить его в коде (как вы это сделали для меня). Но код, который я использовал hdSN = wmi_HDD["SerialNumber"].ToString();, почему-то не получает серийный номер. В остальном подход идеален, и я принял это как ответ за себя. - person teccraft; 14.06.2019
comment
@teccraft Я не уверен, почему это не работает для вас, поскольку этот объект полностью восходит к .Net 1.1. Я обновил свой ответ, включив в него использование имени пользователя вместо HD SN, если это кому-то поможет. - person Terry Tyson; 14.06.2019
comment
Должны ли быть какие-то изменения, если у меня SDD? Я попытался запустить код, добавив серийный ключ моего ноутбука в кавычки, но возникло необработанное исключение. Есть ли способ решить эту проблему? @TerryTyson - person Virtuall.Kingg; 17.12.2020
comment
@ Virtuall.Kingg Я без проблем использую SDD в течение многих лет. Возможно, вам стоит задать новый вопрос, показать свой код и точное сообщение об ошибке. Несомненно, кто-то сможет помочь. - person Terry Tyson; 21.12.2020