2013-03-31 3 views
1

내 질문 : 사용자 지정 보안 설명자를 사용하여 만든 레지스트리 키 값을 편집 할 수 있습니까? SECURITY_ATTRIBUTES 구조로 RegSetKeyValueEx에 전화해야합니까? 그렇지 않으면 키를 삭제 한 다음 다시 작성해야합니다.보호 된 레지스트리 키 값 편집/삭제

레지스트리 키 값을 편집 (또는 삭제 한 다음 다시 쓰려고 시도)했지만 작동하지 않습니다. 몇 가지 중요한 정보는 사용자 지정 보안 설명자를 사용하여 레지스트리 키를 만들었습니다. 사용자 지정 보안 설명 자의 KEY_READ는 Registry Key Security and Access Rights입니다.

그러나 ACL 보안 설명자 때문에 키를 삭제할 수 없습니다. 이 문제는 내가 제거 할 때 레지스트리 키를 삭제할 수도 없기 때문에 발생합니다. 사용자 지정 보안 설명자가있는 레지스트리 키를 만드는 이유는 실수로 또는 의도적으로 변경할 수 없기 때문입니다. 열쇠는 내 응용 프로그램이 전에 실행되었는지 알려줍니다.

이 유형의 레지스트리 키를 수정하거나 삭제할 수있는 사람은 누구입니까? (내 키를 편집하려고 내가 처음에 키를 생성하는 방법을 보여줍니다)

내 코드 : 사용자가 KEY_SET_VALUE 액세스 권한을 가질 수 있도록

// Code to change key value 
LONG lResult = RegOpenKeyEx(HKEY_CURRENT_USER, _T("Software/MyApplication"), 0, KEY_READ, &hKey); 
LONG setValueRes = RegSetValueEx(hKey, _T("FirstRunSignafier"), 0, REG_DWORD, (LPBYTE) &firstRunSignafierValue, 
           (DWORD) sizeof(firstRunSignafierValue)); 
// Error Value of setValueRes is 5. lResult succeeds 


// Code that creates the registry key 
int recordFirstApplicationRun() 
{ 
    tstring REG_FIRST_RUN_SIGNIFIER = _T("Software\\MyApplication"); 
    HKEY hKey; 
    LONG lResult; 
    int res      = 1; 
    DWORD dwValue, dwType, dwSize = sizeof(dwValue); 
    DWORD firstRunSignafierValue = 1; 
    DWORD keyAlreadyExists; // Two potential values: REG_CREATED_NEW_KEY or REG_OPENED_EXISTING_KEY 
    PSID pEveryoneSID    = NULL; 
    PACL pACL      = NULL; 
    PSECURITY_DESCRIPTOR pSD  = NULL; 
    SECURITY_ATTRIBUTES secAttr; 

    createSecurityAttributes(&secAttr, pEveryoneSID, pACL, pSD); 
    LONG createRes = RegCreateKeyEx(HKEY_CURRENT_USER, &REG_FIRST_RUN_SIGNIFIER[0], 0, NULL, REG_OPTION_NON_VOLATILE, 
            KEY_WRITE|KEY_WRITE, &secAttr, &hKey, &keyAlreadyExists); 
    if (createRes != ERROR_SUCCESS) { 
     //_tprintf(_T("Failed to create key: Last Error: %x, Return Val: %x\n"), GetLastError(), createRes); 
     CPP_Utilities::outputLastError("Failed to create key"); 
     res = -1; 
     goto Cleanup; 
    } 

    //CPP_Utilities::outputLastErrorEx((keyAlreadyExists == REG_CREATED_NEW_KEY) ? _T("Created new registry key"):_T("Registry key already exists")); 
    _tprintf((keyAlreadyExists == REG_CREATED_NEW_KEY) ? _T("Created new registry key\n"):_T("Registry key already exists\n")); 

    // To Write a DWORD to the registry 
    LONG setValueRes = RegSetValueEx(hKey, _T("FirstRunSignafier"), 0, REG_DWORD, (LPBYTE) &firstRunSignafierValue, 
            (DWORD) sizeof(firstRunSignafierValue)); 
    if (setValueRes != ERROR_SUCCESS) { 
     _tprintf(_T("B: %X\n"), setValueRes); 
     CPP_Utilities::outputLastError("Failed to set registry value"); 
     res = -2; 
     goto Cleanup; 
    } 

    Cleanup: 
     if (pEveryoneSID) 
      FreeSid(pEveryoneSID); 
     if (pACL) 
      LocalFree(pACL); 
     if (pSD) 
      LocalFree(pSD); 
     if (hKey) 
      RegCloseKey(hKey); 

    return res; 
} 

int createSecurityAttributes(SECURITY_ATTRIBUTES* secAttr, PSID pEveryoneSID, PACL pACL, PSECURITY_DESCRIPTOR pSD) 
{ 
    // Pre: Memory release for parameters MUST be handled by caller 

    EXPLICIT_ACCESS ea; 
    DWORD dwRes; 
    /*PSID*/ pEveryoneSID     = NULL; 
    /*PACL*/ pACL       = NULL; 
    /*PSECURITY_DESCRIPTOR*/ pSD   = NULL; 
    SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY; 

    // Create a well-known SID for the Everyone group. 
    if(!AllocateAndInitializeSid(&SIDAuthWorld, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &pEveryoneSID)) { 
     _tprintf(_T("AllocateAndInitializeSid Error %u\n"), GetLastError()); 
     CPP_Utilities::outputLastError("AllocateAndInitializeSid Error"); 
     return -1; 
    } 

    // Initialize an EXPLICIT_ACCESS structure for an ACE. The ACE will allow Everyone read access to the key. 
    ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS)); 
    ea.grfAccessPermissions = KEY_READ; 
    ea.grfAccessMode  = SET_ACCESS; 
    ea.grfInheritance  = NO_INHERITANCE; 
    ea.Trustee.TrusteeForm = TRUSTEE_IS_SID; 
    ea.Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP; 
    ea.Trustee.ptstrName = (LPTSTR) pEveryoneSID; 

    // Create a new ACL that contains the new ACEs. 
    dwRes = SetEntriesInAcl(1, &ea, NULL, &pACL); 
    if (ERROR_SUCCESS != dwRes) { 
     _tprintf(_T("SetEntriesInAcl Error %u\n"), GetLastError()); 
     CPP_Utilities::outputLastError("SetEntriesInAcl Error"); 
     return -2; 
    } 

    // Initialize a security descriptor. 
    pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH); 
    if (NULL == pSD) { 
     _tprintf(_T("LocalAlloc Error %u\n"), GetLastError()); 
     CPP_Utilities::outputLastError("LocalAlloc Error"); 
     return -3; 
    } 

    if (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION)) { 
     _tprintf(_T("InitializeSecurityDescriptor Error %u\n"), GetLastError()); 
     CPP_Utilities::outputLastError("InitializeSecurityDescriptor Error"); 
     return -4; 
    } 

    // Add the ACL to the security descriptor. 
    if (!SetSecurityDescriptorDacl(pSD, TRUE, pACL, FALSE)) { 
     _tprintf(_T("SetSecurityDescriptorDacl Error %u\n"), GetLastError()); 
     CPP_Utilities::outputLastError("SetSecurityDescriptorDacl Error"); 
     return -5; 
    } 

    // Initialize a security attributes structure. 
    secAttr->nLength    = sizeof (SECURITY_ATTRIBUTES); 
    secAttr->lpSecurityDescriptor = pSD; 
    secAttr->bInheritHandle   = FALSE; 

    return 1; 
} 

답변

0

당신은 권한을 변경해야합니다. 그렇게하는 가장 간단한 방법은 설치 제거 프로그램이 설치 프로그램이 추가 한 ACL을 제거하는 것입니다.

설치 프로그램이 수행 한 단계를 되돌리려면 설치 제거 프로그램 만 있으면됩니다. 설치 프로그램이 완료되었습니다.

  1. 키를 만듭니다.
  2. 키에 ACL을 추가하십시오.

    1. 키에서 ACL을 제거 :

    그래서 당신의 제거가 필요하다.

  3. 키를 삭제하십시오.
+0

답해 주셔서 감사합니다. 레지스트리 키에서 ACL을 제거하는 방법을 알고 있습니까? –

+0

RegSetKeySecurity를 ​​사용하면 추측합니다. –