2009-07-23 17 views
24

Yo sé cómo poner en marcha un proceso con privilegios de administrador de un proceso usando:¿Cómo de-elevar los privilegios de un proceso hijo

proc.StartInfo.UseShellExecute = true; 
proc.StartInfo.Verb = "runas"; 

donde proc es un System.Diagnostics.Process. Pero, ¿cómo hace uno lo opuesto?

Si el proceso en el que se encuentra ya es elevado, ¿cómo inicia el nuevo proceso sin privilegios de administrador? Más exactamente, tenemos que iniciar el nuevo proceso con el mismo nivel de permiso que Windows Explorer, por lo que no hay cambios si UAC está deshabilitado, pero si UAC está habilitado, pero nuestro proceso se está ejecutando elevado, tenemos que realizar una determinada operación sin elevación porque estamos creando una unidad virtual y si se crea con permisos elevados y el explorador de Windows se está ejecutando sin importancia, no aparecerá.

Siéntase libre de cambiar el título a algo mejor, no pude encontrar una buena descripción.

+3

La misma pregunta: http://stackoverflow.com/questions/196949/how-to-run-not-elevated-in-vista-net La respuesta parece aterradora debido a h. – weiqure

+3

No solo da miedo, no es correcto. La elevación de UAC es de una sola manera y no hay forma documentada de volver atrás (Inyectar en explorer.exe o usar el Programador de tareas es bastante chulo y probablemente no sea una buena idea) – Anders

Respuesta

8

Terminamos con la muestra de este artículo Proyecto de Código: High elevation can be bad for your application: How to start a non-elevated process at the end of the installation

Parece que funciona hasta ahora, supongo que inyecta en RUNDLL32.EXE, mi C++/Win32 es bastante débil por lo que yo no Mire demasiado en la implementación real, solo es uso. Confirmó que funciona en Vista y Win7 tanto x86 como x64 (al menos para nosotros, x86 y x64 requieren dll's diferentes que se verifican durante el tiempo de instalación y se usa el adecuado).

0

Puede usar ProcessStartInfo.UserName y ProcessStartInfo.Password para especificar la cuenta en la que desea que se ejecute su proceso.

class Program 
{ 
    static void Main(string[] args) 
    { 
     var psi = new ProcessStartInfo(@"c:\windows\system32\whoami.exe"); 
     var password = new SecureString(); 
     password.AppendChar('s'); 
     password.AppendChar('e'); 
     password.AppendChar('c'); 
     password.AppendChar('r'); 
     password.AppendChar('e'); 
     password.AppendChar('t'); 
     psi.Password = password; 
     psi.UserName = "username"; 
     psi.UseShellExecute = false; 
     psi.RedirectStandardOutput = true; 

     var p = new Process(); 
     p.StartInfo = psi; 
     p.Start(); 
     p.WaitForExit(); 

     Console.WriteLine(p.StandardOutput.ReadToEnd()); 
    } 
} 
+12

¿Cómo harías esto si no se conoce el nombre de usuario/contraseña? Necesita trabajar para cualquier máquina desconocida – Davy8

15

La solución para usted es utilizar el proceso EXPLORER.exe.

La idea es ejecutar el proceso en modo UN-ELEVATED, utilizando el proceso explorador de archivos de Windows explorer.exe (info). Digamos que el proceso que queremos iniciar está en $TEMP\MyUnElevatedProcess.exe.

Por lo tanto, para el código NSIS, voy a escribir: (pero se puede ejecutar en cualquier idioma)

Exec '"$WINDIR\explorer.exe" "$TEMP\MyUnElevatedProcess.exe"' 

Código de ejemplo (utilizando NSIS instalador)

Exec '"$WINDIR\explorer.exe" "$TEMP\MyUnElevatedProcess.exe"' 

*** código tomado de http://mdb-blog.blogspot.com/2013/01/nsis-lunch-program-as-user-from-uac.html

+1

Esta es una de las mejores respuestas que he visto para iniciar un proceso no elevado ... lamentablemente, no puedo usarlo porque no puedo capturar stdout o stderr de MyUnElevatedProcess.exe. – Kenn

+2

Estoy tratando de usar esta solución, pero la aplicación se ejecuta en la carpeta Windir en lugar de la carpeta Temp ... ¿alguna solución para esto? (es decir, los archivos son relativos a la carpeta windir) – sebas

+1

Para usar esto para la casilla de verificación en la página de finalización en un instalador de interfaz de usuario moderna, use dos líneas. Primera línea: '! Define MUI_FINISHPAGE_RUN" $ WINDIR \ explorer.exe "' y segunda línea: '! Define MUI_FINISHPAGE_RUN_PARAMETERS" $ TEMP \ MyUnElevatedProcess.exe "'. –

Cuestiones relacionadas