Question

J'essaie de savoir s'il existe un moyen d'élever une fonction spécifique dans une application. Par exemple, j'ai une application avec des paramètres système et utilisateur qui sont stockés dans la base de registre. Je n'ai besoin que d'une élévation lorsque les paramètres système doivent être modifiés.

Malheureusement, toutes les informations que j'ai rencontrées ne parlent que du démarrage d'un nouveau processus avec des privilèges élevés.

Était-ce utile?

La solution

Ce que vous devez vraiment faire est de stocker vos paramètres dans le dossier Application Data.

Autres conseils

Il est impossible d'élever une seule fonction ou toute autre partie d'un processus unique, car le niveau d'élévation est un attribut par processus. Comme avec la grossesse, votre processus peut être élevé ou non. Si vous avez besoin qu'une partie de votre code soit exécutée avec un niveau élevé, vous devez démarrer un processus séparé.

Cependant, si vous pouvez implémenter votre fonction en tant qu'objet COM, vous pouvez l'exécuter indirectement, en créant un objet COM élevé, comme ceci:

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);
}

Le meilleur article que j'ai vu est celui-ci:

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

Il explique en détail ce qui se passe dans les coulisses lorsque les applications Microsoft existantes affichent l'invite du contrôle de compte d'utilisateur, et vous explique un peu comment le faire vous-même, ou du moins vous saurez à quoi vous opposer. ça marche ...

(notez que les exemples qu'il montre sont gérés en c ++)

Vous avez trouvé un article intéressant sur ce sujet :

  

La plupart des applications ne nécessitent pas de privilèges d'administrateur lors de l'exécution. Si votre application ne conserve pas l'état inter-session pendant son exécution et ne modifie pas la stratégie de sécurité locale, son exécution devrait s'effectuer avec un jeton d'utilisateur standard. Parfois, certaines parties de votre application nécessiteront des privilèges d’administrateur, et vous devrez les séparer dans un processus séparé. J'y reviendrai un peu plus tard.

On dirait que l'article parle d'utilisation de C ++. J'ai donc trouvé un autre article qui explique comment appeler ce code à l'aide de P / Invoke. Donc, devrait être faisable à partir de .NET.

Le Kit de développement logiciel (SDK) de Windows " Échantillons technologiques croisés " avoir un " UACDemo " application qui montre des exemples d’une application Windows Forms C # qui lance un processus d’administrateur pour effectuer une tâche nécessitant une élévation (c.-à-d. écriture dans % programfiles% ).

C’est un excellent point de départ pour écrire vos propres fonctionnalités. J'ai étendu cet exemple pour qu'il utilise .Net Remoting et IPC pour passer d'un processus utilisateur normal à un processus élevé, ce qui me permet de conserver l'exécutable d'élévation générique et d'implémenter du code spécifique à l'application dans l'application.

Je pense qu'Aydsman est sur la bonne voie ici. Avec l’ajout de la prise en charge de Named Pipes à .NET 3.5, vous disposez d’un mécanisme IPC décent pour communiquer avec un processus enfant élevé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top