Witam, napisałem prosty programik który dodaje pewne klucze i wartości do rejestru. Podczas uruchamiania na Windows 7 na koncie innym niż wbudowane konto Administrator (nawet jeśli konto np. User dodam do grupy Administratorzy), pojawia się błąd związany z próbą dostępu do rejestru. Czy jest możliwość obejścia tego problemu w kodzie programu ?? Nie chodzi mi o obsługę wyjątku z jakimś komunikatem, tylko dodanie danych do rejestru.
Czyli co, prosisz o podanie jakiegoś exploita na podniesienie uprawnień?
Bez administratora się nie obejdzie.
Ok, czyli pozostaje poinformowanie Usera że ma skontaktować się z Administratorem :)
Zawsze użytkownik może uruchomić program jako administrator.
Z tym, że ten program będzie odpalał się automatycznie, czy można ustawićw opcjach kompilacji aby uruchamiał się jako Administrator automatycznie ?
Co jeśli wbudowane konto Administratora nie jest włączone, a domyślnie nie jest w Windows 7 ?
(Oczywiście rozumiem, że w takim przypadku będzie wymagał podania i tak hasła administratora.)
Nie da się zrobić takich opcji kompilatora, ponieważ twój problem nie jest programistyczny, a administracyjny.
Możesz za to utworzyć link do programu:
C:\WINDOWS\system32\runas.exe /u:nazwa_uzytkownika /savecred "C:\sciezka\do\programu.exe"
Wtedy o hasło zapyta tylko przy pierwszym odpaleniu.
Dziwi mnie tylko, skąd u ciebie problemy, jeżeli użytkownik ma uprawnienia administracyjne. Ja u siebie mam i jeszcze nigdy nie zdarzyło mi się, żeby mi komputer odmówił zrobienia czegoś z rejestrem.
Jako że błąd wykryłem testując wstepnie ten programik u siebie, utworzyłem Virtualke z czystą instalacją Windows 7, przy instalacji zostało utworzone podstawowe konto użytkownika, które standardowo znalazło się w grupie administratorzy. Z konta tego moge odpalić edytor rejestru, dodać klucze, wartości itd. Natomiast jak korzystam z programu który napisałem, i który dodaje jeden klucz i kilka wartości do niego, pojawia się błąd : "System.Security.SecurityException: Żądany dostęp do rejestru jest niedozwolony."
- Czy jako ten konkretny użytkownik możesz dodać te konkretne wartości w rejestrze, których nie może program?
- Czy otwierasz klucz w odpowiednim trybie?
key = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Office\\11.0\\Common\\General", **RegistryKeyPermissionCheck.ReadWriteSubTree**);
edit: Te gwiazdeczki to niby pogrubienie miało być :/
Przy domyślnych ustawieniach systemu, nawet jeżeli ktoś jest w grupie administratorów, nie znaczy to, że ma takie uprawnienia. UAC.
Otwieram w odpowiednim trybie, na wbudowanym koncie administratora wszystko działa.
Z poziomu Usera w grupie Administratorzy mogę dodawać klucze i wartości ręcznie - te co ma dodawać program, natomiast program wyrzuca błąd.
Zdaje sobie sprawę że będąc w grupie administratorzy nie ma uprawnień pełnego roota. Dziwi fakt, że użyte metody platformy .NET do obsługi rejestru sobie nie radzą z tym, a ręcznie jak widać jest na tym koncie i z tymi uprawnieniami taka możliwość.
Dodaj manifest do projektu programu i kombinuj z ustawieniami w tym pliku.
Jedną z opcji jest: http://msdn.microsoft.com/en-us/library/bb756929.aspx i ustawienie
<requestedExecutionLevel level="requireAdministrator" ... />
Pytanie - czy musisz je dodawać tam gdzie to robisz? Bo np. w HKEY_CURRENT_USER
możesz grzebać bez uprawnień, jeśli chcesz po prostu aby twój program przechowywał pewne swoje dane (jakieś ustawienia) w rejestrze to powinieneś użyć tej gałęzi. W szczególności kluczaHKCU/Software/nazwa_twojego_programu
Co to w ogóle za klucze?
Jeśli musisz użyć HKLM
to może wystarczy podczas instalacji programu? Wtedy instalator poprosi o uprawnienia administratora, a z już zainstalowanego programu będzie mógł korzystać zwykły użytkownik.
Nie żądaj uprawnień administratora jeśli nie są potrzebne! Chodzi przede wszystkim o bezpieczeństwo (tak, dziury twojego programu mogą umożliwić hakerowi włamanie) oraz o to aby z programu można było skorzystać nie będąc administratorem (w firmie, szkole ...).