2012-05-24 18 views
7

Cuando un usuario guarda un archivo de mi aplicación, actualmente no puede guardarlo en ubicaciones restringidas (como C :). Creo que esta es una buena restricción, pero me gustaría proporcionar un aviso de UAC para elevar los privilegios y permitir que un usuario guarde en un área restringida.¿Cómo visualizar el aviso de UAC para guardar el archivo en una ubicación restringida usando C#?

He visto muchas respuestas sobre este tema que implican engendrar un nuevo proceso con privilegios elevados usando 'runas'. Además, parece que esto se puede hacer al suplantar a otro usuario. Por lo que entiendo, ambos métodos requieren que el usuario proporcione credenciales de usuario.

Lo que quiero hacer es básicamente lo que hace Windows. Cuando intenta copiar un archivo en C: \ en Windows 7 (suponiendo que tienes UAC ajustado a su nivel predeterminado), se obtiene el siguiente mensaje:

UAC Prompt

vez que haga clic en el botón Continuar con el escudo de UAC, el archivo se copia a C: \ sin solicitud de credenciales (suponiendo que haya iniciado sesión con privilegios de administrador).

¿Cómo puedo replicar este comportamiento en mi aplicación para usuarios de administrador? No deberían tener que suplantar a ningún otro usuario porque ya tienen privilegios de administrador. ¿Alguien puede proporcionar detalles sobre lo que Windows está haciendo durante este proceso? ¿Están generando un nuevo proceso explorer.exe con privilegios elevados?

+0

Algunos inspiración: http://stackoverflow.com/questions/573086/how-to-elevate-privileges-only-when-required –

Respuesta

5

Tienes que hacer lo que Windows hace. Y genera un nuevo proceso que se ejecutará con derechos elevados. No hay atajos aquí. El token que se asigna cuando se inicia un proceso es lo que determina qué derechos tiene el proceso. Ese token no se puede cambiar después de que el proceso haya comenzado. Si necesita elevarse, necesita un nuevo proceso.

He visto muchas respuestas sobre este tema que implican engendrar un nuevo proceso con privilegios elevados usando 'runas'. Además, parece que esto se puede hacer al suplantar a otro usuario. Por lo que entiendo, ambos métodos requieren que el usuario proporcione credenciales de usuario.

No, ese no es el caso. Si el usuario actual no es un administrador, el cuadro de diálogo de UAC solicitará nuevas credenciales de un usuario que tenga derechos de administrador. Ese es el diálogo sobre el hombro UAC. Por otro lado, si el usuario actual es un administrador, solo obtiene el consentimiento diálogo. Ese es el diálogo que se muestra en el escritorio seguro y simplemente le pide que haga clic en Continuar.

Lo único que los componentes de Windows pueden hacer que usted no puede hacer es iniciar un proceso elevado sin mostrarle el cuadro de diálogo de consentimiento. Eso ocurre solo en Windows 7 (no en Vista), y solo si tiene la configuración UAC en la nueva configuración predeterminada que se agregó en Windows 7. Así es como Explorer puede mostrar el diálogo que incluyó en la pregunta y luego inicie un proceso elevado para hacer la copia sin mostrar el diálogo de consentimiento de UAC. Solo los componentes de Windows tienen esa capacidad.

Pero la conclusión es que debe iniciar un nuevo proceso que se ejecuta elevado. Usar el verbo runas es la manera canónica de hacerlo.

+0

Gracias por la respuesta. El diálogo _consent_ es definitivamente lo que estoy buscando. ¿Entonces el método 'runas' es el patrón preferido para privilegios elevados? Parece que el n. ° de respuestas recomendadas se divide en 50/50 con respuestas que recomiendan el patrón de suplantación (que parece implicar p/invoke). –

+0

El diálogo de consentimiento es lo que obtendrás si comienzas un proceso con el verbo 'runas', y el usuario es un administrador. Es trivial usar 'runas' y no puedo ver por qué necesitarías algo más. –

+1

En realidad, la forma recomendada es utilizar el manifiesto de la aplicación con el nivel de ejecución de 'requireAdministrator'. Eso funciona si tienes dos ejecutables diferentes, por supuesto. Si solo hay un ejecutable, el verbo 'runas' es la única forma. –

6

Programming Elevated Privilege/UAC

La ejecución de aplicaciones con más privilegios que se requiere es contra el principio de privilegios mínimos , y pueden tener un potencial de seguridad vulnerabilidad. Para defender esto, Windows Vista introduce la Cuenta de usuario Control (UAC), para proteger el sistema operativo ejecutando las aplicaciones con privilegios reducidos (como un usuario normal), incluso si el usuario actual es como administrador. Cada vez más usuarios de XP/2K también usan cuenta de usuario normal para uso diario. Lea UAC Desmitificado primero en para comprender el UAC.

Hay dos errores comunes que los desarrolladores tienden a hacer:

  • Solicitar al usuario final para ejecutar una aplicación con privilegios de administrador, incluso aunque esto no es necesario, la mayoría de las veces a causa del mal diseño prácticas. Estas aplicaciones pueden ahuyentar a los usuarios finales o tienen vulnerabilidad de seguridad.
  • No solicite al usuario final que ejecute la aplicación elevada pero trate de realizar operaciones que requieren privilegio de administrador. Estas aplicaciones simplemente se rompen en cuenta de usuario normal Windows Vista o Windows XP/2K.

El código de muestra descargable muestra cómo programar el privilegio elevado /UAC. Ambas aplicaciones de muestra de WPF y Windows Forms son . Ejecutar la aplicación de los siguientes escenarios para ver la diferencia :

  • usuario normal, Windows XP/Windows Vista: el icono del escudo UAC se muestra . Al hacer clic en "Guardar en C: \" se muestra el cuadro de diálogo "Ejecutar como", solicitando al usuario que ingrese la contraseña del administrador para continuar;
  • Administrador, Windows XP/Windows Vista con UAC deshabilitado: el icono de escudo UAC es oculto. Al hacer clic en "Guardar en C: \" se completó sin ningún diálogo;
  • Administrador, Windows Vista con UAC habilitado: aparece el icono de escudo UAC . Al hacer clic en "Guardar en C: \" aparece el cuadro de diálogo solicitando permiso al usuario para continuar.

Link to Download

Llamar a la elevada ejecutar (pruebas para admin primero):

private void SaveToRootFolder_Click(object sender, EventArgs e) 
    { 
     string fileName = @"C:\Test.txt"; 
     if (App.IsAdmin) 
      DoSaveFile(textBox1.Text, textBox2.Text, fileName); 
     else 
     { 
      NameValueCollection parameters = new NameValueCollection(); 
      parameters.Add("Text1", textBox1.Text); 
      parameters.Add("Text2", textBox2.Text); 
      parameters.Add("FileName", fileName); 
      string result = Program.ElevatedExecute(parameters); 
      if (!string.IsNullOrEmpty(result)) 
       MessageBox.Show(result); 
     } 
    } 

elevada Ejecuta:

internal static string ElevatedExecute(NameValueCollection parameters) 
    { 
     string tempFile = Path.GetTempFileName(); 
     File.WriteAllText(tempFile, ConstructQueryString(parameters)); 

     try 
     { 
      ProcessStartInfo startInfo = new ProcessStartInfo(); 
      startInfo.UseShellExecute = true; 
      startInfo.WorkingDirectory = Environment.CurrentDirectory; 
      Uri uri = new Uri(Assembly.GetExecutingAssembly().GetName().CodeBase); 
      startInfo.FileName = uri.LocalPath; 
      startInfo.Arguments = "\"" + tempFile + "\""; 
      startInfo.Verb = "runas"; 
      Process p = Process.Start(startInfo); 
      p.WaitForExit(); 
      return File.ReadAllText(tempFile); 
     } 
     catch (Win32Exception exception) 
     { 
      return exception.Message; 
     } 
     finally 
     { 
      File.Delete(tempFile); 
     } 
    } 
+0

¡Gracias por la respuesta detallada! –

1

una opción limitada, útil sólo cuando se mueve, Renombrar, copiar y borrar archivos:

SHFileOperation

Si intenta realizar una operación de archivo a través de esta función, Windows proporcionará la petición de elevación para el usuario.

Nota hay algunos inconvenientes para esto:

  • Esto sólo funciona para desplazar, renombrar, copiar y eliminar. Guardar un nuevo archivo de esta manera requeriría guardarlo en un directorio temporal y luego moverlo a la ubicación deseada. Esto no resuelve el problema del cuadro de diálogo Guardar archivo que no le permite seleccionar una ubicación protegida UAC como un objetivo.
  • Si el directorio de destino no existe (para Mover o Copiar), SHFileOperation puede solicitar al usuario si se debe crear el directorio de destino. Sin embargo, NO solicitará privilegios elevados para hacerlo, y por lo tanto fallará en una ubicación protegida de UAC. La solución para esto es crear manualmente los directorios inexistentes en una ubicación temporal, luego moverlos/copiarlos a la ubicación de destino. Esto proporcionará el aviso de UAC.
  • Necesita tener planes de contingencia en lugar de si el usuario selecciona 'Saltar' o 'Cancelar' en el cuadro de diálogo Mover/Copiar, o si el usuario selecciona 'No' en el indicador de UAC.
Cuestiones relacionadas