Domanda

Sto cercando di scoprire se c'è un modo per elevare una funzione specifica all'interno di un'applicazione.Per esempio, ho un app di sistema e le impostazioni utente vengono memorizzate nel registro di sistema, ho solo bisogno di elevazione per quando il sistema è necessario modificare le impostazioni.

Purtroppo tutte le info che ho incontrato parla solo l'avvio di un nuovo processo con privilegi elevati.

È stato utile?

Soluzione

Che cosa si ha realmente bisogno di fare è memorizzare le impostazioni della cartella Dati Applicazioni.

Altri suggerimenti

È impossibile elevare solo una funzione o di qualsiasi altra parte di un unico processo, perché l'elevazione del livello di un processo di attributo.Proprio come con la gravidanza, il processo può essere elevato o non.Se avete bisogno di qualche parte del codice in modo da essere in esecuzione elevato, è necessario avviare un processo separato.

Tuttavia, se è possibile implementare la funzione di un oggetto COM, è possibile eseguire elevati indirettamente, attraverso la creazione di un'elevata oggetto COM, come questo:

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

Il miglior articolo che ho visto è questo:

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

Spiega giù per la nitty gritty di cosa sta succedendo dietro le quinte, quando esistenti applicazioni di microsoft continuano a portare il messaggio UAC, e un po ' di come farlo da soli, o almeno si sa che cosa il vostro contro per farlo funzionare...

(nota: gli esempi che egli mostra sono managed c++)

Trovato un bell'articolo che tratta questo qui:

La maggior parte delle applicazioni non richiedono privilegi di amministratore in fase di esecuzione.Se la vostra applicazione non mantenere lo stato tra una sessione mentre esegue e non fare qualcosa di simile modifica criteri di protezione locali, dovrebbe essere sufficiente in esecuzione con un token dell'utente standard.A volte alcune parti dell'applicazione richiede i privilegi di amministratore, e si dovrebbe separare i pezzi in un processo separato.Ci arriverò un po ' più tardi.

Sembra l'articolo parla di utilizzo di C++, così ho trovato un altro articolo che copre come chiamare questo codice utilizza P/Invoke.Così dovrebbe essere fattibile da .NET.

Il SDK di Windows "Cross Technology Campioni" hanno un "UACDemo", un'applicazione che mostra esempi di C# applicazione Windows Form che lancia un amministratore processo per eseguire un compito che richiede l'elevazione (cioèla scrittura %programfiles%).

Questo è un ottimo punto di partenza per scrivere le proprie funzionalità.Ho esteso questo esempio per l'uso .Net Remoting e IPC di chiamata tra il mio utente normale processo e il mio processo con privilegi elevati, che mi permette di mantenere l'elevazione eseguibile generico e implementare il codice specifico per l'applicazione all'interno dell'applicazione.

Penso Aydsman è sulla strada giusta qui.Con l'aggiunta di Named Pipe supporto per .NET 3.5, si dispone di una discreta IPC meccanismo per comunicare con un elevato processo figlio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top