Si hubiera una utilidad de línea de comandos que pudiera competir con robocopy en términos de utilidad, sería PsExec. La utilidad Sysinternals PsExec es tan ubicua como vienen en el arsenal de un administrador de IT. Esta herramienta permite a los administradores ejecutar comandos de forma remota como si estuvieran en la computadora local.
Para cubrir la herramienta PsExec en profundidad, era apropiado cubrir esta herramienta codiciada en una Guía Definitiva de ATA. En esta guía, aprenderás qué es psexec, qué es capaz de hacer y muchos ejemplos de cómo usar esta útil herramienta.
¿Qué es PsExec.exe?
Si eres nuevo en IT o tal vez no has tenido la necesidad de ejecutar comandos y herramientas en computadoras remotas, es posible que no sepas qué es psexec.
PsExec o psexec.exe es una utilidad de línea de comandos construida para Windows. Permite a los administradores ejecutar programas en computadoras locales y, más comúnmente, remotas. Es una utilidad gratuita que forma parte de la suite de herramientas Sysinternals pstools construida por Mark Russinovich hace muchos años.
Fue construida para reemplazar herramientas como telnet que te obligaban a abrir puertos e introducir vulnerabilidades de seguridad. Hoy en día, tenemos otras opciones como PowerShell Remoting y el cmdlet PowerShell Invoke-Command
pero PsExec todavía tiene su lugar.
PsExec permite la plena interactividad para aplicaciones de consola sin necesidad de instalar ningún software. Como verás a través de esta Guía Definitiva, PsExec puede lanzar símbolos del sistema interactivos, ejecutarse como sistema local en computadoras remotas, ejecutar comandos en múltiples computadoras a la vez y más.
Es compatible con todas las versiones de Windows desde Windows XP. Eso significa que sí, PsExec en Windows 10 también es posible. Es una herramienta simple de ejecutar que funciona en casi todo, ¡pero no confundas su simplicidad con sus capacidades!
Prerrequisitos
Simplemente necesitas estar ejecutando un sistema operativo Windows moderno para que PsExec funcione en tu computadora local. Sin embargo, querrás ejecutar psexec en computadoras remotas. Para hacerlo, deberás asegurarte de que algunos elementos estén en su lugar.
Si no tienes estos elementos en su lugar ahora o no estás seguro, no te preocupes. En la siguiente sección, cubriremos cómo escribir un script de PowerShell para probar tus computadoras remotas.
- A modern Windows computer (local)
- Compartir archivos e impresoras abierto (computadora remota, puerto TCP 445)
- El administrador$ compartido administrativo disponible (computadora remota)
- Conocer las credenciales de una cuenta local (computadora remota)
Hasta la fecha de esta escritura, PsExec se encuentra en la versión 2.2 y será la versión sobre la que aprenderás en este artículo.
Instalación de PSexec (Con configuración de computadora remota)
Técnicamente, no necesitas instalar PsExec ya que es solo una utilidad de línea de comandos, pero es bastante cercano. Como no es necesario instalarlo, simplemente necesitas descargarlo y extraerlo del archivo zip de PsTools. PsExec no está disponible como una utilidad independiente y es parte del conjunto de herramientas de PsTools.
Descargando PSExec
Puedes extraer el archivo ZIP manualmente o aquí tienes un útil fragmento de PowerShell para descargar y extraer PsExec desde su archivo ZIP de pstools. Ten en cuenta que esto elimina todas las demás herramientas de PsTools. Muchas aún son útiles, pero no las cubriremos en este artículo.
Configuración del Equipo Remoto
Una vez que tengas PsExec descargado, entonces necesitarás asegurarte de que cualquier equipo remoto en el que vayas a ejecutarlo esté abierto. PsExec tiene requisitos simples; compartir archivos e impresoras habilitado y el recurso administrativo admin$ disponible.
Puedes ir a todos los equipos remotos, abrir el applet del Firewall de Windows, ir a Aplicaciones Permitidas y habilitar Compartir Archivos e Impresoras en todos los equipos como se muestra a continuación.
Ten en cuenta que Compartir Archivos e Impresoras es un riesgo de seguridad conocido, así que asegúrate de que solo el perfil de firewall Privado esté habilitado.

O podrías visitar cada equipo y ejecutar la utilidad netsh para abrirlo mediante:
O podrías usar el cmdlet Set-NetFirewallRule
de PowerShell para hacerlo.
Si prefieres no visitar cada computadora, tienes el PowerShell Remoting disponible y estás en un dominio de Active Directory, también podrías abrir el firewall en muchas computadoras a la vez usando el cmdlet Invoke-Command
.
Usando PsExec
Antes de correr, necesitas caminar. ¡Si nunca has usado PsExec antes, te espera una sorpresa! Asegúrate de leer esta sección primero para mojarte los pies y aprender los conceptos básicos antes de sumergirte más adelante en este artículo.
La primera vez que ejecutes PsExec en un nuevo sistema, verás inmediatamente el acuerdo de licencia de PsExec. Tendrás que hacer clic en el botón Aceptar para comenzar a usarlo.

Si deseas evitar que se muestre el acuerdo de licencia, puedes aceptarlo silenciosamente usando el switch /accepteula
como se muestra a continuación.
Aprenderás algunos trucos para silenciar esta ventana emergente de EULA en computadoras locales y remotas más adelante en el artículo.
Encontrar Ayuda
Cuando explores PsExec, no deberías usar ningún switch en absoluto. Cuando simplemente ejecutes psexec sin switches, devolverá todas las opciones y una breve explicación de qué hace cada una. Todas las opciones están en la tabla a continuación para tu conveniencia.
Switch | Explanation |
---|---|
-a | Separate processors on which the application can run with commas where 1 is the lowest numbered CPU. For example, to run the application on CPU 2 and CPU 4, enter: “-a 2,4” |
-c | Copy the specified program to the remote system for execution. If you omit this option the application must be in the system path on the remote system. |
-d | Don’t wait for process to terminate (non-interactive). |
-e | Does not load the specified account’s profile. |
-f | Copy the specified program even if the file already exists on the remote system. |
-i | Run the program so that it interacts with the desktop of the specified session on the remote system. If no session is specified the process runs in the console session. Some have reported best results always using the -s switch with -i due to windows being unintelligible. |
-h | If the target system is Vista or higher, has the proc |
-l | Run process as limited user (strips the Administrators group and allows only privileges assigned to the Users group). On Windows Vista the process runs with Low Integrity. |
-n | Specifies timeout in seconds connecting to remote computers. |
-p | Specifies optional password for user name. If you omit this you will be prompted to enter a hidden password. |
-r | Specifies the name of the remote service to create or interact. with. |
-s | Run the remote process in the System account. |
-u | Specifies optional user name for login to computer. |
-v | Copy the specified file only if it has a higher version number or is newer on than the one on the remote system. |
-w | Set the working directory of the process (relative |
-x | Display the UI on the Winlogon secure desktop (local system only). |
-arm | Specifies the remote computer is of ARM architecture. |
-priority | Specifies -low, -belownormal, -abovenormal, -high or |
-realtime | run the process at a different priority. Use |
-background | run at low memory and I/O priority on Vista. |
computer | Direct PsExec to run the application on the computer or computers specified. If you omit the computer name PsExec runs the application on the local system, and if you specify a wildcard (\*), PsExec runs |
@file | PsExec will execute the command on each of the computers listed in the file. |
-accepteula | This flag suppresses the display of the license dialog. |
-nobanner | Do not display the startup banner and copyright message. |
Ejecutando un Comando Remoto Simple
En su forma más básica, PsExec requiere dos parámetros: un nombre de computadora y un comando para ejecutar. Si tiene un comando para ejecutar en la computadora remota que no requiere argumentos como hostname
, simplemente puede agregarlo después del nombre de la computadora.
Tenga en cuenta que si no especifica una ruta de archivo completa, el comando a ejecutar debe estar en la ruta de usuario o del sistema. Además, si tiene un programa con espacios en el nombre, siempre puede encerrar el programa entre comillas, como “mi aplicación.exe”.
A continuación, puede ver que para ejecutar el comando hostname
en la computadora CONTOSODC1, define su ruta UNC seguida del comando. PSExec luego se conectará de forma segura a la computadora remota, ejecutará el comando y devolverá la salida. En este caso, el comando hostname
devolvió el nombre de host de la computadora que es CONTOSODC1.
Si el comando no es cmd
u otra consola, PsExec saldrá rápidamente de la sesión remota y devolverá el código de salida que el proceso remoto devolvió.
Nota: El error o código de salida devuelto por psexec no proviene de PsExec en sí. En cambio, proviene del comando que psexec ejecutó en la computadora remota.

Cómo funciona PsExec en computadoras remotas
PsExec pasa por algunos pasos para ejecutar programas en computadoras remotas.
- Crear un archivo PSEXESVC.exe en C:\Windows.
- Crear y comenzar un servicio de Windows en la computadora remota llamado PsExec.
- Ejecutar el programa bajo un proceso principal de psexesvc.exe.
- Cuando se complete, el servicio de Windows PsExec se detendrá y eliminará.
Cuando el proceso no funciona al 100% correctamente, es posible que deba eliminar el servicio manualmente utilizando el comando sc.
Ejecutar un comando local simple
Aunque PsExec es conocido por ejecutar comandos en computadoras remotas, también puedes ejecutar comandos localmente.
Puedes ejecutar comandos localmente simplemente no proporcionando un nombre de computadora como se muestra a continuación.
¿Por qué harías esto? Una razón podría ser ejecutar comandos como la cuenta local SYSTEM. Puedes usar el interruptor -s
para ejecutar cualquier comando como SYSTEM local o remotamente, como aprenderás más adelante.
Echa un vistazo al breve video a continuación. Observa que simplemente necesitas proporcionar el interruptor -s
junto con el ejecutable del intérprete de comandos para que psexec lance una nueva sesión de comando como NT AUTHORITY\SYSTEM.

Comandos de PsExec (Volviéndose más avanzado)
Una vez que hayas dominado lo básico, puedes comenzar a aprender técnicas más avanzadas en psexec. PsExec puede hacer mucho más que simplemente ejecutar un solo comando en una sola computadora.
Ejecutar comandos en varias computadoras
PsExec no se limita a ejecutar comandos en una computadora remota a la vez. Esta herramienta también admite copiar programas y ejecutar comandos en varias computadoras a la vez.
Puedes ejecutar PsExec en varias computadoras de varias maneras.
Nombres de computadoras separados por comas
Normalmente, al ejecutar un comando en una sola computadora remota, especificarás un único nombre de computadora como \\REMOTECOMPUTER
. También puedes especificar múltiples computadoras separadas por comas como se muestra a continuación.
Todas las computadoras en un dominio de Active Directory
Si estás ejecutando PsExec en una computadora unida a un dominio de Active Directory y deseas ejecutar un comando en todas las computadoras de ese dominio, utiliza un comodín.
PsExec buscará en todo tu dominio de Active Directory e intentará ejecutar un comando en cada computadora. A continuación se muestra un ejemplo de sintaxis sobre cómo PsExec intentará conectarse a cada computadora en el dominio del que la computadora que está ejecutando es parte y ejecutar el comando hostname
.
Ten en cuenta que si usas un asterisco para encontrar todas las computadoras en un dominio mientras que la computadora local es parte de un grupo de trabajo, recibirás el error
Ha ocurrido un error del sistema: 6118
.
Usar un comodín obliga a PsExec a ejecutar esencialmente el comando net view /all
para primero encontrar todas las computadoras en el dominio. Esta es una forma desactualizada de encontrar información de computadora debido a su dependencia de NetBIOS.
Lectura desde un archivo
Otra forma en la que puedes ejecutar comandos en múltiples computadoras a la vez es mediante el uso de un archivo de texto. Usando la sintaxis @<filename.txt>
, PsExec leerá cada línea en el archivo de texto como si fuera un nombre de computadora. Luego procesará cada computadora individualmente.
A continuación, puedes ver un ejemplo de cómo usar PowerShell para crear un archivo de texto con nombres de computadoras delimitados por líneas y usar eso como entrada para psexec.
Copiando programas locales a la computadora remota
Usando el interruptor -c
, psexec copiará cualquier programa local al equipo remoto antes de la ejecución.
Tal vez tengas un archivo EXE en tu computadora local en una carpeta C:\Tools y quisieras ejecutarlo en un equipo remoto. Puedes hacerlo usando la siguiente sintaxis:
Cuando usas el interruptor -c
y no especificas un archivo ejecutable, PsExec aún copiará el archivo pero recibirás un error que dice no se puede encontrar el archivo especificado. Esto sucede porque PsExec siempre intentará ejecutar el archivo que copies.
Si necesitas copiar archivos a equipos remotos antes de usar PsExec, utiliza el cmdlet PowerShell Copy-Item
en su lugar.
Ejecución de Procesos Remotos con Credenciales Alternativas
Otro caso de uso popular de PsExec es ejecutar comandos con cuentas alternativas. Por defecto, PsExec intentará conectarse al equipo remoto bajo tu cuenta actualmente iniciada sesión. Más específicamente, impersonará tu cuenta en el equipo remoto.
Usando el interruptor -u
y opcionalmente -p
te permite conectarte al equipo remoto con una cuenta de usuario alternativa. PsExec luego encriptará tanto el nombre de usuario como la contraseña y los enviará al equipo remoto para la autenticación.
Por ejemplo, si estás en un grupo de trabajo, siempre necesitarás especificar el nombre de usuario para autenticarte en el equipo remoto.
Si ambos equipos son miembros de Active Directory, asegúrate de anteponer el nombre de dominio a la cuenta de usuario.
Ten en cuenta que cuando no uses el interruptor -u
, psexec se hace pasar por tu cuenta iniciada en la computadora remota. No tendrá acceso a ningún recurso de red.
Ejecutar procesos como la cuenta SISTEMA LOCAL
Una de las características más útiles de ejecutar PsExec bajo una cuenta alternativa es usar el interruptor -s
. Este interruptor permite que PsExec (y tu aplicación ejecutada de forma remota) se ejecute bajo la cuenta SISTEMA LOCAL de la computadora remota (o local).
Observa que a continuación no incluí un nombre de computadora remota. PsExec se ejecutará con gusto en la computadora local también. En este caso, estoy usando la opción -s
para indicarle a PsExec que inicie un símbolo del sistema local como la cuenta SISTEMA LOCAL.

Para ejecutar un símbolo del sistema como SISTEMA LOCAL en una computadora remota, agrega el nombre de la computadora a la referencia como se muestra a continuación:
Ejecutar aplicaciones GUI de forma remota
Otro interruptor útil de PsExec es -i
. Por defecto, PsExec no permite que el comando ejecutado de forma remota muestre ninguna ventana en la computadora remota. Esto es útil porque si estás ejecutando comandos de forma remota, de todos modos no verás la pantalla.
Pero quizás necesites mostrar programas a tus usuarios. Personalmente, no estarás usando la aplicación, pero un usuario final sí. En ese caso, utiliza el interruptor -i
.
Tal vez necesites abrir una ventana de bloc de notas en una computadora remota. No hay problema. Ejecuta notepad.exe con el interruptor -i
y PsExec abrirá el Bloc de notas.

Asegúrate también de usar el interruptor -d
para desconectar cuando se abra la ventana interactiva. De forma predeterminada, PsExec esperará a que el proceso que ejecutó se complete. Si el proceso remoto (como Notepad en este caso) sigue en ejecución, PsExec nunca devolverá el control.
Usar el interruptor -d
con -i
le indicará a PsExec que no espere a que termine el proceso remoto. En su lugar, se desconectará y devolverá el control tan pronto como se ejecute el proceso remoto.
Redireccionamiento de Salida
PsExec confiará en cualquier salida enviada desde el proceso remoto a tu sesión local. Típicamente, esta salida irá directamente a tu consola local. Pero si deseas redirigirla, puedes hacerlo usando los operadores de redireccionamiento típicos redirection operators.
Por ejemplo, si deseas ejecutar un comando y silenciar toda la salida, podrías redirigir la salida y los errores a nulo usando ^> nul ^2^&1
.
Nótese que los caracteres especiales están escapados con un sombrero (
^
).
Casos de Uso de PsExec
Una vez que hayas aprendido a usar PsExec, inevitablemente te encontrarás con varios casos de uso específicos. En esta sección, aprenderás algunos casos de uso del mundo real y ejemplos usando PsExec.
Ejecutar un Símbolo del Sistema Remoto (psexec cmd
)
Una de las situaciones más comunes es iniciar PsExec como un símbolo del sistema interactivo. PsExec no solo ejecuta comandos de forma remota, sino que también puede enviar la salida de los comandos de vuelta a tu consola. Debido a esto, puede funcionar como un excelente sustituto de telnet (si alguien todavía lo está usando) o tal vez de Enter-PSSession
en PowerShell.
Para lanzar un comando remoto, especifica el nombre de la computadora remota y ejecuta la aplicación cmd. Cmd es el intérprete de comandos de Windows. Dado que PsExec admite el uso interactivo, devolverá con gusto un cursor intermitente y un símbolo de sistema.

En este punto, el mundo está a tu disposición. Puedes ejecutar comandos en tu computadora local a través de este símbolo del sistema “anidado” y se ejecutarán en la computadora remota.
Para salir del símbolo del sistema, escribe exit
. PsExec detendrá el proceso cmd
en la computadora remota y devolverá el enfoque a la computadora local.
No uses Ctrl-C para salir de una sesión interactiva de cmd. Siempre utiliza
exit
. Si usas Ctrl-C, la sesión de psexec seguirá ejecutándose en la computadora remota.
Instalación de Software de Forma Remota
Puedes utilizar PsExec como una herramienta de implementación de software básica. Tal vez tengas un instalador MSI que necesitas ejecutar en una o más computadoras remotas llamado setup.msi. Este instalador debe copiarse a las computadoras remotas y luego ejecutarse con la utilidad msiexec.exe con algunos parámetros.
A continuación se muestra un ejemplo de cómo se podría utilizar PsExec para implementar software de forma remota. Este ejemplo copia setup.msi al equipo remoto y luego ejecuta el instalador MSI de forma interactiva en la cuenta SYSTEM.
Si no se utiliza el interruptor /accepteula
, se aceptará el CLUF automáticamente.
Como se mencionó anteriormente, la primera vez que se ejecuta PsExec, es necesario aceptar un CLUF. Se puede utilizar el interruptor /accepteula
, pero también se puede “preparar” en el registro.
Cuando se ejecuta por primera vez, PsExec crea una clave de registro en HKCU\Software\Sysinternals\PsExec. En lugar de esa clave de registro, se crea un valor de registro llamado EulaAccepted con un valor DWORD de 1.
Utilizando el método preferido para modificar el registro en equipos remotos, simplemente debes crear esta clave/valor en los equipos en los que deseas ejecutar PsExec. Una vez creada, ¡no es necesario ejecutar /accepteula
!
Combinando PowerShell y PsExec
Antes de PowerShell, solo teníamos PsExec. Ahora tenemos opciones. PowerShell puede reemplazar a PsExec en muchas situaciones, pero también complementarlo en otras.
Creación de nombres de equipos con PowerShell
En lugar de utilizar \\*
para buscar todos los equipos en el dominio, puedes utilizar PowerShell en su lugar. Al utilizar PowerShell, no solo puedes seleccionar ciertos equipos, sino que tampoco tienes que utilizar el comportamiento propenso a cortafuegos de net view /all
.
Puedes utilizar PowerShell para crear una cadena que contenga todos los nombres de equipos separados por comas. Luego puedes pasar esa cadena a PsExec, que procesará alegremente cada uno como si los hubieras ingresado manualmente.
A continuación puedes ver un ejemplo de uso del cmdlet Get-AdComputer
parte del módulo ActiveDirectory de PowerShell.
Habilitando la ejecución remota de PowerShell
Si tienes computadoras remotas con las que prefieras usar la ejecución remota de PowerShell en lugar de PsExec, puedes usar PsExec para habilitarlas.
Al ejecutar el cmdlet Enable-PSRemoting
o el archivo por lotes winrm.cmd en las computadoras remotas, puedes activar rápidamente la ejecución remota de PowerShell en muchas computadoras a la vez.
A continuación puedes ver un ejemplo de cómo llamar al archivo por lotes winrm.cmd en una computadora remota ejecutándolo con la cuenta SYSTEM. Dado que no se necesita la salida de ese comando, se silencia con 2>&1> $null
.
Mensajes de error de PsExec
Vale la pena mencionar nuevamente desde el principio que la mayoría de los códigos de error que ves devueltos por PsExec provienen del proceso remoto, no de PsExec. Sin embargo, es útil tener una comprensión de estos códigos de error y lo que podrían significar.
Si deseas una referencia de todos los códigos de error de Windows, te recomiendo que consultes esta exhaustiva lista de códigos de error de Windows.
A continuación se muestra una lista de códigos de error comunes que puedes ver devueltos por PsExec.
Error Code | Explanation |
---|---|
-2146232576 | Typically returned by Windows Update when an error occurs. |
0 | Command executed successfully |
1 | Incorrect function. A problem happened. That’s about it. |
1603 | Fatal error during installation. This typically is returned by msiexec. |
2 | The system cannot find the file specified |
4 | The system cannot open the file. |
5 | Access is denied. |
6 | The handle is invalid. |
6118 | The list of servers for this workgroup is not currently available |
Tu opinión
Guías Definitivas de ATA son grandes. Hay mucha información en ellas y es probable que se me escape algo aquí o allá o cometa un error. Si notas algo incorrecto o crees que debería agregarse algo a esta guía, por favor avísame a través de los comentarios. Estaré encantado de darte créditos en la publicación.
Créditos
- Gracias a Mathias (comentarios) por numerosos aportes.