Estoy tratando de instalar un servicio usando InstallUtil.exe pero invoqué Process.Start
. Aquí está el código:
ProcessStartInfo startInfo = new ProcessStartInfo (m_strInstallUtil, strExePath);
System.Diagnostics.Process.Start (startInfo);
donde m_strInstallUtil
está la ruta totalmente calificada y exe a "InstallUtil.exe" y strExePath
es la ruta / nombre totalmente calificado a mi servicio.
Ejecutar la sintaxis de la línea de comandos desde un símbolo del sistema elevado funciona; desde mi aplicación (usando el código anterior) no. Supongo que estoy lidiando con un problema de elevación del proceso, entonces, ¿cómo ejecutaría mi proceso en un estado elevado? ¿Necesito mirar ShellExecute
esto?
Todo esto está en Windows Vista. Estoy ejecutando el proceso en el depurador VS2008 elevado a privilegio de administrador.
También intenté configurar, startInfo.Verb = "runas";
pero no pareció resolver el problema.
fuente
startInfo.UseShellExecute = true;
además destartInfo.Verb = "runas";
que funcionó bien para mí.Respuestas:
Puede indicar que el nuevo proceso debe iniciarse con permisos elevados configurando la propiedad Verb de su objeto startInfo en 'runas', de la siguiente manera:
Esto hará que Windows se comporte como si el proceso se hubiera iniciado desde el Explorador con el comando de menú "Ejecutar como administrador".
Esto significa que aparecerá el aviso de UAC y deberá ser reconocido por el usuario: si esto no es deseable (por ejemplo, porque sucedería en medio de un proceso largo), deberá ejecutar todo el proceso de host con permisos elevados mediante Crear e incrustar un manifiesto de aplicación (UAC) para requerir el nivel de ejecución 'más alto disponible': esto hará que aparezca la solicitud de UAC tan pronto como se inicie su aplicación, y hará que todos los procesos secundarios se ejecuten con permisos elevados sin indicaciones adicionales .
Editar: veo que acaba de editar su pregunta para indicar que "runas" no funcionó para usted. Eso es realmente extraño, como debería (y lo hace para mí en varias aplicaciones de producción). Sin embargo, exigir que el proceso padre se ejecute con derechos elevados al incrustar el manifiesto definitivamente debería funcionar.
fuente
startInfo.ShellExecute=true
para que funcione ... tampoco he podido hacer que este método funcione con archivos ejecutables que están en un recurso compartido de red (tengo que copiarlos en el directorio temporal local antes de ejecutar). ..Este código reúne todo lo anterior y reinicia la aplicación wpf actual con privilegios de administrador:
Actualización: se prefiere la forma de manifiesto de la aplicación:
Haga clic con el botón derecho en el proyecto en Visual Studio, agregue el nuevo archivo de manifiesto de la aplicación, cambie el archivo para que tenga que configurar el Administrador como se muestra en la figura anterior.
Un problema con la forma original: si coloca el código de reinicio en app.xaml.cs OnStartup, aún puede iniciar la ventana principal brevemente aunque se haya llamado a Apagar. Mi ventana principal explotó si app.xaml.cs init no se ejecutó y en ciertas condiciones de carrera lo haría.
fuente
string[] args
al proceso reaparecido.Según el artículo Chris Corio: Enseñe a sus aplicaciones a jugar bien con el control de cuentas de usuario de Windows Vista, MSDN Magazine, enero de 2007 , solo
ShellExecute
verifica el manifiesto incrustado y solicita al usuario la elevación si es necesario, mientras queCreateProcess
otras API no lo hacen. Espero eso ayude.Ver también: mismo artículo que .chm .
fuente
Esto lo hará sin UAC, no es necesario comenzar un nuevo proceso. Si el usuario en ejecución es miembro del grupo de administración como en mi caso.
fuente
Debe usar la suplantación para elevar el estado.
No olvides deshacer el contexto suplantado cuando hayas terminado.
fuente