Frage

Ich habe diese Anwendung, die einige Dinge in geschützten Pfaden (wie% Programfiles%) tun müssen, ich weiß, dass ich soll% APPDATA% werden, aber ich kann das nicht für jetzt ändern. Ich habe all die Dinge isoliert, die UAC erfordern könnte an einem anderen Projekt zu zeigen, hier ist ein Beispielcode:

using System;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;

class Class1
{
    static void Main(string[] args)
    {
        try
        {
            File.CreateText(Path.Combine(Application.StartupPath, "something.txt"));
        }
        catch (UnauthorizedAccessException ex)
        {
            MessageBox.Show(ex.Message, "UnauthorizedAccessException", MessageBoxButtons.OK, MessageBoxIcon.Error);

            if (args.Length == 0)
            {
                Process proc = new Process();
                proc.StartInfo.FileName = Application.ExecutablePath;
                proc.StartInfo.Arguments = "not again";
                proc.StartInfo.Verb = "runas";
                proc.Start();
            }
            else
            {
                MessageBox.Show("Exit to avoid loop.");
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Exception", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
}

Also, ich nenne diese ausführbare Datei von meinem Hauptprogramm, und wenn es wegen eines unerlaubten Zugriff fehlschlägt, wird es starten sich die UAC-Anfrage zeigt.

Meine Fragen sind:

1) Ich habe die Projektausgabe aus einer DLL zu einem EXE konvertieren musste, weil ich keine Möglichkeit, UAC verlangen von einer DLL finden konnte, ist es eine einfache Möglichkeit, das zu tun?

2) Ich habe auch bemerkt, dass einige Programme eine personalisierte UAC-Meldung zeigen, mit dem Programm-Logo und alle jene Dinge, lassen Sie mich Ihnen ein Beispiel:

hässliche UAC

Personalisierte UAC

Wie kann ich das für mein Programm?

3) Um zu vermeiden, in einer Schleife eintritt, wenn mit erhöhten Rechten ausgeführt wird, ein es wird eine andere UnauthorizedAccessException ich das Ding keine args vorbei war. Was würden Sie das gleiche Ziel zu erreichen tun?

Ich denke, das ist alles für jetzt. Vielen Dank für Ihre Zeit.

War es hilfreich?

Lösung

1 Sie nicht den Höhenmodus des Prozesses Ihre DLL-Hosting steuern kann. Sie können Erteilung Erlaubnis zum Zielordner oder Registry für alle während des Prozesses installieren, wenn Sie steuern Prozess installieren können.

2 müssen Sie Neustart des Prozesses in erweiterten Modus unter Verwendung des Befehls runas , wenn es nicht angehoben wird.

Andere Tipps

Ich hatte dieselben Probleme. Googeln um ca. 2 Tage fand ich die einzige Lösung, die meine Bedürfnisse passen - die Anwendung mit Administratorrechten starten. Ich die Anwendung starten, überprüfen, ob es als Administrator ausgeführt werden. Und wenn nicht -. restart mit administrativen Rechten

    static void Main(string[] args)
    {
        if (NeedElevation(args) && Elevate(args))
        { // If elevastion succeeded then quit.
            return;
        }
        // your code here
    }

    public static bool Elevate(string[] args)
    {
        try
        {
            ProcessStartInfo info = Process.GetCurrentProcess().StartInfo;
            info.Verb = "runas";
            info.Arguments = NoElevateArgument;
            foreach (string arg in args)
            {
                info.Arguments += ' ' + arg;
            }
            info.FileName = Assembly.GetEntryAssembly().Location;

            Process process = new System.Diagnostics.Process();
            process.StartInfo = info;

            process.Start();
        }
        catch (Exception)
        {
            MessageBox.Show("You don't have administrative privileges thus the Automatic Application Updates cannot be started. But the rest of application is available as usually.",
                "Not enough user rights", MessageBoxButtons.OK, MessageBoxIcon.Information);
            return false;
        }

        return true;
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top