VB.NET System.Security.SecurityException: „Żądany dostęp do rejestru jest niedozwolony”

0

Witam
Piszę program w visual basic'u i potrzebuje żeby mój program automatycznie się włączał przy starcie na każdym użytkowniku. Próbowałem dodać klucz w Komputer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run jednak wyskakuje mi błąd System.Security.SecurityException: „Żądany dostęp do rejestru jest niedozwolony”. Czy jest jakiś sposób na obejście tego zabezpieczenia lub czy można użyć innego kodu np:

My.Computer.Registry.CurrentUser.OpenSubKey("software\Microsoft\Windows\CurrentVersion\Run", True).SetValue(Application.ProductName, Application.ExecutablePath)

Z tym, że na każdym użytkowniku logując się tylko na jednego użytkownika?

KOD(przy którym wyskakuje error):
My.Computer.Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Run", True).SetValue(Application.ProductName, Application.ExecutablePath)

0
  1. Spolecznosc? Ale czemu? Co Toba kierowalo wrzucenia tego do spolecznosci :D?

Kto uruchamia ten program? Jakie ma prawa dostepu? Zapewne nie ma admina stad masz ten blad

1

Żeby zapisywać do HKEY_LOCAL_MACHINE musisz mieć podwyższone uprawnienia.

3

Najłatwiejsza możliwość:
Możesz zrobić w manifeście swojej aplikacji, aby wymagała podwyższonych uprawnień - prawym na projekt, "Add New Item", "Application Manifest File". Robi ci się plik manifestu, który jest dołączany do aplikacji. Zmieniasz atrybut level elementu requestedExecutionLevel na requireAdministrator.

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

https://stackoverflow.com/a/2818776

I voila, twoja aplikacja przy każdym starcie dostaje dialog UAC w którym użytkownik musi ją zaakceptować do startu, co - skoro się dzieje przy każdym starcie - prawdopodobnie doprowadza użytkownika do pasji :)

Lepsza możliwość:
sprawdzasz, czy aplikacja jest w autostarcie w HKLM, jeśli nie, to sprawdzasz, czy masz uprawnienia administratora - jeśli tak, do dodajesz, jeśli nie - to uruchamiasz ją samą ponownie, na podwyższonych uprawnieniach, ale na przykład z parametrem, który oznacza, że tylko tę operację należy wykonać.

Sprawdzenie, czy użytkownik jest administratorem:

/// <summary>
/// Sprawdza czy aplikacja jest uruchomiona z podwyższonymi uprawnieniami
/// </summary>
/// <returns></returns>
private static bool IsRunningAsAdministrator()
{
    WindowsIdentity identity = WindowsIdentity.GetCurrent();
    if (identity != null)
    {
        WindowsPrincipal principal = new WindowsPrincipal(identity);
        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }

    return false;
}

Uruchomienie samej siebie z podwyższonymi uprawnieniami i parametrem (akurat /silent):

var selfName = Process.GetCurrentProcess().MainModule.FileName;
ProcessStartInfo self = new ProcessStartInfo(selfName);
self.Verb = "runas"; // o to tutaj jest najważniejsze, bo robi elewację UAC
self.WindowStyle = ProcessWindowStyle.Hidden;
self.Arguments = "/silent";

Process.Start(self);

Najlepsza możliwość:
nie robisz nic automatycznie, tylko użytkownik musi jawnie kliknąć przycisk oznaczony logo tarczy (jak dodać: https://stackoverflow.com/a/33286893), po którym następuje np. coś takiego jak w opcji powyżej. Dzięki czemu wie, co się dzieje i dlaczego.

Alternatywnie:
dodajesz rzeczy do HKLM podczas instalacji, a instalator sam już wymaga podwyższonych uprawnień.

Jest jeszcze opcja, którą podał @fasadin, czyli żeby zmienić globalnie ustawienia zapisu do tego klucza Rejestru, ale jest to kompletnie niezgodne z dobrymi praktykami. I w sumie też samo wymaga podwyższonych uprawnień, więc błędne koło.

Sorki, nie znam VB.NET, więc kod w C#.

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