Frage

Ich versuche, herauszufinden, ob es eine Möglichkeit ist, eine bestimmte Funktion innerhalb einer Anwendung zu erhöhen. Zum Beispiel habe ich eine App mit System- und Benutzereinstellungen, die in der Registrierung gespeichert werden, ich brauche nur Erhebung für, wenn die Systemeinstellungen geändert werden müssen.

Leider alle Infos Ich habe über Gespräche kommen über nur einen neuen Prozess mit erhöhten Rechten zu starten.

War es hilfreich?

Lösung

Was Sie wirklich tun müssen, ist Ihre Einstellungen, um die Anwendungsdaten-Ordner zu speichern.

Andere Tipps

Es ist unmöglich, nur eine Funktion oder einen anderen Teil eines einzigen Prozesses zu erhöhen, da das Höhenniveau Attribut ein pro-Prozess. Genau wie bei der Schwangerschaft, kann entweder Ihr Prozess erhöht werden oder nicht. Wenn Sie einen Teil Ihres Codes müssen erhöht werden, ausgeführt wird, müssen Sie einen separaten Prozess starten.

Wenn Sie jedoch Ihre Funktion als COM-Objekt implementieren können, können Sie führen Sie es erhöht indirekt, durch eine erhöhte COM-Objekt erstellen, wie folgt aus:

HRESULT 
CreateElevatedComObject (HWND hwnd, REFGUID guid, REFIID iid, void **ppv)
{
    WCHAR monikerName[1024];
    WCHAR clsid[1024];
    BIND_OPTS3 bo;

    StringFromGUID2 (guid, clsid, sizeof (clsid) / 2);

    swprintf_s (monikerName, sizeof (monikerName) / 2, L"Elevation:Administrator!new:%s", clsid);

    memset (&bo, 0, sizeof (bo));
    bo.cbStruct = sizeof (bo);
    bo.hwnd = hwnd;
    bo.dwClassContext = CLSCTX_LOCAL_SERVER;

    // Prevent the GUI from being half-rendered when the UAC prompt "freezes" it
    MSG paintMsg;
    int MsgCounter = 5000;  // Avoid endless processing of paint messages
    while (PeekMessage (&paintMsg, hwnd, 0, 0, PM_REMOVE | PM_QS_PAINT) != 0 && --MsgCounter > 0)
    {
        DispatchMessage (&paintMsg);
    }

    return CoGetObject (monikerName, &bo, iid, ppv);
}

Der beste Artikel, den ich gesehen habe, ist diese:

http://www.codeproject.com/KB/vista-security/ UAC__The_Definitive_Guide.aspx

Es erklärt, bis auf die Nitty Gritty von, was hinter den Kulissen auf die vorhandenen Microsoft-Anwendungen sind die UAC-Prompt Erziehung, und ein bisschen wie es selbst zu tun, oder zumindest wissen Sie, was gegen Ihre bis zu machen es funktioniert ...

(man beachte die Beispiele zeigt er verwaltet c ++)

schöne Artikel rel="nofollow, die dies hier umfassen:

  

Die meisten Anwendungen nicht über Administratorrechte während der Laufzeit erfordern. Wenn Ihre Anwendung nicht Cross-Sitzungszustand nicht beibehalten, während es ausführt und nicht tut, so etwas wie der lokale Sicherheitsrichtlinie ändern, sollte es nur in Ordnung sein mit einem Standard-Benutzertoken ausgeführt wird. Manchmal bestimmte Teile der Anwendung wird über Administratorrechte benötigen, und Sie sollten diese Stücke in einem separaten Prozess trennen. Ich werde später in diesem ein wenig bekommen.

Sieht aus wie der Artikel spricht über C ++, so fand ich, ein weiterer Artikel dass beschreibt, wie dieser Code aufzurufen P mit / Invoke. So sollte von .NET machbar sein.

Das Windows SDK „Cross Technology Samples“ haben eine „UACDemo“ Anwendung, die Beispiele für eine C # Windows Forms-Anwendung zeigt, die ein Administrator-Prozess startet, eine Aufgabe auszuführen, die Erhebung erfordert (das heißt das Schreiben %programfiles%).

Dies ist ein guter Ausgangspunkt für Ihre eigene Funktionalität zu schreiben. Ich habe diese Probe erweitert .NET Remoting und IPC zu verwenden, um zwischen meinem normalen Benutzerprozess und meinem erhöhten Prozess zu nennen, die mir die Erhebung ausführbaren generisch zu halten erlaubt und anwendungsspezifischen Code innerhalb der Anwendung implementieren.

Ich denke, Aydsman auf dem richtigen Weg ist hier. Mit dem Zusatz von Named Pipes zu .NET 3.5 unterstützt, haben Sie einen anständigen IPC-Mechanismus für mit einem erhöhten Kind-Prozess in Verbindung steht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top