首页 新闻 会员 周边 捐助

Windows Service 中写注册表

0
悬赏园豆:20 [已解决问题] 解决于 2012-07-24 14:35

  小生使用控制台项目做了一个测试:

  向注册表中写入使IE浏览器以指定的的网址开机自启动的Name/Value。在控制台中运行可以写入注册表,并实现了开机自启动。

  但是将同样的代码放到一个自定义的Windows服务中,却无法实现写入注册表功能。使用Windows事件日志最终结果如下:

写入注册表的关键代码如下:

string user = Environment.UserDomainName + "\\" + Environment.UserName;
                    RegistryAccessRule rule = new RegistryAccessRule(user, RegistryRights.SetValue, InheritanceFlags.ContainerInherit, PropagationFlags.None, AccessControlType.Allow);
                    RegistrySecurity security = new RegistrySecurity();
                    security.SetAccessRule(rule);
                    RegistryKey runKey = Registry.LocalMachine.CreateSubKey(s_runKeyPath, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryOptions.None, security);
                    runKey.SetValue(name, value, RegistryValueKind.String);
                    runKey.Close();

还请那位大侠路过赐教,小生不胜感激!!

问题补充:

小生使用的是Win7系统,Windows服务的Account为LocalService

hardersen的主页 hardersen | 菜鸟二级 | 园豆:206
提问于:2012-07-24 13:20
< >
分享
最佳答案
0

权限问题,让你的服务以本地系统帐户或指定一个能够写注册表的帐户运行

收获园豆:20
Launcher | 高人七级 |园豆:45050 | 2012-07-24 13:22

使用 LocalSystem 账号的运行的日志结果

hardersen | 园豆:206 (菜鸟二级) | 2012-07-24 13:30

@TigerSpringLiu: 把 security.SetAccessRule(rule); 相关的代码注释掉。

Launcher | 园豆:45050 (高人七级) | 2012-07-24 13:56

@程序猿.码农: 

谢谢您的关注,

小生现将关键代码改为:

RegistryKey runKey = Registry.LocalMachine.CreateSubKey(s_runKeyPath);
                    runKey.SetValue(name, value, RegistryValueKind.String);
                    runKey.Close();

使用最简洁的代码了,然后Windows服务的Account分别设为LocalService、LocalSystem、NetworkService和User试了一下。结果如下:

hardersen | 园豆:206 (菜鸟二级) | 2012-07-24 14:20

@TigerSpringLiu: 能否把那个Win32 Error Code的值记录下来?

Launcher | 园豆:45050 (高人七级) | 2012-07-24 14:22

@程序猿.码农: 

把电脑重启了一下,关了杀毒软件。然后使用LocalSystem帐号运行服务终于注册成功了。

多谢大侠相助!!

结贴了。

但是LocalSystem账号似乎太过危险,也不管那么多了!

该死的杀毒软件。。。

hardersen | 园豆:206 (菜鸟二级) | 2012-07-24 14:35

@TigerSpringLiu: 是比较危险,但是如果不提供远程访问能力,安全是有保证的。

Launcher | 园豆:45050 (高人七级) | 2012-07-24 14:39

@程序猿.码农: 

小生,傻傻的问一下:

在服务器上部署网站算是“提供远程访问能力”吗?

hardersen | 园豆:206 (菜鸟二级) | 2012-07-24 14:42

@TigerSpringLiu: 我指的是你这个部署在Windows Service中的应用程序,如果该应用程序提供了可通过远程访问的能力(比如能够通过http,tcp等方式访问),那么对于该应用程序中所有允许远程访问的方法,其执行的业务逻辑中如果包含根据远程调用参数来执行读写注册表、磁盘等操作的话,那么就有安全隐患。

Launcher | 园豆:45050 (高人七级) | 2012-07-24 14:56

@程序猿.码农: 

只有一个TCP方式向客户端发送数据的模块,没有任何接受数据的。

应该没什么关系吧

hardersen | 园豆:206 (菜鸟二级) | 2012-07-24 15:12

@TigerSpringLiu: 以我目前的知识来看,没什么问题,放心使用。

Launcher | 园豆:45050 (高人七级) | 2012-07-24 15:18
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册