Una vez que mi programa está instalado en una máquina cliente, ¿cómo forzo a mi programa a ejecutarse como administrador en Windows 7?
Una vez que mi programa está instalado en una máquina cliente, ¿cómo forzo a mi programa a ejecutarse como administrador en Windows 7?
Respuestas:
Querrá modificar el manifiesto que se incrusta en el programa. Esto funciona en Visual Studio 2008 y versiones posteriores: Proyecto + Agregar nuevo elemento, seleccione "Archivo de manifiesto de la aplicación". Cambia el <requestedExecutionLevel>
elemento a:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
El usuario recibe el aviso de UAC cuando inicia el programa. Use sabiamente; Su paciencia puede agotarse rápidamente.
Agregar un requestedExecutionLevel
elemento a tu manifiesto es solo la mitad de la batalla; debes recordar que UAC se puede apagar. Si es así, debe realizar la verificación a la manera de la vieja escuela y colocar un cuadro de diálogo de error si el usuario no es administrador
(llame IsInRole(WindowsBuiltInRole.Administrator)
a su hilo CurrentPrincipal
).
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
así
IsInRole
habla Anders.
Los pasos detallados son los siguientes.
Tenga en cuenta que con este código debe desactivar la configuración de seguridad de ClickOnce, para ello, vaya a Propiedades -> Seguridad -> Seguridad de ClickOnce
New Item...
no es una opción en mi proyecto de Servicio de instalación. ¿Cómo haría para agregar el manifiesto de la aplicación? Puedo agregarlo a mi proyecto principal pero no es su instalador.
Implementé un código para hacerlo manualmente:
using System.Security.Principal;
public bool IsUserAdministrator()
{
bool isAdmin;
try
{
WindowsIdentity user = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(user);
isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
}
catch (UnauthorizedAccessException ex)
{
isAdmin = false;
}
catch (Exception ex)
{
isAdmin = false;
}
return isAdmin;
}
Puede incrustar un archivo de manifiesto en el archivo EXE, lo que hará que Windows (7 o superior) siempre ejecute el programa como administrador.
Puede encontrar más detalles en el Paso 6: Crear e incrustar un manifiesto de aplicación (UAC) (MSDN).
Mientras trabaja en Visual Studio 2008, haga clic derecho Project -> Add New Item
y luego elija Application Manifest File
.
En el archivo de manifiesto, encontrará la etiqueta requestedExecutionLevel
y puede establecer el nivel en tres valores:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
O
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
O
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
Para configurar su aplicación para que se ejecute como administrador, debe elegir la del medio.
Según
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
querrá agregar un manifiesto de aplicación si aún no tiene uno o no sabe cómo agregar uno. Como algunos proyectos no agregan automáticamente un archivo de manifiesto por separado, primero vaya a las propiedades del proyecto, vaya a la pestaña Aplicación y verifique que su proyecto no excluya el manifiesto en la parte inferior del grifo.
En Visual Studio 2010, haga clic derecho en el nombre de su proyecto. Presione "Ver configuración de Windows", esto genera y abre un archivo llamado "app.manifest". Dentro de este archivo, reemplace "asInvoker" con "requireAdministrator" como se explica en las secciones comentadas dentro del archivo.
Otra forma de hacerlo, solo en código, es detectar si el proceso se está ejecutando como administrador, como en la respuesta de @NG.. Y luego abra la aplicación nuevamente y cierre la actual.
Uso este código cuando una aplicación solo necesita privilegios de administrador cuando se ejecuta bajo ciertas condiciones, como cuando se instala como un servicio. Por lo tanto, no es necesario que se ejecute como administrador todo el tiempo, ya que las otras respuestas también lo fuerzan.
Nota en el siguiente código NeedsToRunAsAdmin
es un método que detecta si bajo las condiciones actuales se requieren privilegios de administrador. Si esto devuelve false
el código no se elevará solo. Esta es una gran ventaja de este enfoque sobre los demás.
Aunque este código tiene las ventajas indicadas anteriormente, debe reiniciarse como un nuevo proceso que no siempre es lo que desea.
private static void Main(string[] args)
{
if (NeedsToRunAsAdmin() && !IsRunAsAdmin())
{
ProcessStartInfo proc = new ProcessStartInfo();
proc.UseShellExecute = true;
proc.WorkingDirectory = Environment.CurrentDirectory;
proc.FileName = Assembly.GetEntryAssembly().CodeBase;
foreach (string arg in args)
{
proc.Arguments += String.Format("\"{0}\" ", arg);
}
proc.Verb = "runas";
try
{
Process.Start(proc);
}
catch
{
Console.WriteLine("This application requires elevated credentials in order to operate correctly!");
}
}
else
{
//Normal program logic...
}
}
private static bool IsRunAsAdmin()
{
WindowsIdentity id = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(id);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
runas
como administrador de un usuario que no sea administrador, de lo contrario, se abrirá en silencio con los permisos de usuario actuales (marcado en Windows 7 de 64 bits). Por lo que puedo decir, lo único que puede hacer con UAC deshabilitado y falta el derecho de administrador es detener la ejecución en el momento adecuado.
Puede crear el manifiesto utilizando la Configuración de seguridad de ClickOnce y luego deshabilitarlo:
Right click on the Project -> Properties -> Security -> Enable ClickOnce Security Settings
Después de hacer clic en él, se creará un archivo en la carpeta de propiedades del proyecto llamado app.manifest una vez que se haya creado, puede desmarcarEnable ClickOnce Security Settings
opción
Abra ese archivo y cambie esta línea:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
a:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
Esto hará que el programa requiera privilegios de administrador.
Esta es una versión simplificada de la respuesta this , anterior por @NG
public bool IsUserAdministrator()
{
try
{
WindowsIdentity user = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(user);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
catch
{
return false;
}
}
Haga clic derecho en su ejecutable, vaya a Propiedades> Compatibilidad y marque la casilla 'Ejecutar este programa como administrador'.
Si desea ejecutarlo como administrador para todos los usuarios, haga lo mismo en 'cambiar la configuración para todos los usuarios'.