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.

💪🏻 ┬┐Este post te ha ayudado?, ┬┐has aprendido algo nuevo?
Pues NO te pido que me invites a un caf├ę... Te pido algo m├ís f├ícil y mucho mejor

Escrito por un humano, no por una IA