注册表的操作1314错误原因权限问题

注册表的操作

1.注册表的作用

注册表是windows系统的数据库,保存了系统、用户、程序的信息,通过修改注册表可以对系统进行设置,可以获取程序信息、用户信息等,可以修改环境变量,可以设置程序开机自启动,修改主页,取消运行、重启、关机、注销按钮等。只要你知道注册表中对应键和键值的功能了解,就可以通过修改键值来重新对系统进行设置或修改。修改注册表是直接对系统的核心数据库进行修改,具有很强大的功能,不能乱用,如果注册表受到了破坏,轻则使windows的启动过程出现异常,重则可能会导致整个windows系统的完全瘫痪。因此正确地认识、使用,特别是及时备份以及有问题恢复注册表对windows用户来说就显得非常重要。

2.注册表的结构

注册表的组织方式跟文件目录比较相似,主要分为根键、子键和键值项三部分,与文件目录对应的话就是根目录、子目录和文件。

2.1根键

注册表由五个根键构成,每个根键保存的信息如下所示。

(1)HKEY_CLASSES_ROOT

保存着所有的文件和打开程序对应关系。

(2)HKEY_CURRENT_CONFIG

保存着对硬件的配置,包括了系统中现有的所有配置文件的细节。

(3)HKEY_USERS

保存用户和目前登陆用户的信息。

(4)HKEY_LOCAL_MACHINE

包括网络和硬件上所有的软件设置。

(5)HKEY_CURRENT_USER

任何在HKEY_CURRENT_USER里的改动也都会立即HKEY_USERS改动。所有当前的操作改变只是针对当前用户而改变,并不影响其他用户。

2.2子键

可以有多个子键和键值项,就像一个目录中可以有多个子目录和多个文件一样。
2.3键值项

可以理解为文件,它由三部分组成,分别为:名称、类型、数据。

键值类型又分为多种主要包括如下:
REG_BINARY 二进制数据
REG_DWORD 32位双字节数据
REG_SZ 以0结尾的字符串
REG_DWORD_BIG_ENDIAN 高位排在底位的双字
REG_EXPAND_SZ 扩展字符串,可以加入变量如%PATH%
REG_LINK UNICODE 符号链接
REG_RESOURCE_LIST 设备驱动程序资源列表
REG_MULTI_SZ 多字符串
注册表数据项的数据类型有8种,但最常用的主要是前3种。

知道注册表的键和键值的功能就可以通过修改注册表来设置系统参数,或者获取信息。

3.对注册表的操作

注册表键的操作包括打开、关闭、新建、删除、导入、导出、获取信息、枚举键和键值等,注册表对键值的操作有设置值、获取值、添加、删除。

下面对键和键值的操作做了封装,将注册表的操作统一成一种风格,主要包括根键hRootKey、子键路径strKeyPath包括子键名称,如果strKeyPath为空,则hRootKey表示打开的子键,函数是对子键或子健的键值进行操作。可以很方便的实现键和键值的增删改查。

4.遇到的问题

在调用函数RegSaveKeyEx 和RegRestoreKey返回1314错误码,系统函数

//先设置权限

      int lResult=-1;

      HANDLE   hToken        = NULL;  

      if( !OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) )   //打开进程操作令牌

      {      

           return -1;

      }   

      size_t sizelen = sizeof(TOKEN_PRIVILEGES) + 2*sizeof(LUID_AND_ATTRIBUTES);

      TOKEN_PRIVILEGES*   tkp=(TOKEN_PRIVILEGES*)malloc(sizelen);

      memset(tkp,0,sizelen);

     

      if(!LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&(tkp->Privileges[0].Luid))||

           !LookupPrivilegeValue(NULL,SE_BACKUP_NAME,&(tkp->Privileges[1].Luid))||

           !LookupPrivilegeValue(NULL,SE_RESTORE_NAME,&(tkp->Privileges[2].Luid)))   //获取权值参数

      {  

           CloseHandle(hToken);

           free(tkp);

           return -1;

      }  

      tkp->Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;   

      tkp->Privileges[1].Attributes = SE_PRIVILEGE_ENABLED; 

      tkp->Privileges[2].Attributes = SE_PRIVILEGE_ENABLED; 

      tkp->PrivilegeCount=3;

      if(!AdjustTokenPrivileges(hToken, FALSE, tkp, sizelen, NULL, NULL))   //设置令牌权值参数

      { 

           CloseHandle(hToken);

           free(tkp);

           return -1;

      }

自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取:

https://www.cnblogs.com/bclshuai/p/11380657.html

原文地址:https://www.cnblogs.com/bclshuai/p/12208611.html