2012-07-28 7 views
4

아래 코드를 사용하여 레지스트리의 HKEY_LOCAL_MACHINE 섹션에 값을 설정하려고 시도했지만 '.....에 대한 데이터를 설정하지 못했습니다.'라는 메시지가 나타납니다. HKEY_CURRENT_USER를 사용하면 문제 없습니다.레지스트리에 값을 저장하려고 할 때 오류가 발생했습니다.

여기에 무엇이 누락 될 수 있습니다.

은 (코드는 완전하지 않다, 그러나 나는 그것의 중요한 부분이라고 생각)

type 
    TTypWinBits = (Bit32, Bit64); 

function WinBits: TTypWinBits; 
type 
    TIsWow64Process = function(Handle:THandle; var IsWow64 : BOOL) : BOOL; stdcall; 
var 
    hKernel32 : Integer; 
    IsWow64Process : TIsWow64Process; 
    IsWow64 : BOOL; 
begin 
    Result := Bit32; 
    hKernel32 := LoadLibrary('kernel32.dll'); 
    if (hKernel32 = 0) then RaiseLastOSError; 
    @IsWow64Process := GetProcAddress(hkernel32, 'IsWow64Process'); 
    if Assigned(IsWow64Process) then 
    begin 
     IsWow64 := False; 
     if (IsWow64Process(GetCurrentProcess, IsWow64)) then 
     Result := Bit64 
     else 
     RaiseLastOSError; 
    end; 
    FreeLibrary(hKernel32); 
end; 

function TFastRegistry.CreateConnection: TRegistry; 
begin 
    Result := TRegistry.Create; 
    try 
    case WinBits of 
     Bit32: Result := TRegistry.Create; 
     Bit64: Result := TRegistry.Create(KEY_WRITE OR KEY_WOW64_64KEY); 
    end; 
    except 
    on E: exception do 
     Result := nil; 
    end; 
end; 

procedure TFastRegistry.RunAdd(aDesc, aName: string); 
var 
    Reg: TRegistry; 
    sRegKey: String; 
begin 
    sRegKey := 'Software\Microsoft\Windows\CurrentVersion\Run'; 
    Reg := CreateConnection; 
    with Reg do 
    begin 
     try 
     RootKey := HKEY_LOCAL_MACHINE; 
     if not KeyExists(sRegKey) then 
      OpenKey(sRegKey, True) 
     else 
      OpenKey(sRegKey, False); 
     WriteString(aDesc, aName); 
     finally 
     CloseKey; 
     Free; 
     end; 
    end; 
end; 
+4

아마도 시스템 레지스트리 쓰기 권한 및/또는 앱 권한 권한 상승이 없습니다. – Marcodor

+0

이 질문을 확인하십시오 - [비 관리자 모드에서 레지스트리 액세스] (http://stackoverflow.com/questions/1681434/registry-access-in-non-admin-mode) – PresleyDias

+0

의 'Autostart'폴더에 바로 가기 만들기를 고려하십시오. 사용자가 메뉴를 시작합니다. HKLM에 기록하는 동안 관리자 권한이 필요하지 않습니다. 또한, 그에게 더 많은 통제력을줍니다. – Chris

답변

6

프로그램이 로컬 시스템 키에 쓸 높은 권한이 필요합니다. 그것 없이는 함수가 실패 할 것입니다. 프로그램이 관리 도구로되어 있다면 매니페스트 파일을 사용하여 OS가 허가를 요청합니다. 필요하지 않으면 현재 사용자 키에 쓰고 대신 시스템의 계정에 영향을 미치지 않습니다.

+0

따라서 시나리오에 적절한 액세스 플래그를 사용하여'Reg : = TRegistry.Create (KEY_READ 또는 KEY_WRITE);와 같은 레지스트리를 생성해야합니다. –

+0

그건 일반적으로 좋은 충고, @ 제리,하지만 내가 쓴 것을 따르지 않습니다. 프로세스에 이미 상승 된 권한이있는 경우에만 기계 키에 대한 쓰기 액세스를 요청하면 쓰기 액세스 권한이 부여됩니다. –

0

"Free"로 핸들을 해제하고 레지스터의 다음 항목을 다시 작성하면됩니다. OpenKey 및 CloseKey를 통해 영구적으로 설정하고 열어서 닫지 마십시오! 버그처럼 보입니다 :-)

관련 문제