es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo ejecuto un comando de cmd sin derechos de administrador desde una aplicación elevada?

Tengo una aplicación que lee/escribe algunos archivos de C: y necesita elevación.

También tengo que ejecutar una aplicación que debe ejecutarse sin derechos de administrador (para leer una unidad de red asignada).

He intentado suplantar al usuario, pero pedirá nuevamente la contraseña del usuario (lo cual no es un gran problema, pero sería mejor si no lo hiciera). Si ejecuto esta aplicación con derechos de administrador, no puede ver la unidad asignada (creada por el usuario, no el administrador).

¿Cómo es posible ejecutar esta aplicación sin derechos de administrador desde esta aplicación elevada?

Gracias de antemano,

BR

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Hay algunas diferentes enfoques que podría considerar para este escenario, dependiendo de sus requisitos y limitaciones específicas. Aquí hay un par de ideas:

    1. Utilice un proceso separado para la aplicación no elevada

    Una opción sería lanzar un proceso separado para la aplicación que necesita acceder a la unidad de red mapeada, en lugar de intentar ejecutarla directamente desde la aplicación elevada. Este proceso separado podría ser lanzado utilizando las credenciales del usuario (sin requerirles que vuelvan a ingresar su contraseña) y tendría acceso a la unidad de red mapeada ya que fue creada por el usuario.

    Para implementar este enfoque, podría utilizar la clase System.Diagnostics.Process en C# para lanzar el proceso secundario. Especificaría la aplicación a ejecutar, junto con los argumentos de línea de comandos necesarios, y configuraría las propiedades StartInfo.UserName y StartInfo.Password con los valores apropiados para ejecutar el proceso como el usuario.

    Aquí hay un ejemplo aproximado de cómo podría verse eso:

    var psi = new ProcessStartInfo
    {
        FileName = "secondaryApp.exe",
        Arguments = "/arg1=value1 /arg2=value2",
        WorkingDirectory = @"C:\ruta\al\directorio\de\la\aplicación",
        UserName = "usuario",
        Password = new System.Security.SecureString(),
    };
    
    foreach (char c in "contraseña")
    {
        psi.Password.AppendChar(c);
    }
    
    Process.Start(psi);
    

    Tenga en cuenta que necesitará tener cuidado de manejar cualquier error que pueda ocurrir al lanzar el proceso secundario y asegurarse de desechar correctamente el objeto Process cuando haya terminado con él.

    1. Conceda permisos a la aplicación elevada en la unidad de red mapeada

    Otra opción sería conceder a la aplicación elevada los permisos necesarios para acceder directamente a la unidad de red mapeada, en lugar de depender de la aplicación no elevada para hacerlo. Esto implicaría cambiar la configuración de seguridad en la unidad de red para permitir el acceso al usuario o grupo desde el cual se está ejecutando la aplicación elevada.

    Para implementar este enfoque, podría utilizar las herramientas de seguridad integradas de Windows para ajustar los permisos en la unidad de red mapeada. Podría hacerlo manualmente (haciendo clic derecho en la unidad en el Explorador de Windows, seleccionando Propiedades y yendo a la pestaña de Seguridad) o de forma programática (utilizando las clases del espacio de nombres System.Security.AccessControl en C#).

    Aquí hay un ejemplo de cómo podría usar código en C# para conceder permisos a la aplicación elevada:

    using System.Security.AccessControl;
    
    var mapeo = new System.IO.DriveInfo("Z:");
    var seguridad = mapeo.GetAccessControl();
    var regla = new FileSystemAccessRule(
        "dominio\\nombredeusuario",
        FileSystemRights.ReadAndExecute,
        InheritanceFlags.None,
        PropagationFlags.NoPropagateInherit,
        AccessControlType.Allow);
    seguridad.AddAccessRule(regla);
    mapeo.SetAccessControl(seguridad);
    

    En este ejemplo, se asume que la unidad “Z:” es la unidad de red mapeada a la que desea conceder acceso. El código agrega una nueva FileSystemAccessRule al descriptor de seguridad de la unidad, permitiendo al usuario especificado leer y ejecutar archivos en ella. Tenga en cuenta que deberá reemplazar “dominio” y “nombredeusuario” con los valores correctos según su entorno.

    Ambos enfoques tienen sus propias ventajas y desventajas, y pueden ser más o menos adecuados dependiendo de sus circunstancias específicas. Es importante probar exhaustivamente cualquier cambio que realice para asegurarse de que no cause consecuencias no deseadas o vulnerabilidades de seguridad.

Comments are closed.