小功能隐藏着大学问---windows的ACL带来的挑战

     
为何说这个功能小呢?
1.此功能只是在用户装了某一软件时才用得着,用户装这个软件的可能性很小;
2.此功能只须要修改一处注册表键值;

   因而这样简单实现了:
   在一个windows服务程序中调用一个修改注册表键值的方法进行修改,单元测试,这个方法很成功。可是在以服务运行的方式进行的测试中,打开此处注册表的方法一直报“找不到注册表路径”的错误。诸位看官,此处注册表的根键为HKEY_CURRENT_USER,你们明白为何了吗?
 
   “ 是的,与windows的ACL有关,windows服务是以系统权限运行的,在系统权限中,没有HKEY_CURRENT_USER这个键。”

解决方案:
1.操做HKEY_USERS
    HKEY_USERS这个根键但是包含了全部用户的一些信息的,和相应的HKEY_CURRENT_USER恰好一一对应,并且咱们要操做的Software键就在其中,因而就利用他来对每个用户的Software键下的某个键值进行操做。可是咱们这个功能得考虑一点,用户一旦装上这个软件后就会在Software键下建立某一键,而咱们必需要在短期内改写此处键的某个值,可是咱们根本不知道用户何时装啊!

2.注册表监控
     RegNotifyChangeKeyValue这个方法恰好能知足咱们,利用windows的消息机制咱们能够作到实时监控各个USER下的注册表改变状况,而后利用回调函数来实现修改相应的键值。可是当尝试监控Software键变化时,发现Software键一直有变化的消息,频繁到感受只有1秒。想一想咱们总不至于这么频繁的操做注册表吧。

3.设置定时器
  可是咱们能够这样作,采用轮询的方式遍历HKEY_USERS下每个用户,而后尝试打开咱们要操做的键值,若是不能打开说明此用户未安装此软件,反之用户必定安装了此软件,咱们就能够改写此键值来实现咱们的功能。定时器的值咱们能够本身设定,至少不用那么频繁的去操做注册表了。

(思考:关于权限这一块windows提供了方法能够模仿当前用户权限)
相关文章
相关标签/搜索