Desktop FilePanoramica su PsTools

Wes Miller

Scarica il codice per questo articolo: MillerTheDesktopFiles2007_03.exe (150KB)

Winternals Software è una società che stata acquisita da Microsoft nel 2006. La Winternals ha venduto il software commerciale, ma i fondatori dell'azienda, Mark Russinovich e Bryce Cogswell erano anche titolari di un'altra società, Sysinternals, che ha distribuito molti strumenti come freeware. Alcune di queste applicazioni freeware si sono

evolute fino a diventare componenti della Winternals Administrator's Pak. Mark e Bryce hanno anche concesso in licenza questi strumenti ad aziende che volevano utilizzarli al di fuori delle normali condizioni di licenza freeware.

Uno degli strumenti preferiti della Sysinternals, anzi un vero e proprio gruppo completo di strumenti, è quella che adesso è diventata la famiglia di prodotti PsTools, rintracciabile all'indirizzo microsoft.com/technet/sysinternals/utilities/pstools.mspx. Mark ha aggiunto il prefisso "ps" all'utilità di elenco dei processi UNIX. Come indicato nel sito per il download degli strumenti, sono disponibili utilità della riga di comando Windows® integrate che possono eseguire alcune delle stesse funzioni di questi strumenti. Tuttavia, oltre a importanti funzionalità uniche, la differenza principale consiste nel fatto che la famiglia di prodotti PsTools può essere utilizzata in modalità locale o remota (purché i sistemi remoti siano configurati correttamente). Ancora meglio, il processo di esecuzione remota è semplice quasi come l'esecuzione locale.

La famiglia di prodotti PsTools contiene diverse applicazioni singole elencate nella Figura 1. Come per le altre utilità Sysinternals, non esiste alcun programma di installazione, ma soltanto applicazioni. È sufficiente inserirle in una cartella sul percorso desiderato e procedere.

Figure 1 Utilità PsTools

Strumento Descrizione
PsExec Consente di eseguire processi in qualunque contesto utente.
PsFile Mostra i file aperti in remoto su un sistema.
PsGetSid Visualizza l'identificatore di protezione Windows (SID) di un computer o un utente.
PsInfo Elenca le informazioni su un sistema Windows.
PsKill Elimina i processi per nome o ID del processo.
PsList Elenca informazioni dettagliate sui processi in esecuzione.
PsLoggedOn Mostra tutti gli utenti registrati in locale come pure tutti gli utenti che condividono risorse remote.
PsLogList Esegue il dump dei record del Registro eventi di Windows.
PsPasswd Modifica le password di account utente.
PsService Visualizza e controlla i servizi Windows.
PsShutdown Arresta, riavvia, sospende, mette in stand-by un computer.
PsSuspend Sospende i processi in esecuzione.

Si noti che alcune di queste funzionalità (soprattutto PsLogList) possono essere realizzate anche tramite Strumentazione gestione Windows (WMI) e con alcuni script complessi. Ma la cosa importante della famiglia di prodotti PsTools è che ogni utilità è progettata per realizzare un'attività specifica e lo fa in modo semplice.

In seguito, verranno passati in rassegna i singoli strumenti, con semplici esempi che descrivono il motivo e la modalità con cui vengono utilizzati. Prima però, una breve introduzione per descrivere come funzionano gli strumenti e che tipo di prerequisiti sono necessari per poterli utilizzare.

Come funzionano gli strumenti?

Generalmente, gli strumenti funzionano tutto nello stesso modo. Sul sistema host viene avviato lo strumento PsTool desiderato. Sebbene molti strumenti possano essere eseguiti localmente, generalmente sono della massima utilità quando vengono eseguiti su un sistema remoto o su diversi sistemi contemporaneamente. PsExec è un'eccezione specifica, come si vedrà nell'esempio seguente. Mediante l'argomento della riga di comando, l'utilità viene copiata sulla risorsa amministrativa condivisa del sistema remoto, che è la stessa di %SystemRoot % (directory di Windows) sul sistema remoto.

Una volta copiata nella directory remota, l'applicazione si avvia e installa un servizio Windows. Questo servizio Windows esegue l'attività richiesta, utilizzando le credenziali fornite al momento dell'avvio. Se lo strumento specifico richiede una UI per l'utente finale sul sistema client, questo servizio avvia un ulteriore file binario nel contesto dell'utente. I servizi non possono avviare le UI interattive dirette. Il servizio comunica tutte le informazioni necessarie alla console che lo ha avviato e, infine, si disinstalla.

Come si può notare, gli strumenti sono potenti e indipendenti. Nonostante coinvolgano diversi file binari e processi multipli, l'utente non deve preoccuparsi, è sufficiente avviare semplicemente lo strumento desiderato.

Per poter utilizzare gli strumenti, sono necessari i seguenti prerequisiti: sistema operativo Windows NT®, Windows 2000, Windows XP o Windows Server ® 2003 (sono supportate le versioni x86 o x64 di Windows, ma non le versioni Itanium); deve essere abilitata la condivisione di rete amministrativa predefinita sul sistema remoto in cui sono in esecuzione gli strumenti (admin$); le porte per la condivisione di file e stampanti devono essere aperte sul sistema remoto (se si utilizza Windows Firewall, Internet Connection Firewall o un altro firewall).

PsExec

PsExec è uno degli strumenti che preferisco, ma probabilmente non per la ragione che ci si potrebbe aspettare. Per gran parte degli ultimi due anni, ho utilizzato il sistema accedendo come utente e non come Amministratore. Al suo posto, dispongo di uno script denominato run.vbs che utilizzo per eseguire le applicazioni come Amministratore locale (tali applicazioni potevano essere eseguite facilmente da qualsiasi utente). La Figura 2 illustra il contenuto dello script (disponibile anche sul sito TechNet Magazine all'indirizzo technetmagazine.com/code07.aspx). Lo script presuppone che gli strumenti PsTools si trovino nella variabile di sistema Path.

Figure 2 Run.vbs

SET WshShell = WScript.CreateObject("WScript.Shell")
SET WshSysEnv = WshShell.Environment("SYSTEM")
SET FSO = CreateObject("Scripting.FileSystemObject")
IF WScript.Arguments.Count <> 0 Then
    FOR EACH arg IN WScript.Arguments
        iArgCount = iArgCount + 1
        strCmdArg = (arg)
        strCmdArray = Split(strCmdArg, " ", 2, 1)
        IF iArgCount = 1 THEN
        strExe = strCmdArray(0)
        ELSEIF iArgCount = 2 THEN
        strRun = strCmdArray(0)
        ELSE
        strParams = strParams&" "&strCmdArray(0)
        END IF
    NEXT
END IF
'/t:0A && title ***** Admin ***** 
        strExt = LCase(Right(strExe, 3))

IF strExt <> "exe" AND strExt <> "bat" AND strExt <> "cmd" THEN
WshShell.Run "psexec.exe -d -i -e -u COMPUTERNAME\USER -p PASSWORD  cmd /c start "&strExe&"
    "&strRun&" "&strParams, 0, FALSE
ELSE
WshShell.Run "psexec.exe -d -i -e -u COMPUTERNAME\USER -p PASSWORD "&strExe&" "&strRun&"
    "&strParams, 0, FALSE
END IF

    SET WshShell = NOTHING
    SET WshSysEnv = NOTHING
    SET FSO = NOTHING

Questo semplice script è un esempio di utilizzo di PsExec con la funzionalità aggiunta da Mark durante l'elaborazione del prodotto Protection Manager in Winternals: la possibilità per un utente limitato di fornire credenziali privilegiate per avviare PsExec localmente. L'utilizzo più comune di PsExec consiste nell'esecuzione in modalità remota, ad esempio l'esecuzione di un'utilità che non fornisce un framework remoto, di script o di automazione. Tra le funzionalità principali di PsExec, la capacità di copiare sui sistemi remoti un file binario da eseguire, oltre alla capacità di stabilire l'affinità processori. Un'altra funzionalità utile di PsExec consiste nel codificarlo simultaneamente su molte macchine fornendo un file di script.

Di seguito una descrizione dell'uso semplificato di PsExec:

PsExec \\computer -u username -p password command

È possibile ampliare questa descrizione usando le opzioni illustrate nella Figura 3.

Figure 3 Opzioni PsExec

Opzione Descrizione
-a Specifica le affinità processori.
-c Indica se l'applicazione deve essere copiata sul sistema remoto.
-d Specifica di non aspettare il termine del processo prima di uscire (non attendere un messaggio di esito positivo o di errore).
-e Carica utilizzando il profilo dell'account specificato.
-f Copia l'applicazione anche se già esiste sul sistema remoto. Verifica che si sta eseguendo la versione corrente (o una specifica).
-i Esegue l'applicazione in modo interattivo sul sistema remoto (necessario se si desidera che un utente finale possa visualizzare un'interfaccia utente dall'applicazione).
-l Esegue l'applicazione come utente limitato. Rimuove il token del gruppo Administrators e riporta i privilegi del processo al livello adeguato per un membro del gruppo Utenti. Utile per eseguire applicazioni Internet a rischio elevato con privilegi minimi.
-n Specifica il timeout, ossia il tempo di attesa prima di un errore di connessione ai computer remoti.
-priority Esegue il processo con la priorità specificata. Ovvero specifica la modalità con cui Windows deve impostare la priorità del processo per un'attività specifica (-low, -belownormal, -abovenormal, -high o -realtime).
-s Esegue il processo utilizzando l'account di sistema (utile per eseguire Regedit per accedere alle chiavi del registro di sistema privilegiate).
-v Copia l'applicazione soltanto se è più nuova di quella preesistente.
-x Visualizza l'interfaccia utente sul desktop di protezione Winlogon; funziona solo sul sistema locale.
@file Esegue il comando su tutti i computer specificati nel file di testo.

PsFile

PsFile è uno strumento più preciso di PsExec. Viene utilizzato specificatamente per controllare quali file sono aperti e da chi, su un sistema remoto. È molto utile se si vuole tenere traccia dei file aperti prima di riavviare un server. Se si desidera scoprire quale utente ha bloccato il file, per evitarne la modifica o la cancellazione, è possibile indicarli manualmente o chiuderli tramite PsFile. Di seguito viene descritto l'utilizzo di PsFile:

PsFile \\computer -u username -p password 

Restituisce semplicemente un elenco di handle di file aperti nel sistema remoto. Oltre all'uso standard, è anche possibile aggiungere all'argomento un parametro ID, specificando il nome del file di cui si richiedono informazioni o che si desidera chiudere. È anche possibile aggiungere l'opzione -c che chiude il file identificato col parametro ID.

PsGetSid

Anche PsGetSid è uno strumento con scopi molto specifici. PsGetSid indica l'identificatore di protezione (SID) di un computer, un utente o un gruppo. Può essere utile se si desidera controllare che i sistemi nel dominio non abbiano ID di protezione duplicati o se si intende verificare semplicemente gli ID di protezione di tutti gli utenti o gruppi in un sistema. L'utilizzo di PsGetSid è il seguente:

PsGetSid \\computer -u username -p password account

Si noti che l'account può specificare un utente, un computer o un gruppo. Sebbene la sintassi di PSGetSid sia semplice, sono disponibili anche due parametri aggiuntivi. Il parametro SID specifica l'account (il gruppo o il computer) relativo a un SID specifico, mentre @file esegue il comando su tutti i computer elencati nel file di testo specificato.

PsInfo

PsInfo viene utilizzato per fornire informazioni di sistema dettagliate. Si tratta, ovviamente, dello strumento più utile quando viene utilizzato per sistemi multipli remoti dove l'output viene inviato a un file (un file Excel® e un file CSV più adatto per i database). Si noti che questa utilità agisce sfruttando un concetto importante che è diverso dalla maggior parte degli altri strumenti: Se non viene fornito il nome di un computer, PsInfo, per impostazione predefinita, tenta di eseguire delle query su tutti i computer nel dominio. Di seguito viene indicato l'utilizzo di PsInfo:

PsInfo  \\computer -u username -p password 

Sebbene la sintassi sia semplice, sono disponibili anche opzioni e parametri aggiuntivi illustrati nella Figura 4

Figure 4 Opzioni PsInfo

Opzione Descrizione
-h Visualizza tutti gli aggiornamenti Windows.
-s Visualizza tutte le applicazioni installate sul sistema.
-d Visualizza le informazioni sul disco o volume del sistema.
-c Genera il risultato in formato CSV.
-t Specifica un altro delimitatore per il file CSV diverso dal valore predefinito di \t.
Filtro Visualizza soltanto i dati che corrispondono a un determinato filtro.
@file Esegue il comando su tutti i computer elencati nel file di testo specificato.

PsKill

PsKill è un'utilità importante per interrompere i processi sia su un sistema locale che su un sistema remoto. L'uso è molto semplice e consente di eliminare rapidamente un processo con tutti relativi figli. L'utilizzo di PsKill è molto simile a quello degli altri strumenti descritti:

PsKill -t \\computer -u username -p password process id | process name

Si noti che è possibile specificare l'ID del processo o il nome del processo che si desidera terminare.

PsList

Chi utilizza abitualmente Process Explorer non sfrutterà molto PsList (per ulteriori informazioni vedere microsoft.com/technet/sysinternals/ProcessesAndThreads/ProcessExplorer.mspx). Ma poiché non esiste una versione remota di Process Explorer, PsList diventa un'alternativa molto simile per alcune delle funzionalità principali fornite da Process Explorer. PsList è di fatto un elenco in remoto di uno o più processi in esecuzione su un sistema remoto.

L'uso di PsList è semplice:

PsList \\computer -u username -p password account

Come con gli altri strumenti, il parametro di account può specificare un utente, un computer o un gruppo. I parametri aggiuntivi sono illustrati nella Figura 5.

Figure 5 Opzioni PsList

Opzione Descrizione
-t Visualizza le informazioni a livello del thread.
-m Fornisce informazioni dettagliate sulla memoria per ogni processo.
-x Visualizza le informazioni su processo, memoria e thread.
-t Visualizza le informazioni sotto forma di struttura processi (come la visualizzazione ad albero di Process Explorer).
-s [n] Effettua l'esecuzione in modalità gestione attività per i secondi specificati. In questo modo è possibile visualizzare quasi in tempo reale le informazioni remote sul processo.
-r [n] Specifica la frequenza (in secondi) di aggiornamento durante l'esecuzione in modalità gestione attività.
name Visualizza le informazioni sui processi che iniziano col nome specificato.
-e Corrisponde esattamente al nome del processo.
pid Visualizza le informazioni su un processo specifico.

PsList è uno strumento potente ma facile da utilizzare; senza utilizzare il desktop remoto, consente di visualizzare in dettaglio i processi remoti. Con queste informazioni è possibile passare a PsKill o PsSuspend se, ad esempio, è necessario ricontrollare un processo.

PsLoggedOn

Il presupposto di PsLoggedOn è autoesplicativo. L'utilità visualizza gli utenti registrati in un sistema sia che si tratti di accessi locali (interattivi) o accessi alla condivisione di rete. Come per PsFile, questa funzionalità può essere utile per stabilire chi sta utilizzando un server su cui è necessario eseguire operazioni di manutenzione. L'uso è molto semplice:

PsLoggedOn \\computer

PsLoggedOn dispone soltanto di due parametri facoltativi: -l mostra soltanto gli accessi locali (non gli accessi di rete) e -x esclude l'orario di accesso.

Benché sia uno strumento molto semplice, PsLoggedOn consente di visualizzare facilmente le informazioni che generalmente vengono ricercate in diverse posizioni di Windows.

PsLogList

Una delle utilità più utili in generale, PsLogList, è uno strumento che consente di eseguire il dump del registro eventi di Windows in un formato di testo che può essere utilizzato da lettori registro, database o da qualsiasi altro programma. Il vantaggio principale è che converte le voci del registro eventi dal formato binario in qualcosa che può essere facilmente trasformato o automatizzato. (Naturalmente, in Windows Vista™ i registri eventi sono originariamente disponibile in formato XML, ma questo è un altro argomento da affrontare in un'altra occasione).

L'uso di PsLogList è:

PsLogList \\computer -u username -p password

Sono anche disponibili numerose opzioni e parametri aggiuntivi come illustrato nella Figura 6.

Figure 6 Opzioni PsLogList

Opzione Descrizione
-a Scarica soltanto gli eventi successivi alla data specificata.
-b Scarica soltanto gli eventi antecedenti alla data specificata.
-c Azzera il registro eventi definitivamente dopo aver scaricato l'output desiderato.
-d Visualizza soltanto le informazioni per il numero specificato di giorni specificato.
-e Esclude gli eventi con l'ID evento specificato (è possibile specificare fino a 10 ID).
-f Filtra i tipi di evento (avviso, errore e così via).
-g Esporta il registro eventi come un file EVT; è richiesta l'opzione -c.
-h Visualizza soltanto le informazioni per il numero di ore specificato.
-l Scarica dal file EVT specificato.
-m Visualizza soltanto le informazioni per il numero di minuti specificato.
-n Visualizza soltanto il numero specificato degli eventi più recenti.
-o Visualizza soltanto gli eventi di una data sorgente (ad esempio, -o SRService per Windows System Restore Service).
-q Esclude gli eventi da una data sorgente (il contrario di -o).
-r Inverte l'ordine degli eventi del registro dal meno recente al più recente.
-s Elenca i record di ogni riga nei campi delimitati.
-t Specifica qualcosa di diverso da una virgola come delimitatore per l'output -s.
-w Attende che nuovi eventi vengano popolati e scaricati in tempo reale. Applicabile solo al sistema locale.
-x Scarica i dati estesi dai registri eventi.
eventlog Specifica quale registro eventi scaricare. Il valore predefinito è System.
@file Esegue il comando su tutti i computer specificati nel file di testo.

Il registro eventi di Windows può essere uno strumento di diagnostica incredibilmente potente, ma il vero trucco è estrarre i dati in modo da poterli modificare o consolidare. PsLogList esegue esattamente questa funzione.

PsPasswd

PsPasswd è un'utilità semplice ma potente progettata con alcune delle caratteristiche di Net.exe, ma tenendo presente il funzionamento in remoto e automatizzato.

PsPasswd  \\computer -u username -p password Username Newpassword

È possibile specificare un computer, nessun computer (il sistema locale) oppure se si specifica il computer come \\* l'utilità verrà eseguita su tutti i computer nel dominio corrente. PsPasswd dispone di un solo parametro aggiuntivo: @file, che esegue il comando su tutti i computer specificati nel file di testo. Anche questa è un'utilità molto semplice estremamente utile in ambienti multi-sistema.

PsService

PsService consente di visualizzare e modificare le informazioni di Gestione controllo servizi (SCM) su uno o più sistemi della rete, inoltre può anche cercare un determinato nome servizio sui sistemi in rete.

PsService \\computer -u username -p password command options

Quando si esegue PsService, il comando rappresenta uno dei comandi elencati nella Figura 7 e le opzioni specificano un attributo applicabile a un determinato comando. Se non viene fornita alcuna opzione di comando aggiuntiva, PsService fornisce un dump completo delle informazioni SCM.

Figure 7 Comandi PsService

Comando Descrizione
query Esegue una query su un determinato servizio.
/config Esegue una query per le informazioni di configurazione di un determinato servizio.
setconfig Imposta le informazioni di configurazione di un determinato servizio.
start Avvia un servizio.
stop Arresta un servizio.
restart Riavvia (arresta e avvia) un servizio.
pause Sospende un servizio.
cont Riprende un servizio sospeso.
depend Mostra quali servizi dipendono dal servizio specifico.
find Ricerca nella rete una determinata istanza del servizio.
security Fornisce le informazioni di protezione per un determinato servizio.

PsService può essere considerato come una versione potente e remota della riga di comando di Services.msc, che consente anche di cercare in rete i servizi (probabilmente quelli potenzialmente pericolosi) e di impostare le informazioni di configurazione.

PsShutdown

PsShutdown è un altro degli strumenti preferiti. Anche se qualcuno potrebbe affermare che Microsoft include uno strumento che gestisce questa attività (shutdown.exe), il funzionamento non e proprio lo stesso. La differenza principale consiste nella potenza di PsShutdown: vale a dire, può arrestare o riavviare un sistema remoto. Inoltre, ha la capacità di mettere un sistema in modalità standby o di sospensione (non solo arrestare o riavviare), di bloccare e riavviare un sistema dopo aver visualizzato un messaggio all'utente per un determinato periodo di tempo.

PsShutdown \\computer -u username -p password

Sono anche disponibili numerosi parametri aggiuntivi come illustrato nella Figura 8.

Figure 8 Opzioni PsShutdown

Opzione Descrizione
-a Interrompe un arresto del sistema già in corso avviato da PsShutdown.
-c Autorizza un utente interattivo a interrompere l'arresto.
-d Sospende il computer (standby).
-e Arresta i codici motivo. Si consiglia di consultare il sito Web Microsoft per assistenza su tali parametri, in quanto il loro utilizzo può risultare problematico, sia con PsShutdown che con il comando integrato shutdown.exe. Per ulteriori informazioni vedere msdn2.microsoft.com/en-us/library/aa376885.aspx.
-f Forza l'arresto di tutte le applicazioni in esecuzione.
-h Sospende il computer.
-k Spegne il computer (riavvia se la funzione di spegnimento non è supportata).
-l Blocca il computer.
-m Specifica il messaggio da visualizzare da tutti gli utenti interattivi.
-n Specifica il timeout, ossia il tempo di attesa prima di un errore di connessione ai computer remoti.
-o Scollega la console dell'utente.
-r Riavvia il computer.
-s Arresta, ma non spegne.
-t Conto alla rovescia prima che il comando di arresto venga eseguito o tempo necessario per lo spegnimento.
-v Visualizza il messaggio agli utenti fino all'arresto del sistema.
@file Esegue il comando su tutti i computer specificati nel file di testo.

PsShutdown è un'utilità per il controllo del risparmio di energia del sistema molto potente e completamente configurabile ma allo stesso tempo facile utilizzare.

PsSuspend

PsSuspend è un'utilità pratica che consente di tenere temporaneamente sotto controllo un processo anomalo o semplicemente di disattivare temporaneamente l'elevato utilizzo della CPU senza perdere dati o il contesto dell'applicazione.

PsSuspend \\computer -u username -p password process ID

È possibile ottenere l'ID del processo utilizzando PsList. Una volta sospeso un processo, è possibile utilizzare l'opzione -r per riattivarlo. Si noti che il concetto di sospendere e riattivare un processo è anche implementato da Process Explorer, nonostante questo funzioni solo localmente. Ovviamente, PsSuspend può sospendere e riattivare i processi in remoto e in locale, pertanto presenta un margine di vantaggio rispetto all'implementazione integrata di Process Explorer.

Conclusioni

Trovo la famiglia di prodotti PsTools un insieme di utilità dal valore inestimabile. Insieme alle altre utilità Sysinternals (ossia, Regmon, Filemon, Process Explorer e Process Monitor), i prodotti PsTools sono i primi programmi da utilizzare per la reinstallazione di Windows su qualsiasi sistema. Spero che questo articolo abbia permesso di far conoscere PsTools a chi non lo conosceva ancora, offrendo anche qualche informazione in più a chi già aveva sentito parlare del programma. Ringrazio Mark Russinovich per aver fornito questi strumenti gratuitamente per tutti questi anni e per la collaborazione alla stesura del presente articolo.

Wes Miller è un responsabile di sviluppo presso Pluck (www.pluck.com), Austin (Texas). Wes ha lavorato in precedenza per Winternals Software ad Austin e in Microsoft come Program Manager e Product Manager di Windows. È possibile contattarlo all'indirizzo technet@getwired.com.

© 2008 Microsoft Corporation e CMP Media, LLC. Tutti i diritti riservati. È vietata la riproduzione completa o parziale senza autorizzazione.