2008-09-17 23 views
5

Estoy tratando de averiguar si hay alguna manera de elevar una función específica dentro de una aplicación. Por ejemplo, tengo una aplicación con sistema y configuraciones de usuario que están almacenadas en el registro, solo necesito elevación para cuando se necesite cambiar la configuración del sistema.Vista UAC, Access Elevation y .Net

Desafortunadamente toda la información que he encontrado habla acerca de comenzar un nuevo proceso con privilegios elevados.

Respuesta

2

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

3

Encontrado un nice article that covers this here:

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

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

+0

El enlace al que se hace referencia ya no funciona. ¿Entonces sabes de otro? – cjbarth

7

El mejor artículo que he visto es éste:

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

Explica hasta el quid de la cuestión de lo que pasa detrás de las escenas cuando las aplicaciones existentes de Microsoft están cerrando la UAC, y una poco de cómo hacerlo usted mismo, o al menos que sepa lo que su frente para hacer que funcione ...

(tenga en cuenta los ejemplos que se muestran son C++ administrado)

+0

Eso realmente es un artículo maravilloso. ¿Alguien tiene alguna referencia sobre cómo implementar esto en el código .Net (C# o VB.Net)? – cjbarth

11

es imposible elevar una sola fu nction 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 una parte de su código se ejecute elevada, debe iniciar un proceso por separado.

Sin embargo, si se puede poner en práctica su función como un objeto COM, se puede ejecutar elevado indirectamente, mediante la creación de un objeto COM elevada, así:

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

el SDK de Windows "Muestras Cruz Tecnología" tiene 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, escribir en %programfiles%).

Este es un gran punto de partida para escribir su propia funcionalidad. He ampliado esta muestra para usar .Net Remoting e IPC para hacer una llamada entre mi proceso de usuario normal y mi proceso elevado que me permite mantener el archivo ejecutable de elevación genérico e implementar código específico de la aplicación dentro de la aplicación.

+1

Aquí está el enlace a la muestra a la que se hace referencia anteriormente: [http://msdn.microsoft.com/en-us/library/aa970890(v=vs.90).aspx](http://msdn.microsoft.com/ en-us/library/aa970890 (v = vs.90) .aspx) – cjbarth

0

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

Cuestiones relacionadas