Buongiorno Mr Script! Esplorazione di Active Directory

The Microsoft Scripting Guys

Download codice disponibile in: HeyScriptingGuy2009_02.exe(151 KB)

Contenuto

Assegnazione della Guida in linea
Il Nitty-Gritty
Funzioni di supporto

Come è noto, L'editor di script e I sono diventano solo recente nuovo a tempo pieno Microsoft Scripting Guys e abbiamo impiegato gran parte nostro tempo recente sifting a migliaia di messaggi provenienti dal indirizzo scripter@microsoft.comaccount di posta elettronica. Senza che sia autorizzato effettivamente uno Studio, è necessario avventurarsi suppone che la domanda di un numero di posta elettronica che abbiamo visto "dove posso ottenere Visualizzatore area di Active Directory." E allora? Abbiamo mai visto la cosa. È stato recuperato ed era ma non possono trovare.

Infine, dopo il rilascio di un numero di messaggi segreto su una lavagna messaggio Internet, è una risposta codificata che, quando visualizzato decifrati, indicato per noi il ADSI Scriptomaticè infatti Visualizzatore area di Active Directory. Viene non denominato Visualizzatore area di Active Directory e il suo scopo non è effettivamente visualizzazione Active Directory (di aiuto consente di creare script ADSI), pertanto HO deciso di scrivere uno script Windows Power­Shell che modo è possibile visualizzare lo schema di Active Directory. Viene chiamato, affatto sufficientemente BrowseActiveDirectory­Schema.ps1, e viene mostrata nella Figura 1 .

Nella figura 1 BrowseActiveDirectorySchema.ps1

Param($action,$class, [switch]$help)

Function GetHelp()
{
  $helpText= '
@"
 DESCRIPTION:
 NAME: BrowseActiveDirectorySchema.ps1
 Browse Active Directory Schema. Lists Classes, and properties. 

 PARAMETERS: 
 -Action <L(ist all classes), M(andatory), O(ptional), F(ind)>
 -Class class to search: user, computer, person, contact etc
 -Help displays this help topic

 SYNTAX:
 BrowseActiveDirectorySchema.ps1 -A L
 Lists the name of each class defined in the AD schema

 BrowseActiveDirectorySchema.ps1 -A M -c user
 Lists the mandatory properties of the user class

 BrowseActiveDirectorySchema.ps1 -A O -c computer
 Lists the optional properties of the computer class

 BrowseActiveDirectorySchema.ps1 -A F -c user
 Lists all Active Directory Classes that contain the word user 
 in the actual class name

 BrowseActiveDirectorySchema.ps1 -Action Find -c user
 Lists all Active Directory Classes that contain the word user 
 in the actual class name

 BrowseActiveDirectorySchema.ps1 -help
 Prints the help topic for the script
"@ #end helpText
  $helpText
} #end GetHelp
Function GetADSchema($Action, $class)
{
 $schema = [DirectoryServices.ActiveDirectory.ActiveDirectorySchema]::GetCurrentSchema()
 Switch ($Action)
  {
   "classes" { 
              $schema.FindAllClasses() | 
              Select-Object -Property Name 
             }
   "Mandatory" 
             {
              "Mandatory Properties of $class object"
              ($schema.FindClass("$class")).MandatoryProperties | 
               Format-Table -Property Name, Syntax, IsSingleValued -AutoSize 
             }
   "Optional" 
             {
              "Optional Properties of $class object"


              "This might take a few seconds ..."
              ($schema.FindClass("$class")).OptionalProperties | 
              Format-Table -Property Name, Syntax, IsSingleValued -AutoSize 
             }
   "Find" 
             {
              $schema.FindAllClasses() | 
              Where-Object { $_.name -match "$class" } |
              Select-Object -property name
             }
   DEFAULT {"$action is not a valid action." ; GetHelp ; Exit}
  }
} #end GetADSchema

Function GetAllClasses()
{
 GetAdSchema("classes")
} #end GetAllClasses

Function GetMandatory($class)
{
 GetAdSchema -action "Mandatory"  -class $class 
} #end GetMandatory

Function GetOptional($class)
{
 GetAdSchema -action "Optional"  -class $class 
} #end GetOptional

Function FindClasses($class)
{
 GetAdSchema -action "Find" -class $class
} #end FindClasses
# *** Entry Point to Script ***
if($help) { GetHelp ; Exit }

Switch ($action)
{
 "L" {GetAllClasses ; Exit}
 "M" {GetMandatory($class) ; Exit}
 "O" {GetOptional($class) ; Exit}
 "F" {FindClasses($class) ; Exit}
 DEFAULT { "$action is not a valid action." ; GetHelp ; Exit} 
}

Come può notare, lo script inizia con l'istruzione di parametro. Questo consente di creare tre parametri della riga di comando che consentono di modificare lo script eseguendo, anziché modificare lo script per visualizzare un comportamento diverso che è molto utile:

Param($action,$class, [switch]$help)

Se, ad esempio, si desidera visualizzare le proprietà obbligatorie della classe utente in Servizi di dominio Active Directory, è necessario specificare –action M e l'utente –class, come illustrato nella Nella figura 2 .

fig02.gif

Nella figura 2 visualizzazione le proprietà della classe utente obbligatoria

È possibile scegliere con la stessa facilità le proprietà della classe gruppo facoltativa. Questo è il vantaggio dell'utilizzo di parametri della riga di comando: è possibile modificare il comportamento di uno script in fase di esecuzione anziché tornare all'area di disegno. Questo è consigliabile durante la scrittura degli script che si intende utilizzare come utilità, invece di quelli che si utilizzerà una sola volta.

Assegnazione della Guida in linea

Nella sezione successiva dello script nella Figura 1 viene illustrato la funzione GetHelp. Quando si scrive uno script che espone i parametri della riga di comando, consiglia di includere una funzione che visualizzerà informazioni utilizzando lo script. Non si desidera che i utenti dello script per aprire e leggere tutto il testo per scoprire cosa accade. Ha valore True un principio guida di progettazione di script è uno script deve essere leggibile, ma se si include una funzione di Guida in linea, si semplifica vita per gli utenti.

La funzione GetHelp Visualizza le informazioni nella molto come il cmdlet Get-Guida in linea. Vengono visualizzati tre sezioni di testo: la descrizione, parametri e sintassi. GetHelp esegue due operazioni. Viene creata una stringa qui che contiene il testo da visualizzare e quindi viene visualizzato il contenuto della variabile che contiene la stringa, qui (in questo caso, è helpText $).

Un qui, la stringa sono un costrutto Windows PowerShell che consente di digitare le informazioni e formattare l'output senza doversi preoccupare citazione regole. Tutto ciò che viene digitato nella qui-stringa viene trattato come testo. GetHelp viene chiamato quando lo script è in esecuzione con l'opzione –help o se un utente digita un parametro non corretto. Figura 3 Mostra il risultato della chiamata lo script con l'opzione –help.

fig03.gif

Nella figura 3 chiamata lo script con the–help passare

Il Nitty-Gritty

A questo punto si raggiunge la funzione GetAD­Schema, ovvero quello che esegue la maggior parte delle operazioni reale per lo script nella Figura 1 . La chiave qui sta utilizzando la classe DirectoryServices.ActiveDir­ectory.ActiveDirectorySchema Microsoft .NET Framework. Inserendo la classe racchiuso tra parentesi quadre e dopo che con i due punti doppio, è possibile accedere i metodi statici della classe (in questo caso, GetSchema e Get­CurrentSchema.

Il metodo statico GetCurrent­Schema restituisce un'istanza di una classe Active­DirectorySchema che rappresenta lo schema a cui si è connessi. Nella figura 4 è illustrato i membri della classe ActiveDirectorySchema.

fig04.gif

Dopo aver creato un'istanza della classe DirectoryServices.ActiveDirectory.Ac­tive­Schema .NET Framework e archivio l'oggetto schema risultante nella variabile $ dello schema, è necessario decidere quale azione da eseguire. A tal fine, un'istruzione switch valuta il valore che viene passato dalla variabile $ azione.

Base la condizione viene soddisfatta, la funzione viene tutte le classi disponibili in Servizi di dominio Active Directory, visualizzare proprietà obbligatorie o facoltative di una classe specifica o ricerca di una classe che soddisfano un criterio specificato. Quando si utilizzano switch, consiglia di includere sempre una condizione predefinita.

Funzioni di supporto

Per suddividere da parte del codice e semplificare la espandere lo script, È stato incluso un numero di supporto funzioni che vengono chiamate basate sui parametri passati allo script quando viene eseguita. Ognuna delle funzioni di supporto chiama GetADSchema e si passa un insieme diverso di parametri, a seconda il valore fornito per il parametro –action dalla riga di comando.

La prima funzione di supporto è GetAllClasses, che chiama GetADSchema e passa la parola "classi". Quando l'istruzione switch nella funzione GetAD­Schema corrisponde alla stringa "classi", chiama il metodo FindAllClasses dalla classe ActiveDirectorySchema. In questo campo è il codice chiamato dall'istruzione switch:

"classes" { 
              $schema.FindAllClasses() | 
              Select-Object -Property Name'

Di seguito viene la funzione GetAllClasses:

Function GetAllClasses()
{
GetADSchema("classes")
} #end GetAllClasses

La funzione di supporto successiva è GetMandatory, il cui scopo è per restituire la proprietà obbligatoria dell'oggetto specificato nel parametro –class quando viene eseguito lo script. La funzione GetMandatory riceve il valore per la classe $ dalla riga di comando tramite il parametro –class. Quando GetMandatory chiama la funzione GetADSchema, passa due parametri. Poiché vengono da passati due parametri, è possibile apportare consigliabile per specificare il nome completo del parametro per entrambi, il codice più facile da leggere e comprendere. Al contrario, nella funzione GetAllClasses è non utilizzare il nome del parametro –action quando viene chiamata la funzione GetADSchema. In questo caso, il valore "classi" è stato passato in maniera posizionale.

Quando viene chiamata la funzione GetADSchema, viene utilizzato il metodo FindClass dalla classe ActiveDirectorySchema per recuperare la classe che è specificata nella variabile $ classe. Restituisce un'istanza di una classe ActiveDirectorySchemaClass. I membri di questa classe sono illustrati nella Figura 5 .

fig05.gif

La funzione GetADSchema successivamente esegue query sulla proprietà MandatoryProperties dell'oggetto e le condutture nei risultati per il cmdlet formato tabella, in cui sceglie le proprietà Name, sintassi e IsSingleValued. Il parametro –Autosize commutazione del cmdlet tabella formato ridimensiona automaticamente le colonne per evitare di tagliare disattivare valori di proprietà, se possibile. Il codice che esegue quando la stringa "obbligatoria corrisponde viene visualizzata qui:

"Mandatory" 
       {
       "Mandatory Properties of $class object"
       ($schema.FindClass("$class")).MandatoryProperties | 
       Format-Table -Property Name, Syntax, IsSingleValued -AutoSize 
       }

Di seguito viene la funzione GetMandatory:

Function GetMandatory($class)
{
 GetAdSchema -action "Mandatory" -class $class 
} #end GetMandatory

Ora vediamo come la funzione Get­Optional è in possibile di visualizzare le facoltativa proprietà di una classe di Servizi di dominio Active Directory. GetOptional accetta il valore di classe $ ricevuto dalla riga di comando tramite il parametro –class, quindi passa il valore relativo alla classe $ alla funzione GetADSchema along with azione denominata "Optional".

Quando la stringa "OPTIONAL" è una corrispondenza nell'istruzione switch, un messaggio viene stampato sullo schermo allo scopo di spiegare che la visualizzazione di proprietà facoltative potrebbe richiedere alcuni secondi. Quindi, viene chiamato il metodo FindClass dalla classe ActiveDirectorySchema. Il metodo FindClass restituisce un'istanza di una classe ActiveDirectory­SchemaClass. Se dovesse eseguire una query la proprietà Optional­Properties della classe ActiveDirectorySchema­Class, è possibile restituire le proprietà facoltative definite per la classe scelta in Servizi di dominio Active Directory.

I risultati sono pipelined per il cmdlet formato tabella, contenente le informazioni in modo stesso come per le proprietà obbligatorie. Ecco tale sezione del codice:

"Optional" 
      {
      "Optional Properties of $class object"
      "This might take a few seconds ..."
      ($schema.FindClass("$class")).OptionalProperties | 
      Format-Table -Property Name, Syntax, IsSingleValued -AutoSize 
      }

Il seguente codice è la funzione GetOptional completa:

Function GetOptional($class)
{
 GetAdSchema -action "Optional"  -class $class 
} #end GetOptional

La funzione di supporto finale è FindClasses, che chiama la funzione GetADSchema e passa due valori. Il primo è l'azione di ricerca e il secondo è la classe da individuare. Lo scopo di questa funzione è che consentono all'utente identifica le classi nello schema Servizi di dominio Active Directory che può ulteriormente merit esplorazione.

Si supponga interessati a posta elettronica. In questo caso, si desideri visualizzare quali le classi correlate a posta elettronica e le proprietà esistono per una classe applicabile. Come illustrato nella figura 6 , innanzitutto eseguire lo script con l'f –action e –class posta parametri. Restituisce tutte le classi contenenti la stringa "mail" contenuto in un punto qualsiasi in nome. Dopo avere individuato una classe che si desidera, è possibile visitare le proprietà della classe scegliendo l'azione m (per obbligatorio) e specificare il parametro –c (per class), seguito dal nome esatto della classe.

fig06.gif

Nella figura 6 ricerca di una classe dello schema di Active Directory

Quando la funzione FindClasses chiama il GetADSchema, viene chiamato il metodo FindAllClasses e l'insieme di classi ActiveDirectorySchemaClass risultante viene inviato tramite la pipeline. Il WHERE-Object utilizzato una corrispondenza di schema di espressione regolare per la ricerca per le classi che corrispondono al valore memorizzato nella variabile $ classe. Di seguito è riportato il codice:

"Find" 
    {
    $schema.FindAllClasses() | 
    Where-Object { $_.name -match "$class" } |
    Select-Object -property name

E questa è la funzione FindClasses:

Function FindClasses($class)
{
 GetAdSchema -action "Find" -class $class
} #end FindClasses

Dopo tutte le funzioni di supporto sono definite, raggiungono il punto di ingresso allo script. Il punto di ingresso è solo una cosa, esamina la riga di comando e determina la funzione da chiamare. Primo luogo ovvero selezionato è la presenza del parametro –help. Se lo script viene eseguito con –h o –help, lo script verrà chiamare la funzione di GetHelp per visualizzare la Guida in linea e viene chiuso, come illustrato di seguito:

if($help) { GetHelp ; Exit }

Poiché il parametro –help viene controllato per prima, la presenza nella riga di comando supera tutti gli altri. Se non è stato utilizzato il parametro –help, lo script in necessario di valutare il valore fornito per il parametro –action, che è il parametro predefinito. Qualsiasi digitato nella riga di comando verrà essere interpretato come un valore per –action se nessun altro elemento viene utilizzato. In questo modo il vantaggio aggiunto di consentire l'acquisizione dell'input FALSO per lo script.

L'istruzione switch è uno strumento naturale per valutare i valori forniti per –action. Quattro azioni sono definiti, ciascuno dei quali chiamare la funzione appropriata. La condizione quinta definito è l'azione predefinita e viene visualizzato un messaggio l'azione consentito, whereupon chiama la funzione GetHelp.

Una cosa da tenere presente sull'istruzione switch è che è impossibile trovare più corrispondenze. Per questo motivo, l'istruzione di uscita viene utilizzata dopo ogni chiamata alle funzioni. Il codice di istruzione switch è illustrato di seguito:

Switch ($action)
{
 "L" {GetAllClasses ; Exit}
 "M" {GetMandatory($class) ; Exit}
 "O" {GetOptional($class) ; Exit}
 "F" {FindClasses($class) ; Exit}
 DEFAULT { "$action is not a valid action." ; GetHelp ; Exit} 
}

Bene, che rappresenta informazioni utenti. Non è non browser Active Directory, diverso dal Scriptomatic ADSI. Ma lo script BrowseActive­DirectorySchema.ps1 deve servire anche per il tempo. Per Active Directory più divertente script, visitare il Hub script di Active Directory. E di sapere che siamo aperti ogni istante dell'anno nel Script Center.

Wilson ed è un consulente senior in Microsoft e un esperto di script noto. È un trainer Certified Microsoft che recapita un workshop di Windows PowerShell comuni clienti Premier Microsoft nel mondo. Ha scritto libri otto inclusi diversi in Windows script e ha contribuito a libri quasi una dozzina. Ed contiene più di 20 certificazioni del settore.

Craig Liebendorfer è wordsmith e longtime editor Web di Microsoft. Craig ancora can’t ritiene ’s esiste un processo che paga gli lavorare con le parole ogni giorno. Uno dei suoi elementi preferiti è irreverent umorismo in modo che deve adattare destra in questa posizione. Ha considerato suo accomplishment maggiore nella vita da sua figlia magnificent.