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

C# Windows服务更改/删除注册表值,c#,windows,service,registry,C#,Windows,Service,Registry,我有一个控制台应用程序,它正在删除注册表值。但当我试图在服务中做同样的事情时,它不起作用 日志到txt文件工作正常,所以我每5秒查看一次日志。但DeleteValue方法的例外情况是: 价值不存在 控制台应用程序(工作): 服务应用程序(不工作): 公共部分类Service1:ServiceBase { 专用定时器t1; /// ///初始化 /// 公共服务1() { 初始化组件(); } /// ///服务启动事件 /// /// 启动时受保护的覆盖无效(字符串[]args) {

我有一个控制台应用程序,它正在删除注册表值。但当我试图在服务中做同样的事情时,它不起作用

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

价值不存在

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

服务应用程序(不工作):

公共部分类Service1:ServiceBase
{
专用定时器t1;
/// 
///初始化
/// 
公共服务1()
{
初始化组件();
}
/// 
///服务启动事件
/// 
/// 
启动时受保护的覆盖无效(字符串[]args)
{
t1=新定时器();
t1.间隔=5000;
t1.已用时间+=新的ElapsedEventHandler(t1_勾号);
t1.启用=真;
}
/// 
///服务停止事件
/// 
受保护的覆盖void OnStop()
{
t1.启用=错误;
}
/// 
///计时器滴答声事件
/// 
/// 
/// 
私有void t1_勾选(对象发送方,ElapsedEventArgs e)
{
KillProxy();
}
/// 
///如果存在密钥自动配置,请将其删除
/// 
私有代理
{
字符串keyName=@“软件\Microsoft\Windows\CurrentVersion\Internet设置”;
使用(RegistryKey=Registry.CurrentUser.OpenSubKey(keyName,true))
{
尝试
{
写日志(“开始删除”);
key.DeleteValue(“自动配置”);
key.Close();
}
捕获(例外情况除外)
{
WriteLog(例如Message.ToString());
}
}
}
私有void WriteLog(字符串消息)
{
StreamWriter sw=null;
尝试
{
sw=新StreamWriter(AppDomain.CurrentDomain.BaseDirectory+“\\logfile.txt”,true);
sw.WriteLine(DateTime.Now.ToString()+“”+msg);
sw.Flush();
sw.Close();
}
抓住
{
//没什么
}
}
}

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

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

当您以服务方式运行代码时,用于运行的默认帐户是本地服务或系统,在该上下文中,CurrentUser注册表子树肯定不是您在控制台模式下加载的子树


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

或者在服务中模拟用户,这似乎是一个错误smell@MichaelRandall,在WinAPI代码中,我们必须确保加载模拟用户的配置文件,并调用
RegOpenCurrentUser
获取句柄。无法使用
HKEY\U CURRENT\U USER
伪句柄,因为“\Registry\USER\[SID String]”用户配置文件项的实际句柄在首次使用时被缓存。
Registry.CurrentUser
在.NET中使用什么?我假设它是基于相同id的
HKEY\U CURRENT\U USER
@eryksunsay@MichaelRandall,因此我假设在.NET中模拟和获取配置文件密钥的句柄实际上相当麻烦,因为您必须调用本机
RegOpenCurrentUser
函数并包装句柄,对吗?hrm我不确定,这应该行得通。虽然我对结果很感兴趣
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
            }
        }
    }