Problem z usuwaniem kluczy z rejestru.

0

Witam, mam problem z usunięciem klucza znajdującego się w kluczu głównym HKEY_LOCAL_MACHINE. Używam funkcji WinAPI, przeczytałem parę tekstów na ten temat i szczerze mówiąc - mam problem, którego nie potrafię sobie wytłumaczyc. Dlaczego jeśli tworze sobie drzewo kluczy w HKEY_LOCAL_MACHINE i identyczne drzewo w HKEY_CURRENT_USER to w pierwszym przypadku nie działa mi to jak trzeba, a w drugim już tak. Do rzeczy - wrzucę krótki fragment kodu, który zobrazuje mój problem.

Drzewo kluczy które chce usuwać wygląda tak:
-klucz glowny (LOCAL_MACHINE/CURRENT_USER)
--SOFTWARE/Software
---TEST
----test
-----1.1
------1.1.1
-------1.1.1.1
-------1.1.1.2

chce usunąć klucz 1.1...

Robię to prostą rekurencją (nie chciałem używać funkcji SHDeleteKey) i mam pytanie:

Dlaczego to działa...

#define WIN_LEAN_AND_MEAN
#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpCmdLine, int nCmdShow)
{    
    HKEY hKey,hKey2,hKey3;
    LONG result1,result2,result3;
    
    result1=RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\TEST\\test\\1.1\\1.1.1", 0, KEY_ALL_ACCESS, &hKey);

    if(result1==ERROR_SUCCESS)
    {
                     RegDeleteKey(hKey,"1.1.1.1");
                     RegDeleteKey(hKey,"1.1.1.2");
                     RegCloseKey(hKey);    
                      
                     result2=RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\TEST\\test\\1.1", 0, KEY_ALL_ACCESS, &hKey2);
                     if(result2==ERROR_SUCCESS)
                     {
                              RegDeleteKey(hKey2,"1.1.1");
                              RegCloseKey(hKey2);
                                                     
                              result3=RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\TEST\\test", 0, KEY_ALL_ACCESS, &hKey3);                                                                  
                              if(result3==ERROR_SUCCESS)
                              {
                                           RegDeleteKey(hKey3,"1.1");
                                           RegCloseKey(hKey3);
                               }
                     }
    }
    
    return 0;
}

...a to nie działa...

#define WIN_LEAN_AND_MEAN
#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpCmdLine, int nCmdShow)
{    
    HKEY hKey,hKey2,hKey3;
    LONG result1,result2,result3;
    
    result1=RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\TEST\\test\\1.1\\1.1.1", 0, KEY_ALL_ACCESS, &hKey);

    if(result1==ERROR_SUCCESS)
    {
                            RegDeleteKey(hKey,"1.1.1.1");
                            RegDeleteKey(hKey,"1.1.1.2");
                            RegCloseKey(hKey);    
                      
                 result2=RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\TEST\\test\\1.1", 0, KEY_ALL_ACCESS, &hKey2);
                 if(result2==ERROR_SUCCESS)
                 {
                                 RegDeleteKey(hKey2,"1.1.1");
                                 RegCloseKey(hKey2);
                                                     
                                 result3=RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\TEST\\test", 0, KEY_ALL_ACCESS, &hKey3);                                                                  
                                 if(result3==ERROR_SUCCESS)
                                 {
                                              RegDeleteKey(hKey3,"1.1");
                                              RegCloseKey(hKey3);
                                 }
                  }
    }
    
    return 0;
}
0

Pewnie nie działa pod Win7 lub Vista?
Musisz sobie poustalać dodatkowe uprawnienia.
To są dodatkowe zabezpieczenia przed hackerami (dla hakerów - 2 min dodatkowej pracy, dla normalnego użytkownika - same kłopoty).

0

Tak, problem pojawia się na Win7, ale wersja z LOCAL_MACHINE robiłem właśnie z przeznaczeniem dla XP (może dlatego klucz który chce usuwać na XP jest w LOCAL_MACHINE a na WIN7 już w CURRENT_USER - żeby nie utrudniać sprawy hakierni :p). Czyli jeśli dobrze wnioskuje mimo iż program źle funkcjonuje na Win7 będzie działał na XP, tak?

0

Odświeżam temat bo mam podobny problem. Nie mogę dodać ani usunąć klucza w Win7, @_13t_Dragon o jakie dokładnie uprawnienia Ci chodziło? W funkcji do otwarcia klucza daje KEY_ALL_ACCESS lecz to nie wystarczy. Czy da się te uprawnienia jakoś nabyć z poziomu programu ?

0

Jak się usuwa z rejestru to ja wiem, niestety nie działa mi to na Win7, jest to spowodowane brakiem uprawnień, napisałem o to taką funkcję:


bool setAutorun(bool autorun)
{
    HKEY regKey = 0;
    LPCWSTR regKeyPath = L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";
    LPCWSTR regSubKey = L"Server";

    if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, regKeyPath, 0, KEY_ALL_ACCESS, &regKey) != ERROR_SUCCESS) return false;

    if(autorun)
    {
        WCHAR path[MAX_PATH + 1];
        if(!GetModuleFileName(NULL, path, MAX_PATH + 1)) return false;

        if(RegSetValueEx(regKey, regSubKey, 0, REG_SZ, (LPBYTE)path, (wcslen(path) + 1) * sizeof(WCHAR)) != ERROR_SUCCESS) return false;
    }
    else if(RegDeleteKey(regKey, regSubKey) != ERROR_SUCCESS) return false;

    RegCloseKey(regKey);
    return true;
}
1

Aby móc modyfikować te wpisy program musi być uruchomiony z uprawnieniami administratora (jedynie użytkownicy których konto jest typu administracyjnego będą mogli to zrobić). Aby uruchomić dowolny program z takimi uprawnieniami klikasz prawym przyciskiem na .exe i wybierasz "uruchom jako administrator" (to pewnie znasz).
Można do aplikacji dodać specjalny manifest mówiący o tym, że aplikacja potrzebuje uprawnień administratora do jej uruchomienia. Wtedy nie trzeba klikać prawym przyciskiem i wybierać "uruchom jako administrator", do tego celu wystarczy zwykły dwuklik. Temat z manifestem był często wałkowany, użyj wyszukiwarki.

Natomiast w przypadku autora wątku sytuacja prawdopodobnie jest trochę inna. Jeśli program potrzebuje tylko odczytywać te wpisy a ich dodanie/usunięcie może być zrobione podczas instalacji/deinstalacji programu to wypada napisać sobie osobny instalator który się tym zajmie. Wtedy do (de)instalacji programu będzie potrzebny administrator, natomiast do użytkowania programu już tylko zwykły użytkownik.

1 użytkowników online, w tym zalogowanych: 0, gości: 1