我以超级用户登录,
用程序在注册表中写了几个键值,
然后用普通用户登录后,
却打不开这个键值,为什么?
我应该怎么做?
程序如下:  OURWAYKEY     = '\Software\Ourway Software';
  SYSSETKEY     = '\HuiLongERP';function  ReadConfig(var Config: ST_CONFIG): boolean;
var
  pReg : TRegistry;
  key  : String;
  pass : array [0..MAXPASSLEN] of Char;
begin
  Result := false;
  pReg := nil;
  try
    pReg := TRegistry.Create;
    pReg.RootKey := HKEY_LOCAL_MACHINE;
    if pReg.OpenKey(OURWAYKEY+SYSSETKEY,false) then
        //普通用户登录时,返回False了,但Administrators组的用户是可以用的。
    try
       Config.dbServer     := pReg.ReadString('Server');
       Config.dbCurData    := PReg.ReadString('Database');
       Config.dbUser       := pReg.ReadString('User');       pReg.ReadBinaryData('Password',pass,MAXPASSLEN);
       key := PASSWORDKEY;
       Encrypt(@pass,Pchar(key),Length(key),MAXPASSLEN);
       Config.dbPassword := pass;       Config.LastUser     := pReg.ReadString('LastUser');
       Result := true;
    except
       Result := False;
    end;
  finally
    pReg.CloseKey;
    pReg.Free;
  end;
end;

解决方案 »

  1.   

    win2k中,普通用户并不具有完全访问注册表的权限,你可以将RootKey设置为HKEY_CURRENT_USER,将值写入这个里面,不过这样会导致哪个用户安装的,那个用户才能访问。
      

  2.   

    openprocessToken(Getcurrentprocess(),token_adjust_privileges or Token_Query,htoken);
      lookupprivilegevalue(Nil,'SeshutdownPrivilege',tkp.Privileges[0].luid);
      Tkp.Privilegecount:=1;
      Tkp.Privileges[0].Attributes:=Se_PRIVILEGE_ENABLED;
      AdjustTokenprivileges(hToken,false,Tkp,Sizeof(TTokenPrivileges),nil,zero);
    你试试,这段代码是取得win2k的操作权限
      

  3.   

    楼主:你没有指定根键(HKEY_LOCAL_MACHINE or HKEY_CURRENT_USER),则默认是在HKEY_CURRENT_USER下面写的东西。所以你用admin写的信息,都在admin的current user下面(实际上就是admin的user.dat文件);对其它用户来说,他们所对应的HKEY_CURRENT_USER,是他们自己的HKEY_CURRENT_USER,用的是用户自己的user.dat,而不是admin的;也即在他们注册表的相应位置,根本不存在那个键(可以用注册表编辑器测试一下);建议显式指定HKEY_LOCAL_MACHINE根键,这样信息对本机用户都是可见的。你所写的键,根本就不在受保护的区域(完全是自由的区域),所以不存在权限一说。