以下为原贴:http://expert.csdn.net/Expert/topic/1663/1663413.xml?temp=.2477381
主  题:  为何注册表里有些键能读出来,有些键读不出来??? 
作  者:  firmamenthy (执子之手)  
等  级:    
信 誉 值:  100 
所属论坛:  Delphi 基础类 
问题点数:  50 
回复次数:  5 
发表时间:  2003-04-15 14:14:31 
   
 
   
以下程序运行正确:
procedure TForm1.Button1Click(Sender: TObject);
var
reg: TRegistry;
st: Tstrings;
i: Integer;
begin
        memo1.Lines.Clear;
        reg := TRegistry.Create;
        try
                reg.RootKey := HKEY_LOCAL_MACHINE;
                if NOT reg.OpenKey('SYSTEM\CurrentControlSet\Control', False) then    \\  注意这里!
                showmessage('打开键失败');
                st := TstringList.Create;
                try
                        reg.GetValueNames(st);
                        for i := 0 to st.Count - 1 do
                                Memo1.Lines.Add(reg.Readstring(st.strings[i]));
                finally
                        st.Free;
                end;
                reg.CloseKey;
        finally
                reg.Free;
        end;
end;当我把这行的键换一下就不行了:
if NOT reg.OpenKey('SYSTEM\CurrentControlSet\Control', False) then
换成:if NOT reg.OpenKey('SYSTEM\CurrentControlSet\Enum\USB\Vid_0000&Pid_0000\4&1bb95972&0&1', False) then  \\ 出错,不能打开键  
 
 
 回复人: jenemery(小熊) ( ) 信誉:100  2003-04-15 15:08:00  得分:0 
 
 
  不懂,帮你up
  
 
Top 
 
 回复人: tongki_8(矛盾与迟钝) ( ) 信誉:100  2003-04-15 15:42:00  得分:0 
 
 
  if NOT reg.OpenKey('SYSTEM\CurrentControlSet\Enum\USB\Vid_0000&Pid_0000\4&1bb95972&0&1', False) then  
                 ~~~~~~~~~~~~~~把False改成True试试。 可
  
 
Top 
 
 回复人: zhourongbiao(Edward) ( ) 信誉:100  2003-04-15 16:08:00  得分:0 
 
 
  可能是&在字符串中不代表字符而是代表其他特殊含意,你可以查查Delphi的帮助。
  
 
Top 
 
 回复人: firmamenthy(执子之手) ( ) 信誉:100  2003-04-15 16:56:00  得分:0 
 
 
  TO  tongki_8(矛盾与迟钝) :改成TRUE就不是我要的效果了,我只希望它进行读动作,而不希望它做建立的动作。
TO  zhourongbiao(Edward) :或许你说的是一个问题,我也曾考虑过;但我试图打开'SYSTEM\CurrentControlSet\Enum\'这个节点都会出错;所以
PS:我要读取的键值就在这个目录下SYSTEM\CurrentControlSet\Enum\USB\Vid_0000&Pid_0000,我怎么才能正确读取这些带&符号的键值信息呢?
  
 
Top 
 
 回复人: firmamenthy(执子之手) ( ) 信誉:100  2003-04-16 09:22:00  得分:0 
 
 
  &符号并不是特殊符号,我试着在\HARDWARE\DEVICEMAP\KeyboardClass键下建立了子键4&1bb95972&0&2;并在这个路径下\HARDWARE\DEVICEMAP\KeyboardClass\4&1bb95972&0&2建立了一个项,名为hy&lc,值为hello&boy;能正常读取。
PS:我调试的系统是WIN2K下,WIN98下暂时没有发现不能读取的现象。请各位高手出手相助~!
  
 //===============================================================PS:我发现不能打开的键;用regedit.exe也不能在之下建立新键,或建立新项。

解决方案 »

  1.   


    LPCTSTR data_set = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\";
    long ret_0 = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,data_set,0,KEY_ALL_ACCESS, &hkey)long ret_1 = ::RegSetValueEx( hkey, "BadQQ", 0, type, path_set, cbdata);
    ::RegCloseKey( hkey );呵呵,上面这几个函数应该对你有帮助。
      

  2.   

    我在WIN2K下,用regedit.exe不能在'SYSTEM\CurrentControlSet\Enum\'新添子键;也不能添加项;提示是不能打开当前路径;为什么会这样?我想要解决我的问题看来是要先弄清楚WIN2K注册表的特性,为什么有些节点不能进行写操作?大家帮忙呀~~~为这个问题我已经耽搁了三天的时间了
      

  3.   

    你登陆2K时用的是Administrator用户吗?用户的权限如果不够的话,对注册表的一些内容不能操作。另外你可以在另外的分支中建一个与当前主键一样的主键,就能看出是否与主键的名称有关系。
      

  4.   

    TO  jnxulei(石头) :你说的问题我也注意到了,但我总不能写出来的软件要求每个最终客户登陆都要用有Administrator权限的用户名登陆,然后才能正常运用我的程序,这样就太不地道了。不知道仁兄有何高见能解决这个问题呢?就是说能在普通用户登陆2K、XP情况下能让他读到相关的键值?目前我所想到的途径有两个,大家看看能不能实现:一、用参数调用regedit.exe,直接指定regedit打开时的当前路径就是我所要的路径,并利用regedit读出当前键值返回给我;
        这种方法的的可行性值得怀疑,不知道regedit能否这样参数调用以达到我要求的目的。二、用参数调用regedit.exe,使之导出注册表所有键的信息到一个文本中,然后我在从这个文件中找我需要的信息;
        这种方法应该是可行的,但弊端就是需要一个临时文件,而且我全文检索内容是需要占用较大的资源,这样就影响了我的程序的效率。
    目前我存在的问题是:1.我不熟悉注册表的所有参数及其使用效果;2.我不清楚其调用的API函数;3.对于不同版本的WINDOWS版本是否调用参数不一样?
      

  5.   

    VC的水平不至于也这样吧?我自己先UP大家帮忙顶顶
      

  6.   

    我认为应该是权限的问题。//但我总不能写出来的软件要求每个最终客户登陆都要用有Administrator权限的用户名登陆,然后才能正常运用我的程序,这样就太不地道了。他不容许你改写的键,一般说来都是对系统的正常运行至关重要的键,当然需要 Administrator 才可以添加和修改。要不,如果你编写一个程序就可以随意修改系统的注册表,系统的安全性如何保障?如果你的程序并不需要做对系统安全有影响的操作,你完全可以避开对这些键的访问。//二、用参数调用regedit.exe,使之导出注册表所有键的信息到一个文本中,然后我在从这个文件中找我需要的信息;
    //    这种方法应该是可行的,但弊端就是需要一个临时文件,而且我全文检索内容是需要占用较大的资源,这样就影响了我的程序的效率。我认为也是不可行的。如果你的应用程序无法访问这些主键,那么你导出注册表时应该看不到这些主键。
      

  7.   

    我觉得还是直接用*.ini配置文件比较好,将相应的参数写到配置文件中。在Win98之前,对用户操作注册表几乎没什么限制,但从2000以后,如果使用普通的用户登陆(比如GUEST),HKEY_LOCAL_MACHINE中的主键不能Open。每个用户的HKEY_CURRENT_USER又各不相同,也没法用。实际上,将信息存放到配置文件中和存放到注册表中差不多。
      

  8.   

    你可以将某些主健的访问权限授给需要的用户,只能这样解决了,跟你的程序没有关系,而是权限的关系,如果你不嫌麻烦,可是在读取注册表时,模拟Administrator身份运行。
      

  9.   

    TO  hwman(药师) :我只是希望打开键,然后用读动作读取键值,不是写操作;我看了权限设置,我要的节点的对EVERY ONE是有读权限的,对Administrator有完全控制的权限。就是说我应该能用普通用户身份去读取才对。
       同时,我也做了个实验,我把读权限在EVERY ONE里禁止,这个时候,用REGEDIT也是看不到被禁的节点内容的。我是来找解决问题的途径的,希望你能帮助我。
       TO jnxulei(石头) :现在我遇到的问题是,我想读取别的公司写在注册表里面的信息,而这个信息正好又放在受保护的节点里,    所以我必须读出注册表信息。
    TO wily2002(如麻) :我做的是一个界面程序,所以不能要求用我程序的最终用户必须要是Administrator权限的用户,就是说,程序要求有通用性;
        我对你后面提出的想法很感兴趣,那么如何能模拟Administrator身份呢?热切盼望你的回音!
      

  10.   

    Project JEDI Code Library (JCL) 
    ftp://delphi-jedi.org/Code_Library/Release_1_11/JCL.zipProject JEDI ACLAPI, ACLUI头文件 
    (JwaAclUI.pas, JwaAclApi.pas) - ftp://delphi-jedi.org/api/Win32API.zipJCL 中有一个JclSecurity.pas unit,有一个函数叫做AllowRegKeyForEveryone就是干这个
    事情的,我调试通过function AllowRegKeyForEveryone(Key: HKEY; Path: string): Boolean;
    var
      WidePath: PWideChar;
      Len: Integer;
    begin
      case Key of
        HKEY_LOCAL_MACHINE:
          Path := 'MACHINE\' + Path;
        HKEY_CURRENT_USER:
          Path := 'CURRENT_USER\' + Path;
        HKEY_CLASSES_ROOT:
          Path := 'CLASSES_ROOT\' + Path;
        HKEY_USERS:
          Path := 'USERS\' + Path;
      end;
      Len := (Length(Path)+1)*SizeOf(WideChar);
      GetMem(WidePath,Len);
      MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, PChar(Path), -1, WidePath, Len);
      Result := SetNamedSecurityInfoW(WidePath, SE_REGISTRY_KEY,
        DACL_SECURITY_INFORMATION, nil, nil, nil, nil) = ERROR_SUCCESS;
      FreeMem(WidePath);
    end;SetNamedSecurityInfo函数设置特定securable object的security descriptor, 是Access Control API,
    在下载的Jed Object Pascal API Library里面声明了
    Sv-COM VCL Component
    http://www.aldyn.ru/SAM-Solution NTSet VCL Component
    http://www.sam-solutions.net/Registry Key Security and Access Rights
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/regapi_9zoz.aspSecurity Identifiers (SIDs)
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/security/Security/security_identifiers_sids_.aspAccess Tokens
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/security/Security/access_tokens.aspSecurity Descriptors
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/security/Security/security_descriptors.aspSecurable Objects
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/security/Security/securable_objects.asp