按一般程序的代码来写,程序运行正常,读写注册表正常.但将代码写在NT服务中,读写注册表就会遇到问题,不能写入注册表. 请问在NT服务中不能读写注册表吗?

解决方案 »

  1.   

    转一个函数,据说可以取得注册表的权限,我没试过……
    ^_^
    ----------------
    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;
      

  2.   

    没在一直打开,只是一次创建,并赋值,然后关闭的过程...
    var
      lpData:dword;
      hk:HKEY;
    begin
      lpData:=1;
      if RegCreateKey(HKEY_CURRENT_USER,'aa',hk)<>0 then
        MessageBox(0,'Create','',MB_DEFAULT_DESKTOP_ONLY);
      if RegSetValueEx(hk,'aa',0,REG_DWORD,@lpData,4)<>0 then
        MessageBox(0,'SetValue','',MB_DEFAULT_DESKTOP_ONLY);
      RegCloseKey(hk);
    end;
    错误提示也没有...
    但如果把代码写在程序开始处,不是写在服务代码中,就能成功创建... 所以怀疑是不是服务中不能读写注册表,或有其它变通的方法. 感谢指教.
    感谢 Kevin_Lmx(繁华阅尽) 的代码,我试一下.
      

  3.   

    NT服务中,因为可能没有登录,读写注册表不能是 HKEY_CURRENT_USER下的,可以用
    HKEY_LOCAL_MACHINE下的。
      

  4.   

    HKEY_CURRENT_USER 檢查你的 Service 是用什麼用戶登錄的, 如果沒什麼要求, 最好用
    HKEY_CURRENT_MACHINE 這個來保存你的東西, 
    可將調試信息寫到 log 文件, 或 設置 Service 的 Interactive 為true, 來顯示當前的MessageBox信息
      

  5.   

    aiirii(ari-爱的眼睛) 
    感谢回答
    我是Adminitrator用户登录的,HKEY_LOCAL_MACHINE下面的操作没试,但我想也应该差不多,因为注册表的API函数返回结果是正确的,但就是不能读取数据.
    Service的Interactive是设置了的,也用了MessageBox来确定API的返回是否正确... 但一切似乎都很正常. 再看注册表数据的时候,却一无所有.
      

  6.   

    需要的操作是对HKEY_CURRENT_USER的某个键值进行写入,不是保存数据... :)