Windows PowerShell: Serializzare o non serializzare?
La serializzazione può risultare molto utile per l'esportazione o il recupero di oggetti con Windows PowerShell.
Don Jones
Eseguendo classi su Windows PowerShell, sono indicando costantemente miei studenti a oggetti pipe a Get-Member:
Get-Process | Get-Member
Member Get o GM in breve, consente di utilizzare una funzionalità di Microsoft .NET Framework denominata reflection. Questa funzionalità consente di visualizzare informazioni su un oggetto, inclusi il nome ufficiale, proprietà, metodi e così via. Questo cmdlet è un metodo più semplice per visualizzare rapidamente un oggetto può eseguire più dettagli intorno in un motore di ricerca o poring attraverso il sito MSDN Library Web.
In alcuni casi, tuttavia, quando gli studenti tentano di eseguire questo cmdlet, noteranno qualcosa di simile da Get-Member:
TypeName: Deserialized.System.Diagnostics.Process
Sì, è possibile sapere che cosa è un processo, ma un processo de-serialized? Ulteriore analisi dell'output di Get-Member rivela inoltre che, a differenza dei normali processi che dispongono di metodi per arrestare il processo ed eseguire altre operazioni, questi processi de-serialized non sembrano disporre di metodi, ovvero che non li si renda eseguire qualsiasi azione. Cosa c'è che non va?
Oggetti come diventare cereali … er, serializzati
In Windows, gli oggetti sono bit di funzionamento del software. Un processo è letteralmente un'applicazione software. Un oggetto processo fornisce le proprietà che descrivono alcuni attributi di un processo, come il nome, l'utilizzo della memoria e così via; l'oggetto potrebbe essere anche metodi per attivare azioni come l'arresto, l'aggiornamento e così via.
Gli oggetti sono molto utili quando si tratta del computer, ma non esiste un modo pratico reale di trasmettere l'intero oggetto attraverso una rete. La serializzazione è un modo per creare una rappresentazione testuale di un oggetto, in genere in formato XML. Figura 1 Mostra gli oggetti processo sono stati serializzati in XML.
Essenzialmente, la tecnica di serializzazione richiede uno snapshot delle proprietà dell'oggetto, li codifica in un file XML strutturato e trasmette quindi tale file attraverso la rete. A questo punto, il file XML è essenzialmente un file di testo. Non esiste più una connessione diretta tra i processi in esecuzione effettivi e tale file XML. Il file è una visualizzazione in un momento di proprietà dell'oggetto trasmesso.
Figura 1 consentirà di file XML di serializzare oggetti processo.
Serializzazione non conserva i metodi di un oggetto. Non è possibile tornare indietro all'oggetto originale e indicare l'esecuzione del metodo. Quando la shell è necessario leggere l'oggetto serializzato, deserializzato. L'operazione viene eseguita la lettura del testo XML e di creazione di un aspetto molto simile all'oggetto originale, ovvero senza tutti i relativi metodi, ovviamente.
Risorse comuni per oggetti seriali
Windows PowerShell v2 utilizza la serializzazione in due posizioni comuni:
- Quando si esportano oggetti in formato XML utilizzando CliXML esportazione
- Quando si recuperano gli oggetti da un computer remoto tramite i servizi remoti di Windows PowerShell
Ad esempio, questo comando verrà recuperare i processi in esecuzione da un computer remoto, ordinarli sull'utilizzo della memoria virtuale e visualizzare i primi 10:
invoke-command { ps } -computer server-r2 | sort vm -desc | select -first 10
Potrebbe anche avere tutto l'ordinamento e la selezione si verificano nel computer remoto, ha il vantaggio di trasmissione meno serializzata gli oggetti attraverso la rete:
invoke-command { ps | sort vm -desc | select -first 10 } -computer server-r2
Il punto è che gli oggetti provenienti in rete non sono più processi reali. Sono stati inseriti in formato XML. È Impossibile ottenere uno di questi processi e indicano l'arresto, perché non vi è alcuna connessione tra quelli presenti nel computer locale e ciò che è in esecuzione sul computer remoto.
La serializzazione può essere utile anche per memorizzare le informazioni sull'oggetto. Si supponga, ad esempio, che è possibile esportare configurazioni tutti i servizi ’ in un file XML:
get-wmiobject win32_service | export-clixml baseline.xml
È quindi possibile utilizzare tale snapshot per confrontare la configurazione del server in futuro. Dovrebbe segnalare eventuali modifiche di configurazione apportate, inavvertitamente o intenzionalmente.
Questo comando confronta gli oggetti servizio corrente a quelle nello snapshot:
compare-object (get-wmiobject win32_service) (import-clixml baseline.xml)
In questo caso, il fatto che deserializzata oggetti Don ’t dispongono di metodi non è importante. È la proprietà che contengono tutte le informazioni di configurazione, ad esempio inizio modalità, account di accesso e così via.
Essere Careful con Cerealized … er, oggetti serializzati
Serializzazione può essere un problema, tuttavia, quando è necessario accedere ai metodi di un oggetto. Ad esempio, questo comando funziona correttamente sul computer locale (e verrà riavviato, in modo da non eseguirla se non si è pronti per cui):
Get-WmiObject Win32_OperatingSystem | ForEach-Object { $_.Reboot() }
Il comando riportato di seguito non funziona, anche se:
Invoke-Command { Get-WmiObject Win32_OperatingSystem } –computer Server-R2 | ForEach-Object { $_.Reboot() }
Infatti il risultato di Invoke-Command è un oggetto deserializzato con alcun metodo. Il metodo di riavvio non verrà eseguito. È possibile, tuttavia, eseguire questa operazione:
Invoke-Command { Get-WmiObject Win32_OperatingSystem | ForEach-Object { $_.Reboot() }} –computer Server-R2
Abbiamo ora stiamo richiamando il metodo reboot sul computer remoto prima che l'oggetto viene serializzato e perde i relativi metodi. Pertanto, ogni volta che la serializzazione sembra essere creando un problema, di solito un lavoro intorno. È necessario essere a conoscenza quando avviene la serializzazione.
Don Jones è un fondatore di tecnologia incentrati e risposte alle domande su Windows PowerShell e altre tecnologie di ConcentratedTech.com. È anche autore di Nexus.Realtimepublishers.com, molti dei suoi libri rende disponibile come libere edizioni elettroniche tramite il suo sito web.