Pregunta

Estoy tratando de averiguar si hay alguna forma de mejorar una función específica dentro de una aplicación.Por ejemplo, tengo una aplicación con configuraciones del sistema y del usuario que se almacenan en el registro, solo necesito elevación para cuando es necesario cambiar la configuración del sistema.

Desafortunadamente, toda la información que he encontrado habla solo de iniciar un nuevo proceso con privilegios elevados.

¿Fue útil?

Solución

Lo que realmente necesita hacer es almacenar su configuración en la carpeta Datos de la aplicación.

Otros consejos

Es imposible elevar solo una función o cualquier otra parte de un solo proceso, porque el nivel de elevación es un atributo por proceso.Al igual que con el embarazo, su proceso puede ser elevado o no.Si necesita que alguna parte de su código se ejecute de forma elevada, debe iniciar un proceso por separado.

Sin embargo, si puede implementar su función como un objeto COM, puede ejecutarla elevada indirectamente, creando un objeto COM elevado, como este:

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

El mejor artículo que he visto es este:

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

Explica hasta el meollo de la cuestión de lo que sucede detrás de escena cuando las aplicaciones de Microsoft existentes muestran el mensaje UAC, y un poco de cómo hacerlo usted mismo, o al menos sabrá a qué se enfrenta para que funcione. ..

(tenga en cuenta que los ejemplos que muestra están administrados en C++)

Encontrado una Buen artículo que cubre esto aquí.:

La mayoría de las aplicaciones no requieren privilegios de administrador en tiempo de ejecución.Si su aplicación no mantiene el estado entre sesiones mientras se ejecuta y no hace algo como modificar la política de seguridad local, debería funcionar bien con un token de usuario estándar.A veces, ciertas partes de su aplicación requerirán privilegios de administrador y deberá separar esas partes en un proceso separado.Hablaré de eso un poco más tarde.

Parece que el artículo habla sobre el uso de C++, así que encontré otro articulo que cubre cómo llamar a este código usando P/Invoke.Entonces debería ser posible desde .NET.

Las "Muestras de tecnología cruzada" del SDK de Windows tienen una aplicación "UACDemo" que muestra ejemplos de una aplicación C# Windows Forms que inicia un proceso de administrador para realizar una tarea que requiere elevación (es decir,escribiendo a %programfiles%).

Este es un excelente punto de partida para escribir su propia funcionalidad.Extendí este ejemplo para usar .Net Remoting e IPC para realizar llamadas entre mi proceso de usuario normal y mi proceso elevado, lo que me permite mantener el ejecutable de elevación genérico e implementar código específico de la aplicación dentro de la aplicación.

Creo que Aydsman está en el camino correcto.Con la adición de compatibilidad con Named Pipes a .NET 3.5, tiene un mecanismo IPC decente para comunicarse con un proceso secundario elevado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top