.net - Løsning mod begrænsning af registreringshåndtering i Windows 7?

Indlæg af Hanne Mølgaard Plasc

Problem



Ok så siden i xp er de fleste mennesker logget som admins - det er nemt for en programmør at lave et program med registret. Det jeg forsøger at gøre er dette:


Softwaren er startet, og den er tilføjet som en startproces i registreringsdatabasen - dog dette bør kun ske, når programmet lukker - ikke før.


Men dette virker ikke i XP, når brugeren er begrænset og samme ting i Vista, 7,2008.


Hvad er løsningerne? Jeg tænkte på at gøre programmet til en planlagt opgave eller vedhæftet en proces med højere privilegier? Enhver arbejds måde? Jeg er taggin dette som .net siden min software er .net relateret - faktisk samme ting sker og i c + + - men jeg håber hemmeligt at net tilbyder lettere metoder til at udarbejde det.
10x i forvejen!

Bedste reference


Dette er ikke en begrænsning af Windows 7, det er faktisk ved design. Se mit svar her for detaljer.


Hvad du har brug for hedder proceshøjde . Det er standardmetoden til at håndtere dette, en mekanisme, der er indbygget i UAC, for at give brugerne mulighed for at autentificere sig som administrator og midlertidigt få alle de privilegier og ansvar, der følger med denne titel. Windows selv bruger dette overalt:


Eksempel på elevationsskærm, der vises i Windows UI


Der er en fantastisk artiklen her tilgængelig: Skjoldikoner, UAC og proceshøjde i .NET.

Men bare for at opsummere i tilfælde af link rot, er her trinene: [6]



  1. Bestem om brugeren allerede har de nødvendige tilladelser. Den enkleste måde er at kalde IsUserAnAdmin API-funktionen. [7]

  2. Underretning af brugeren om, at højden er påkrævet ved hjælp af et 'skjold' -ikon. I WinForms skal du indstille knappen s s FlatStyle til 'System' og bruge P/Invoke til at vise skærmen. Prøvekode:


    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr SendMessage(IntPtr hWnd, int Msg,
                                            IntPtr wParam, IntPtr lParam);
    
    public const int BCM\_SETSHIELD = 0x0000160C;
    
    public static void SetButtonShield(Button btn, bool showShield)
    {
        // Verify that we're running on Vista or later
        if ((Environment.OSVersion.Platform == PlatformID.Win32NT) &&
            (Environment.OSVersion.Version.Major >= 6))
        {
            SendMessage(btn.Handle, BCM\_SETSHIELD, IntPtr.Zero,
                        showShield ? new IntPtr(1) : IntPtr.Zero);
        }
    }
    

  3. Start processen igen med administratorrettigheder. Dette indebærer at vise elevationsdialogen for at give brugeren mulighed for at hæve programmet. Prøvekode:


    ProcessStartInfo psi = new ProcessStartInfo
                               {
                                   Arguments = "-justelevated",
                                   ErrorDialog = true,
    
                                   // Handle is the handle for your form
                                   ErrorDialogParentHandle = Handle,
                                   FileName = Application.ExecutablePath,
                                   Verb = "runas"
                               };
    try
    {
        Process.Start(psi);
        Close();
    }
    catch (Exception ex)
    {
        // the process couldn't be started. This happens for 1 of 3 reasons:
    
        // 1. The user cancelled the UAC box
        // 2. The limited user tried to elevate to an Admin that has a blank password
        // 3. The limited user tries to elevate as a Guest account
        MessageBox.Show(ex.Message);
    }
    

  4. [[Valgfri]] Kode underskrive din ansøgning for at erstatte den fjendtlige, gule UAC elevationsboks med en mere behagelig grå eller blå. [8]


Andre referencer 1


Det skal alligevel være per bruger, og du vil ikke have tilladelsesproblemer. HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Run

Andre referencer 2


Hensigten med begrænsede brugere er at forhindre dette.