c# - usuario - ¿Cómo fuerzo la ejecución de mi aplicación.NET como administrador?
properties.settings c# (12)
Agregar un elemento requestedExecutionLevel
a tu manifiesto es solo la mitad de la batalla; UAC que recordar que UAC puede ser desactivado. Si es así, debe realizar la comprobación a la antigua usanza y colocar un cuadro de diálogo de error si el usuario no es administrador.
(llame a IsInRole(WindowsBuiltInRole.Administrator)
en el CurrentPrincipal
su hilo).
Una vez que mi programa está instalado en una máquina cliente, ¿cómo puedo forzar mi programa para que se ejecute como administrador en Windows 7?
En Visual Studio 2010, haga clic derecho en el nombre de su proyecto. Haga clic en "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.
Esta es la versión simplificada de esta answer
public bool IsUserAdministrator()
{
try
{
WindowsIdentity user = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(user);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
catch (Exception)
{
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 configuración para todos los usuarios''.
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;
}
Los pasos detallados son los siguientes.
- Agregar archivo de manifiesto de aplicación a la solución
- Cambiar la configuración de la aplicación a "app.manifest"
- Actualizar la etiqueta de "requiredExecutionLevel" para requireAdministrator.
Tenga en cuenta que, al utilizar este código, debe desactivar la configuración de seguridad de ClickOnce. Para ello, vaya a Propiedades -> Seguridad -> Seguridad de ClickOnce
Mientras trabaja en Visual Studio 2008, haga clic con el botón derecho en 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 central.
Otra forma de hacer esto, 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 de nuevo y cierre la actual.
Utilizo este código cuando una aplicación solo necesita privilegios de administrador cuando se ejecuta bajo ciertas condiciones, como cuando se instala a sí misma como un servicio. Por lo tanto, no es necesario que se ejecute como administrador todo el tiempo, como las otras respuestas lo forzan también.
Tenga en cuenta que en el siguiente código NeedsToRunAsAdmin
es un método que detecta si, en las condiciones actuales, se requieren privilegios de administrador. Si esto devuelve false
el código no se elevará. Esta es una gran ventaja de este enfoque sobre los demás.
Si bien este código tiene las ventajas mencionadas anteriormente, necesita relanzarse como un nuevo proceso que no siempre es lo que usted 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);
}
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 llamada app.manifest una vez que se haya creado, puede desactivar la opción Enable ClickOnce Security Settings
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.
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).
Según
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
deseará 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, navegue a la pestaña Aplicación y verifique que su proyecto no excluya el manifiesto en la parte inferior del grifo.
- A continuación, haga clic derecho en el proyecto
- Agregar ítem nuevo
- Por último, busque y haga clic en el archivo de manifiesto de aplicación
Querrá modificar el manifiesto que se incrusta en el programa. Esto funciona en Visual Studio 2008 y superior: Proyecto + Agregar nuevo elemento, seleccione "Archivo de manifiesto de aplicación". Cambie el elemento <requestedExecutionLevel>
a:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
El usuario obtiene el indicador de UAC cuando inicia el programa. Use sabiamente Su paciencia puede agotarse rápidamente.