Se ci fosse un’utilità da riga di comando che potesse competere con robocopy in termini di utilità, sarebbe PsExec. L’utilità Sysinternals PsExec è diffusa come un’arma essenziale nell’arsenale degli amministratori IT. Questo strumento consente agli amministratori di eseguire comandi in remoto come se fossero sul computer locale.
Per coprire in modo approfondito lo strumento PsExec, era appropriato includere questo ambito strumento nella Guida definitiva di ATA. In questa guida, imparerai cos’è psexec, cosa è in grado di fare e molti esempi su come utilizzare questo utile strumento.
Cos’è PsExec.exe?
Se sei nuovo nel campo dell’IT o forse non hai mai avuto la necessità di eseguire comandi e strumenti su computer remoti, potresti non sapere cos’è psexec.
PsExec o psexec.exe è un’utilità da riga di comando creata per Windows. Consente agli amministratori di eseguire programmi su computer locali e, più comunemente, su computer remoti. È un’utilità gratuita che fa parte della suite di strumenti Sysinternals pstools creata da Mark Russinovich molti anni fa.
È stata creata per sostituire strumenti come telnet che ti costringevano ad aprire porte e introdurre vulnerabilità di sicurezza. Oggi abbiamo altre opzioni come PowerShell Remoting e il cmdlet PowerShell Invoke-Command
, ma PsExec ha ancora il suo posto.
PsExec consente piena interattività per le applicazioni console senza dover installare alcun software. Come vedrai in questa Guida Definitiva, PsExec può avviare prompt dei comandi interattivi, eseguire come sistema locale su computer remoti, eseguire comandi su più computer contemporaneamente e altro ancora.
Supporta tutte le versioni di Windows da Windows XP in poi. Questo significa che sì, PsExec su Windows 10 è una realtà. È uno strumento semplice da eseguire che funziona su praticamente tutto, ma non confondere la sua semplicità con le sue capacità!
Prerequisiti
È sufficiente eseguire un sistema operativo Windows moderno affinché PsExec possa essere eseguito sul tuo computer locale. Tuttavia, vorrai eseguire psexec su computer remoti. Per farlo, assicurati che siano presenti alcune condizioni.
Se non hai già queste condizioni o non sei sicuro, non preoccuparti. Nella sezione successiva, vedremo come scrivere alcuni comandi PowerShell per testare i tuoi computer remoti.
- A modern Windows computer (local)
- Condivisione File e Stampante aperta (computer remoto, porta TCP 445)
- La condivisione amministrativa admin$ disponibile (computer remoto)
- Conosci le credenziali di un account locale (computer remoto)
Alla data di questa stesura, PsExec è alla versione 2.2 e sarà la versione di cui apprenderai in questo articolo.
Installazione di PSexec (Con configurazione del computer remoto)
Tecnicamente, non è necessario installare PsExec poiché è solo un’utilità da riga di comando, ma è abbastanza vicino. Poiché non è necessaria alcuna installazione, è sufficiente scaricarlo ed estrarlo dal file zip di PsTools. PsExec non è disponibile come utilità autonoma ed è parte della suite di strumenti PsTools.
Scaricamento di PSExec
Puoi estrarre manualmente il file ZIP oppure ecco un comodo snippet di PowerShell per scaricare ed estrarre PsExec dal suo file ZIP pstools. Nota che ciò rimuove tutti gli altri strumenti PsTools. Molti sono ancora utili, ma non li copriremo in questo articolo.
Configurazione del computer remoto
Una volta scaricato PsExec, sarà necessario assicurarsi che qualsiasi computer remoto su cui si intende eseguirlo sia aperto. PsExec ha requisiti semplici; File and Printer Sharing abilitato e la condivisione amministrativa admin$ disponibile.
Potresti visitare tutti i computer remoti, aprire il pannello di controllo del Firewall di Windows, andare a App consentite e abilitare File and Printer Sharing su tutti i computer come indicato di seguito.
Nota che File and Printer Sharing è un rischio per la sicurezza noto, quindi assicurati che sia abilitato solo il profilo firewall Privato.

In alternativa, potresti visitare ciascun computer ed eseguire l’utilità netsh per aprirlo tramite:
Oppure potresti usare il cmdlet Set-NetFirewallRule
di PowerShell per farlo.
Se preferisci non visitare ogni computer, hai a disposizione il comando PowerShell Remoting e sei in un dominio Active Directory, puoi anche aprire il firewall contemporaneamente su molti computer utilizzando il comando Invoke-Command
.
Utilizzando PsExec
Prima di poter eseguire, devi imparare. Se non hai mai utilizzato PsExec prima, sarai sorpreso! Assicurati di leggere questa sezione prima di immergerti completamente in questo articolo.
La prima volta che esegui PsExec su un nuovo sistema, vedrai immediatamente apparire l’accordo di licenza di PsExec. Dovrai fare clic sul pulsante Accetto per iniziare ad usarlo.

Se desideri evitare che l’accordo di licenza venga visualizzato, puoi accettarlo silenziosamente utilizzando l’opzione /accepteula
come mostrato di seguito.
In seguito nell’articolo imparerai alcuni trucchi per silenziare questa finestra di dialogo EULA su computer locali e remoti.
Trovare aiuto
Quando esplori PsExec, non dovresti utilizzare alcuna opzione. Quando esegui semplicemente psexec senza opzioni, verranno restituite tutte le opzioni e una breve spiegazione di ciascuna di esse. Di seguito sono elencate tutte le opzioni per tua comodità.
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. |
Esecuzione di un semplice comando remoto.
Al suo livello più basilare, PsExec richiede due parametri: un nome di computer e un comando da eseguire. Se hai un comando da eseguire sul computer remoto che non richiede argomenti come hostname
, puoi semplicemente aggiungerlo dopo il nome del computer.
Nota che se non specifici un percorso completo del file, il comando da eseguire deve trovarsi nel percorso utente o di sistema. Inoltre, se hai un programma con spazi nel nome, puoi sempre racchiudere il programma tra virgolette come “il mio programma.exe”.
Puoi vedere qui sotto che per eseguire il comando hostname
sul computer CONTOSODC1, definisci il suo percorso UNC seguito dal comando. PSExec si connetterà quindi al computer remoto in modo sicuro, eseguirà il comando e restituirà l’output. In questo caso, il comando hostname
ha restituito il nome host del computer che è CONTOSODC1.
Se il comando non è cmd
o un’altra console, PsExec uscirà rapidamente dalla sessione remota e restituirà il codice di uscita restituito dal processo remoto.
Nota: L’errore o il codice di uscita restituito da psexec non proviene da PsExec stesso. Invece, proviene dal comando eseguito da psexec sul computer remoto.

Come funziona PsExec sui computer remoti
PsExec passa attraverso alcuni passaggi per eseguire programmi sui computer remoti.
- Crea un file PSEXESVC.exe in C:\Windows.
- Crea e avvia un servizio Windows sul computer remoto chiamato PsExec.
- Esegui il programma sotto un processo principale di psexesvc.exe.
- Una volta completato, il servizio Windows di PsExec verrà interrotto e rimosso.
Quando il processo non funziona correttamente al 100%, potrebbe essere necessario rimuovere manualmente il servizio utilizzando il comando sc.
Eseguire un semplice comando locale
Anche se PsExec è principalmente noto per l’esecuzione di comandi su computer remoti, è possibile eseguire comandi anche a livello locale.
Puoi eseguire comandi a livello locale semplicemente non fornendo un nome computer come mostrato di seguito.
Perché dovresti farlo? Un motivo potrebbe essere quello di eseguire comandi come account SYSTEM locale. Puoi utilizzare l’interruttore -s
per eseguire qualsiasi comando come SYSTEM localmente o in remoto, come vedrai più avanti.
Dai un’occhiata al breve video qui sotto. Nota che devi semplicemente fornire l’interruttore -s
insieme all’eseguibile dell’interprete dei comandi per avviare una nuova sessione di comando come NT AUTHORITY\SYSTEM.

Comandi di PsExec (tecniche più avanzate)
Dopo aver appreso le basi, puoi iniziare a imparare tecniche più avanzate in psexec. PsExec può fare molto di più che eseguire un singolo comando su un singolo computer.
Eseguire comandi su più computer
PsExec non è limitato all’esecuzione di comandi su un solo computer remoto alla volta. Questo strumento supporta anche la copia di programmi ed esegue comandi su più computer contemporaneamente.
Puoi eseguire PsExec su più computer contemporaneamente in diversi modi.
Nomi computer separati da virgola
Di solito, quando si esegue un comando su un singolo computer remoto, si specifica un singolo nome computer come \\REMOTECOMPUTER
. Puoi anche specificare più computer separati da virgole come mostrato di seguito.
Tutti i computer in un dominio Active Directory
Se stai eseguendo PsExec su un computer associato a un dominio Active Directory e desideri eseguire un comando su tutti i computer in quel dominio, utilizza un carattere jolly.
PsExec cercherà in tutto il dominio Active Directory e cercherà di eseguire un comando su ogni computer. Di seguito è riportata la sintassi di esempio su come PsExec cercherà di connettersi a ogni computer nel dominio di appartenenza del computer in esecuzione e eseguire il comando hostname
.
Nota che se utilizzi un asterisco per trovare tutti i computer in un dominio mentre il computer locale fa parte di un gruppo di lavoro, riceverai l’errore
Si è verificato un errore di sistema: 6118
.
Utilizzare un carattere jolly forza PsExec a eseguire essenzialmente il comando net view /all
per trovare prima tutti i computer nel dominio. Questo è un modo obsoleto per trovare informazioni sui computer a causa della sua dipendenza da NetBIOS.
Lettura da un file
Un altro modo per eseguire comandi su più computer contemporaneamente è utilizzare un file di testo. Utilizzando la sintassi @<filename.txt>
, PsExec leggerà ogni riga nel file di testo come se fosse un nome computer. Elaborerà quindi ogni computer individualmente.
Di seguito puoi vedere un esempio di utilizzo di PowerShell per creare un file di testo di nomi di computer delimitati da righe e utilizzarlo come input per psexec.
Copiare programmi locali sul computer remoto
Utilizzando l’opzione -c
, psexec copierà qualsiasi programma locale al computer remoto prima dell’esecuzione.
Forse hai un file EXE sul tuo computer locale in una cartella C:\Strumenti e vorresti eseguirlo su un computer remoto. Puoi farlo utilizzando la seguente sintassi:
Quando utilizzi l’opzione -c
e non specifici un file eseguibile, PsExec copierà comunque il file ma riceverai un errore che indica impossibile trovare il file specificato. Questo accade perché PsExec cercherà sempre di eseguire il file che copi.
Se hai bisogno di copiare file su computer remoti prima di utilizzare PsExec, utilizza invece il cmdlet Copy-Item
di PowerShell.
Esecuzione di processi remoti con credenziali alternative
Un altro caso d’uso comune di PsExec è l’esecuzione di comandi con account alternativi. Per impostazione predefinita, PsExec cercherà di connettersi al computer remoto utilizzando l’account attualmente loggato. Più precisamente, impersonerà il tuo account sul computer remoto.
Utilizzando l’opzione -u
e l’opzionale -p
, puoi connetterti al computer remoto con un account utente alternativo. PsExec crittograferà quindi sia il nome utente che la password e li invierà al computer remoto per l’autenticazione.
Ad esempio, se ti trovi in un workgroup, dovrai sempre specificare il nome utente per autenticarti sul computer remoto.
Se entrambi i computer sono membri di Active Directory, assicurati di precedere il nome utente con il nome del dominio.
Nota che quando non utilizzi l’opzione -u
, psexec si impersona con il tuo account connesso al computer remoto. Non avrà accesso a nessuna risorsa di rete.
Esecuzione dei processi come account LOCAL SYSTEM
Una delle caratteristiche più utili nell’esecuzione di PsExec con un account alternativo è l’uso dell’opzione -s
. Questa opzione consente a PsExec (e all’applicazione eseguita a distanza) di funzionare con l’account LOCAL SYSTEM del computer remoto (o locale).
Nota che qui sotto non ho incluso un nome di computer remoto. PsExec si eseguirà volentieri anche sul computer locale. In questo caso, sto utilizzando l’opzione -s
per dire a PsExec di avviare un prompt dei comandi locale come account LOCAL SYSTEM.

Per eseguire un prompt dei comandi come LOCAL SYSTEM su un computer remoto, aggiungi il nome del computer al riferimento come segue:
Avvio di applicazioni GUI a distanza
Un’altra opzione utile di PsExec è -i
. Per impostazione predefinita, PsExec non consente al comando eseguito a distanza di aprire finestre sul computer remoto. Questo è utile perché se stai eseguendo comandi a distanza, non vedrai comunque lo schermo.
Ma forse hai bisogno di aprire programmi per i tuoi utenti. Personalmente, non userai l’applicazione ma un utente finale lo farà. In tal caso, utilizza l’opzione -i
.
Forse devi aprire una finestra Notepad su un computer remoto. Nessun problema. Esegui notepad.exe con l’opzione -i
e PsExec aprirà Notepad.

Assicurati di utilizzare anche l’interruttore -d
per disconnettersi quando viene visualizzata la finestra interattiva. Per impostazione predefinita, PsExec attende che il processo eseguito venga completato. Se il processo remoto (Notepad in questo caso) viene mantenuto in esecuzione, PsExec non restituirà mai il controllo.
Utilizzando l’interruttore -d
con -i
, PsExec non attende il completamento del processo remoto. Invece, si disconnette e restituisce il controllo non appena il processo remoto viene eseguito.
Reindirizzamento dell’output
PsExec inoltrerà qualsiasi output inviato dal processo remoto alla sessione locale. Tipicamente, questo output verrà indirizzato direttamente alla console locale. Ma se desideri reindirizzarlo, puoi farlo usando gli operatori di reindirizzamento tipici.
Ad esempio, se desideri eseguire un comando e silenziare tutto l’output, puoi reindirizzare output ed errori a null usando ^> nul ^2^&1
.
Nota che i caratteri speciali sono scappati con un cappello. (
^
).
Casi d’uso di PsExec
Una volta imparato come utilizzare PsExec, inevitabilmente ti imbatterai in vari casi d’uso specifici. In questa sezione, imparerai alcuni casi d’uso del mondo reale ed esempi che utilizzano PsExec.
Avvio di un prompt dei comandi remoto (psexec cmd
)
Uno dei casi d’uso più comuni è avviare PsExec come prompt dei comandi interattivo. PsExec non si limita a eseguire comandi a distanza. Può anche inviare l’output del comando alla tua console. Grazie a questo, può fungere da ottimo sostituto di telnet (se qualcuno lo sta ancora usando) o forse di PowerShell Enter-PSSession
.
Per avviare un comando remoto, specifica il nome del computer remoto ed esegui l’applicazione cmd. Cmd è l’interprete dei comandi di Windows. Poiché PsExec supporta l’uso interattivo, restituirà volentieri un cursore lampeggiante e un prompt.

A questo punto, il mondo è tuo. Puoi eseguire comandi sul tuo computer locale tramite questo prompt dei comandi “annidato” e saranno eseguiti sul computer remoto.
Per uscire dal prompt dei comandi, digita exit
. PsExec interromperà il processo cmd
sul computer remoto e riporterà l’attenzione al computer locale.
NON usare Ctrl-C per chiudere una sessione interattiva di cmd. Usa sempre
exit
. Se usi Ctrl-C, la sessione psexec rimarrà attiva sul computer remoto.
Installazione del software a distanza
Puoi utilizzare PsExec come uno strumento di distribuzione software “fai-da-te”. Forse hai un programma di installazione MSI che devi eseguire su uno o più computer remoti chiamato setup.msi. Questo programma di installazione deve essere copiato sui computer remoti e quindi eseguito con l’utilità msiexec.exe con alcune opzioni.
Ecco un esempio di come potresti utilizzare PsExec per distribuire software in remoto. Questo esempio copia setup.msi sul computer remoto e avvia l’installatore MSI interattivamente come account SYSTEM.
Accettando l’EULA senza l’interruttore /accepteula
Come già menzionato, la prima volta che PsExec viene eseguito, dovrai accettare un EULA. Puoi utilizzare l’interruttore /accepteula
, ma puoi anche “prepararlo” nel registro.
Quando viene lanciato per la prima volta, PsExec crea una chiave di registro in HKCU\Software\Sysinternals\PsExec. Invece di quella chiave di registro, crea un valore di registro chiamato EulaAccepted con un valore DWORD di 1.
Utilizzando il tuo metodo preferito per modificare il registro su computer remoti, devi semplicemente creare questa chiave/valore su computer su cui desideri eseguire PsExec. Una volta creato, non c’è bisogno di eseguire /accepteula
!
Unione di PowerShell e PsExec
Prima di PowerShell, avevamo solo PsExec. Ora abbiamo opzioni. PowerShell può sostituire PsExec in molte situazioni ma integrarlo in altre.
Costruzione di nomi computer con PowerShell
Invece di utilizzare \\*
per trovare tutti i computer nel dominio, puoi usare PowerShell. Utilizzando PowerShell, puoi non solo selezionare determinati computer, ma non è necessario utilizzare il comportamento sensibile al firewall di net view /all
.
Puoi utilizzare PowerShell per creare una stringa contenente tutti i nomi dei computer separati da una virgola. Puoi quindi passare quella stringa a PsExec, che elaborerà felicemente ciascuno come se avessi digitato manualmente ognuno di essi.
Puoi vedere di seguito un esempio dell’utilizzo del cmdlet Get-AdComputer
parte del modulo ActiveDirectory PowerShell.
Abilitare il PowerShell Remoting in remoto
Se hai computer remoti con cui preferisci utilizzare il PowerShell Remoting invece di PsExec, puoi usare PsExec per abilitarli.
Eseguendo il comando Enable-PSRemoting
o il file batch winrm.cmd sui computer remoti, puoi attivare rapidamente il PowerShell Remoting su molti computer contemporaneamente.
Di seguito puoi vedere un esempio di chiamata del file batch winrm.cmd su un computer remoto in esecuzione come account SYSTEM. Poiché l’output di quel comando non è necessario, viene silenziato con 2>&1> $null
.
Messaggi di errore PsExec
Vale la pena ripetere che nella maggior parte dei casi i codici di errore restituiti da PsExec provengono dal processo remoto, non da PsExec. Tuttavia, è utile avere una comprensione di questi codici di errore e di cosa potrebbero significare.
Se desideri un riferimento su tutti i codici di errore di Windows, ti consiglio di consultare questa lista esaustiva dei codici di errore di Windows.
Di seguito è riportato un elenco di codici di errore comuni che potresti vedere restituiti da 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 |
Tuo Feedback
Le Guide Ultimate ATA sono grandi. C’è molta informazione in queste e potrei mancare qualcosa o fare un errore. Se noti qualcosa di sbagliato o pensi che qualcosa debba essere aggiunto a questa guida, per favore fammelo sapere tramite i commenti. Sarei felice di darti credito nel post.
Crediti
- Grazie a Mathias (commenti) per numerosi feedback.