Windows服务更改/删除注册表值

时间:2018-02-21 09:18:28

标签: c# windows service registry

我有控制台应用程序,它正在删除注册表值。但是当我试图在服务中做同样的事情时,它却无法正常工作。

log to txt文件工作正常,所以我每5秒看一次日志。但是DeleteValue方法的例外说:

  

价值不存在

控制台应用程序(工作):

class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                KillProxy();
                Console.ReadLine();
            }
        }

        private static void KillProxy()
        {
            string keyName = @"Software\Microsoft\Windows\CurrentVersion\Internet Settings";
            using (RegistryKey key = Registry.CurrentUser.OpenSubKey(keyName, true))
            {
                try
                {
                    key.DeleteValue("AutoConfigURL");
                    key.Close();
                }
                catch { }
            }
        }
    }

服务申请(不工作):

public partial class Service1 : ServiceBase
    {
        private Timer t1;

        /// <summary>
        /// Init
        /// </summary>
        public Service1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Service start event
        /// </summary>
        /// <param name="args"></param>
        protected override void OnStart(string[] args)
        {
            t1 = new Timer();
            t1.Interval = 5000;
            t1.Elapsed += new ElapsedEventHandler(t1_tick);
            t1.Enabled = true;
        }

        /// <summary>
        /// Service stop event
        /// </summary>
        protected override void OnStop()
        {
            t1.Enabled = false;
        }

        /// <summary>
        /// Timer tick event
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void t1_tick(object sender, ElapsedEventArgs e)
        {
            KillProxy();
        }

        /// <summary>
        /// If key AutoConfigURL exists, delete it
        /// </summary>
        private void KillProxy()
        {
            string keyName = @"Software\Microsoft\Windows\CurrentVersion\Internet Settings";
            using (RegistryKey key = Registry.CurrentUser.OpenSubKey(keyName, true))
            {
                try
                {
                    WriteLog("start deleting ");
                    key.DeleteValue("AutoConfigURL");
                    key.Close();
                }
                catch (Exception ex)
                {
                    WriteLog(ex.Message.ToString());
                }
            }
        }


        private void WriteLog(string msg)
        {
            StreamWriter sw = null;

            try
            {
                sw = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "\\logfile.txt", true);
                sw.WriteLine(DateTime.Now.ToString() + " " + msg);
                sw.Flush();
                sw.Close();
            }
            catch
            {
                //nothing
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

原因是您正在访问CurrentUser注册表子树,正如其名称所示,该子树是特定于用户的,

当您在控制台模式下运行代码时,您可以与您的用户一起运行代码,并且检索到的CurrentUser注册表部分的内容是您的一个,使用您知道的密钥和子密钥,

当您将代码作为服务运行时,用于运行的默认帐户是本​​地服务或系统,在该上下文中,CurrentUser注册表子树绝对不是您在控制台模式下加载的子树。

您应该将服务设置为使用您自己的凭据运行(您必须输入用户名和密码)或保持应用程序在控制台模式下运行,或者重新访问您的应用程序逻辑,具体取决于您需要做什么。