JASoft.org

El blog de José Manuel Alarcón Aguín. Programación web y mucho más...

MENÚ - JASoft: JM Alarcón

Ejecución de procesos con suplantación de usuarios en .NET 2.0

En la plataforma .NET no había hasta ahora una forma sencilla de ejecutar desde nuestros programas otros procesos u aplicaciones utilizando las credenciales de otros usuarios. Esto puede ser útil si hacemos, por ejemplo, un programa que periódicamente lance unas determinadas tareas de administración o deba conectarse a una base de datos suplantando a un usuario concreto para realizar ciertas actualizaciones de datos.

la única forma de conseguir esto en las versiones 1.0 y 1.1 de .NET consiste en recurrir a la API de Windows a través de código no manejado (P/Invoke). Sin embargo en la versión 2.0 de la plataforma, la clase Process incluye tres nuevas propiedades que, con solo ajustarlas, permiten suplantar a cualquier usuario válido a la hora de lanzar un proceso.

Dos de ellas son Domain y UserName. Tal y como se puede suponer sirven simplemente para indicar el dominio al que pertenece el usuario que queremos suplantar y el login de éste.

la tercera propiedad es Password. Esta sirve, en efecto, para asignar la clave del usuario. Sin embargo su uso no es tan directo como asignarle una cadena de texto ya que, en este caso, la propiedad es de tipo SecureString.

SecureString es una nueva clase disponible también en .NET 2.0 que como su propio nombre evidencia se utiliza para almacenar de manera segura claves en memoria, para lo cual usa la DPAPI. Se puede crear un SafeString pasándole como parámetros en el constructor una referencia a una matriz de caracteres y la longitud de ésta. También tiene otros métodos para añadir letras al final, quitarles, etc...

Por último para que el truco funcione hay que evitar que el proceso se incie usando la función de Windows ShellExecute. Esto se consigue estableciendo la propiedad UseShellExecute a False.

En el Blog .NET Security de Shawn se puede encontrar un ejemplo concreto del uso de SecureString y de cómo iniciar un proceso que suplante a un usuario con estas nuevas propiedades de la clase Process.

José Manuel Alarcón
Banner

Agregar comentario