小生使用控制台项目做了一个测试:
向注册表中写入使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
权限问题,让你的服务以本地系统帐户或指定一个能够写注册表的帐户运行
使用 LocalSystem 账号的运行的日志结果
@TigerSpringLiu: 把 security.SetAccessRule(rule); 相关的代码注释掉。
@程序猿.码农:
谢谢您的关注,
小生现将关键代码改为:
RegistryKey runKey = Registry.LocalMachine.CreateSubKey(s_runKeyPath);
runKey.SetValue(name, value, RegistryValueKind.String);
runKey.Close();
使用最简洁的代码了,然后Windows服务的Account分别设为LocalService、LocalSystem、NetworkService和User试了一下。结果如下:
@TigerSpringLiu: 能否把那个Win32 Error Code的值记录下来?
@程序猿.码农:
把电脑重启了一下,关了杀毒软件。然后使用LocalSystem帐号运行服务终于注册成功了。
多谢大侠相助!!
结贴了。
但是LocalSystem账号似乎太过危险,也不管那么多了!
该死的杀毒软件。。。
@TigerSpringLiu: 是比较危险,但是如果不提供远程访问能力,安全是有保证的。
@程序猿.码农:
小生,傻傻的问一下:
在服务器上部署网站算是“提供远程访问能力”吗?
@TigerSpringLiu: 我指的是你这个部署在Windows Service中的应用程序,如果该应用程序提供了可通过远程访问的能力(比如能够通过http,tcp等方式访问),那么对于该应用程序中所有允许远程访问的方法,其执行的业务逻辑中如果包含根据远程调用参数来执行读写注册表、磁盘等操作的话,那么就有安全隐患。
@程序猿.码农:
只有一个TCP方式向客户端发送数据的模块,没有任何接受数据的。
应该没什么关系吧
@TigerSpringLiu: 以我目前的知识来看,没什么问题,放心使用。