beeboobeeboo 2025-04-18 10:49 采纳率: 0%
浏览 10

用C#写了一个软件,怎样保证开机启动

我用C#写了一个软件,怎样保证开机启动,不被其他360等清理软件影响,怎样实现输入密码才可以卸载,防止一般操作人员误操作卸载。
目前主要适配的操作系统是win7 win10/11

尝试过计划任务,注册表等开机启动方法,都是有可能被清理软件清理掉,或者被一般操作人员误删掉。

怎样保证开机启动,不被其他360等清理软件影响,怎样实现输入密码才可以卸载,防止一般操作人员误操作卸载。如果可能,愿意付费解决

  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2025-04-18 10:49
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    开机启动和卸载保护

    你想实现的是在 Windows 操作系统中,使用 C# 开发的软件在开机启动,并且保护软件不被其他清理软件影响,同时也实现输入密码才能卸载软件。

    以下是一些建议:

    1. 开机启动:可以使用 Windows 的计划任务(Task Scheduler)来实现开机启动。C# 中可以使用 System.Diagnostics 命名空间中的 TaskScheduler 类来创建计划任务。
    using System.Diagnostics;
    
    // 创建计划任务
    TaskScheduler scheduler = new TaskScheduler();
    scheduler.CreateTask("MyTask", "C:\\Path\\To\\Your\\Executable.exe", "C:\\Path\\To\\Your\\Arguments");
    scheduler.SetTrigger(TriggerType.OnStartup);
    scheduler.SetPriority(Priority.Highest);
    scheduler.Save();
    
    1. 保护软件:可以使用注册表(Registry)来存储软件的配置信息,并且在软件卸载时检查输入密码是否正确。
    using Microsoft.Win32;
    
    // 读取注册表中的配置信息
    RegistryKey key = Registry.CurrentUser.OpenSubKey("Software\\YourCompany\\YourSoftware", true);
    string password = key.GetValue("Password").ToString();
    
    // 在卸载时检查输入密码是否正确
    if (password != inputPassword)
    {
        // 输入密码错误,不能卸载
        return;
    }
    
    1. 输入密码保护:可以使用 Windows 的 Cryptography API(CNG)来实现输入密码保护。
    using System.Security.Cryptography;
    
    // 生成加密密钥
    RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
    byte[] key = new byte[16];
    rng.GetBytes(key);
    
    // 加密输入密码
    string inputPassword = "your_password";
    byte[] encryptedPassword = Encrypt(inputPassword, key);
    
    // 在卸载时检查输入密码是否正确
    if (!Verify(inputPassword, encryptedPassword, key))
    {
        // 输入密码错误,不能卸载
        return;
    }
    
    // 加密和验证函数
    byte[] Encrypt(string password, byte[] key)
    {
        using (Aes aes = Aes.Create())
        {
            aes.Key = key;
            aes.IV = new byte[16];
            using (MemoryStream ms = new MemoryStream())
            {
                using (CryptoStream cs = new CryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    byte[] passwordBytes = Encoding.UTF8.GetBytes(password);
                    cs.Write(passwordBytes, 0, passwordBytes.Length);
                }
                return ms.ToArray();
            }
        }
    }
    
    bool Verify(string password, byte[] encryptedPassword, byte[] key)
    {
        using (Aes aes = Aes.Create())
        {
            aes.Key = key;
            aes.IV = new byte[16];
            using (MemoryStream ms = new MemoryStream(encryptedPassword))
            {
                using (CryptoStream cs = new CryptoStream(ms, aes.CreateDecryptor(), CryptoStreamMode.Read))
                {
                    byte[] passwordBytes = new byte[encryptedPassword.Length];
                    cs.Read(passwordBytes, 0, passwordBytes.Length);
                    return Encoding.UTF8.GetString(passwordBytes) == password;
                }
            }
        }
    }
    

    这些只是基本的实现思路和代码示例,你需要根据自己的需求和实际情况进行修改和完善。

    评论

报告相同问题?

问题事件

  • 创建了问题 4月18日