Lanciare un comando da remoto su ogni PC acceso in un dominio

remote command

Volete lanciare un comando remoto su ogni PC collegato al dominio mentre gli utenti sono connessi? Ad esempio volete inviare un messaggio alla console di ognuno o aggiornare le policies?

Powershell ci da una mano.

Ecco come fare:
Anzitutto è necessario scaricare dal sito di Microsoft il tool PSEXEC presente all’interno dei PsTools.
PsExec consente di lanciare un comando su un PC connesso alla rete senza che l’utente connesso alla console se ne renda conto. Una funzionalità veramente eccezionale di cui non possiamo che ringraziare il grande Mark Russinovich.
Dopo aver scaricato i PsTools vi consiglio di copiare il file psexec.exe nella cartella %windir%\system32.
Una volta che avremo a disposizione questo tool bisognerà capire quali PC sono collegati al nostro server; per questo useremo il comando net session.
Questo comando restituisce l’indirizzo IP di ogni PC connesso al nostro server. Il risultato del comando si presenta così:

C:\Users\Administrator>net session

Computer            Nome utente   Tipo client  In pausa da
------------------------------------------------------------------
\\192.168.143.35    utente1                    1 00.08.45
\\192.168.143.41    utente23                   4 00.01.22
\\192.168.143.42    utente12                   3 00.01.54
\\192.168.143.43    utente16                   6 01.46.35
\\192.168.143.44    utente43                   3 00.00.01
\\192.168.143.46    utente3                   63 00.00.03

Questo ci servirà a comprendere bene il comando che utilizzeremo in Powershell.
Esso infatti acquisisce tutti gli IP dal comando net session e li riutilizza per lanciare un comando dal prompt dei comandi in remoto.
Ecco il piccolo script da lanciare in powershell:

net session | ?{$_ -match '^\\\\\S*' }|% {$_.split(' ')[0]}| ForEach-Object -Process {psexec $_ cmd /c COMANDO}

Di seguito alcuni esempi pratici:

Aggiornare le group policies su tutti i PC:

net session | ?{$_ -match '^\\\\\S*' }|% {$_.split(' ')[0]}| ForEach-Object -Process {psexec $_ cmd /c echo n ^|gpupdate /force}

Inviare un messaggio alla console di tutti i PC connessi:

net session | ?{$_ -match '^\\\\\S*' }|% {$_.split(' ')[0]}| ForEach-Object -Process {psexec $_ cmd /c msg * Riavviare i PC}

Creare una determinata cartella in ogni PC connesso:

net session | ?{$_ -match '^\\\\\S*' }|% {$_.split(' ')[0]}| ForEach-Object -Process {psexec $_ cmd /c mkdir c:\PIPPO}
Annunci

Inviare i messaggi sulla rete con il comando msg

Find username

Vi ricordate il comando net send che inviava piccoli messaggi sulla rete?

Ora c’è il comando msg ma come funziona?

Quando si aveva l’esigenza di mandare un messaggio sullo schermo di un computer, senza interazione, per avvisare gli utenti di un particolare evento o per comunicazioni straordinarie, esisteva, fino alle versioni XP e 2003, il comando net send.
Da Windows Vista in poi il comando è stato sostituito da msg.exe, eseguibile che non ha trovato tanti fan nel mondo informatico, vista la difficoltà nell’uso pratico.

In realtà un modo semplice per usarlo c’è ed è questo:

%windir%\system32\msg.exe * /server:NOMEPC /v "Messaggio di prova"

Se avete l’esigenza di inviare un messaggio di broadcast a tutti i PC create un file TXT contenente in ogni riga il nome di un PC e…

@echo off
Set "listComputers=c:\percorso\ListaComputersDominio.txt"
Set Message="Messaggio da Vincenzo: Riavvio del server in corso. Mi scuso anticipatamente per il disagio."
For /f "delims=" %%* in ('type "%listComputers%"') Do (
    echo.Invio messaggio al computer %%*
    %windir%\system32\msg.exe * /server:%%* /v %Message%
    echo.
)
echo.Fatto.
echo.Premi invio per chiudere.
pause>nul