Ei, Scripting Guy! Pesquisa do Active Directory

The Microsoft Scripting Guys

Download do código disponível em: HeyScriptingGuy2009_02.exe(151 KB)

Conteúdo

Fornecendo ajuda
O Nitty-Gritty
Funções do auxiliar

Como você deve saber, o Editor de scripts e só recentemente tornaram a nova em tempo integral equipe de scripts da Microsoft, e ter passamos grande parte de nosso tempo recentemente examinando a milhares de emails que o scripter@microsoft.comconta de email. Sem ter realmente commissioned um estudo, seria se supor que a pergunta de email de um número que vimos é "onde posso obter o Pesquisador de diretório Active." Mas adivinhe? Nunca vimos a coisa. Nós parecia e parecia mas não pôde localizar.

Finalmente, após descartar um número de mensagens secretas em um tabuleiro de mensagem da Internet, obteve uma resposta codificada que, ao decifradas, indicado para nós que o ADSI Scriptomaticé na verdade navegador Active Directory. Bem, ele não é chamado navegador de diretório Active e seu objetivo não é realmente navegação Active Directory (ele é ajudar você a criar scripts ADSI), portanto, eu decidi escrever um script Windows Power­Shell que permitiria que você procure o esquema do Active Directory. Ele é chamado, oddly suficiente, BrowseActiveDirectory­Schema.ps1, e é mostrada na Figura 1 .

A 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} 
}

Como você pode ver, o script começa com a instrução de parâmetros. Isso é usado para criar três parâmetros de linha de comando que permitem que você modifique o script executando, em vez de editar o script para ver o comportamento diferente, que é muito útil:

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

Se, por exemplo, você deseja ver as propriedades obrigatórias da classe de usuário nos serviços de domínio Active Directory (AD DS), você especificar o –action M e o usuário –class, conforme mostrado na A Figura 2 .

fig02.gif

A Figura 2 Exibir propriedades da classe de usuário obrigatórias

Você poderia escolher facilmente propriedades opcionais da classe grupo. Isso é a vantagem de usar parâmetros de linha de comando: você pode modificar o comportamento de um script em tempo de execução em vez de voltar para o quadro de desenho. Essa é uma prática recomendada ao escrever scripts que você pretende usar como utilitários, em vez deles que você usará somente uma vez.

Fornecendo ajuda

A próxima seção do script na Figura 1 mostra a função GetHelp. Quando você escreve um script que expõe os parâmetros de linha de comando, é uma prática recomendada para incluir uma função que irá exibir ajuda para usar o script. Não deseja que os usuários do seu script para abri-lo e leia todo o texto para descobrir o que ele faz. Verdadeiro, um princípio de orientação do design de script é que um script deve ser lido, mas se você incluir uma função de Ajuda, você tornar vida mais fácil para os usuários.

A função GetHelp exibirá informações da mesma maneira como o cmdlet Get-ajuda. Três seções de texto são exibidas: descrição, parâmetros e sintaxe. GetHelp faz duas coisas. Ele cria um aqui-cadeia de caracteres que contém o texto para exibir e, em seguida, exibe o conteúdo da variável que contém as aqui-cadeia de caracteres (nesse caso, ele é helpText $).

Um aqui-cadeia de caracteres é uma construção do Windows PowerShell que permite que você digite as informações e formatar sua saída sem se preocupar se vincularem regras. Tudo o que você digitar a aqui-cadeia de caracteres é tratado como texto. GetHelp é chamado quando o script é de execução com a opção –help ou se alguém digita um parâmetro incorreto. a Figura 3 mostra o resultado de chamar o script com a opção –help.

fig03.gif

A Figura 3 chamando o script com the–help alternar

O Nitty-Gritty

Agora, chegamos à função GetAD­Schema — aquele que faz a maior parte do trabalho real para o script na Figura 1 . A chave aqui está usando a classe DirectoryServices.ActiveDir­ectory.ActiveDirectorySchema Microsoft .NET Framework. Colocando a classe entre colchetes e seguindo que com dois-pontos duplos, você pode acessar os métodos estáticos da classe (no caso, GetSchema e Get­CurrentSchema).

O método estático GetCurrent­Schema retorna uma instância de uma classe Active­DirectorySchema que representa o esquema ao qual você está conectado no momento. a Figura 4 mostra os membros da classe ActiveDirectorySchema.

fig04.gif

Depois de criar uma instância da classe DirectoryServices.ActiveDirectory.Ac­tive­Schema .NET Framework e o armazenamento o objeto de esquema resultante na variável $ esquema, você deverá decidir qual ação a ser executada. Para fazer isso, uma instrução switch avalia o valor que é passado para ele da variável $ ação.

Com base na condição que for atendida, a função será encontrar todos os das classes no AD DS, exibir propriedades obrigatórias ou opcionais de uma classe específica ou procurar por uma classe que atenda a um dado critérios. Quando você estiver usando a opção, é uma prática recomendada para sempre incluir uma condição padrão.

Funções do auxiliar

Para dividir a parte do código e facilitam expandir o script, incluí um número de auxiliar funções que são chamadas baseia os parâmetros passados para o script quando ele é executado. Cada uma as funções do auxiliar chama GetADSchema e passa um conjunto diferente de parâmetros, dependendo do valor fornecido para o parâmetro –action a partir da linha de comando.

A primeira função de auxiliar é GetAllClasses, que chama GetADSchema e passa a palavra "classes". Quando a instrução switch na função GetAD­Schema corresponde a seqüência de caracteres "classes", ele chama o método FindAllClasses da classe ActiveDirectorySchema. Aqui está o código chamado pela instrução switch:

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

E aqui está a função GetAllClasses:

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

A função de auxiliar próxima é GetMandatory, cujo objetivo é retornar obrigatórias propriedades do objeto especificado no parâmetro –class quando o script é executado. A função GetMandatory recebe o valor de classe de $ a partir da linha de comando via parâmetro –class. Quando GetMandatory chama a função GetADSchema, ele passa dois parâmetros. Porque estão sendo passados dois parâmetros, eu considero-uma prática recomendada é especificar o nome de parâmetro completo para ambos, tornando o código mais fácil de ler e compreender. Por outro lado, na função GetAllClasses, nós não usou o nome do parâmetro –action ao chamar a função GetADSchema. Nesse caso, o valor "classes" foi passado de uma maneira posicional.

Quando a função GetADSchema é chamada, ele usa o método FindClass da classe ActiveDirectorySchema para recuperar a classe que é especificada na variável $ classe. Ele retorna uma instância de uma classe ActiveDirectorySchemaClass. Os membros dessa classe são mostrados na Figura 5 .

fig05.gif

A função GetADSchema próxima consulta a propriedade MandatoryProperties do objeto e tubulações os resultados para o cmdlet Format-Table, onde ele escolhe as propriedades Name, sintaxe e IsSingleValued. O parâmetro –autosize alternado do cmdlet Format-Table dimensiona automaticamente as colunas para evitar Recortar off valores de propriedade, se possível. O código que executa quando a seqüência é "obrigatório" correspondente é mostrada aqui:

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

E aqui está a função GetMandatory:

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

Agora vamos examinar como a função Get­Optional pode exibir as propriedades opcionais de uma classe do AD DS. GetOptional aceita o valor da classe $ que foi recebido na linha de comando via parâmetro –class, ele passa o valor da classe $ para a função GetADSchema junto com a ação chamada "opcional".

Quando a seqüência de caracteres "opcional" for encontrada na instrução switch, uma mensagem é impresso na tela para explicar que exibir propriedades opcionais pode levar alguns segundos. Em seguida, o método de FindClass da classe ActiveDirectorySchema é chamado. O método FindClass retorna uma instância da classe ActiveDirectory­SchemaClass. Se você consultar a propriedade Optional­Properties da classe ActiveDirectorySchema­Class, ela seria retornar propriedades opcionais definidas para a classe escolhida no AD DS.

Os resultados são pipelined para o cmdlet Format-Table, que exibe as informações no mesmo modo como fazia para as propriedades obrigatórias. Eis essa seção do código:

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

O código seguinte é a função GetOptional concluída:

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

A função de auxiliar final é FindClasses, que chama a função GetADSchema e passar dois valores. A primeira é a ação de localizar, e o segundo é a classe para localizar. O objetivo dessa função é ajudá-lo a identificar classes no esquema do AD DS que pode merit mais exploração.

Suponha que você estava interessado em trabalhar com o email. Nesse caso, convém ver quais classes relacionam a email, quais propriedades existem para uma classe aplicável. Como mostra a Figura 6 , primeiro você execute o script com o f –action e –class email parâmetros. Isso retorna todas as classes que possuem a seqüência de caracteres "email" contida em algum lugar o nome. Após localizar uma classe que você está interessado, você explorar as propriedades da classe, escolha a ação de m (obrigatório) e especificando o parâmetro –c (para classe), seguido do nome exato da classe.

fig06.gif

A Figura 6 Localizando uma classe no esquema do AD DS

Quando a função FindClasses chama o GetADSchema, o método FindAllClasses é chamado e a coleção resultante de classes ActiveDirectorySchemaClass é enviada pelo pipeline. Where-Object usa uma correspondência de padrão de expressão regular para procurar por classes que corresponde ao valor armazenado na variável $ classe. Eis o código:

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

E isso é a função de FindClasses:

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

Após todas as funções auxiliares estiverem definidas, você chegar ao ponto de entrada para o script. O ponto de entrada é apenas uma coisa, ele examina a linha de comando e determina qual a função para chamar. Primeiro primeiro que seja marcada é a presença do parâmetro –help. Se o script for executado com –h ou –help, o script irá chamar a função de GetHelp para exibir a Ajuda e, em seguida, sair, da seguinte maneira:

if($help) { GetHelp ; Exit }

Porque o parâmetro –help é procurou primeiro, sua presença na linha de comando trumps tudo. Se o parâmetro –help não foi usado, o script deve avaliar o valor fornecido para o parâmetro –action — que é o parâmetro padrão. Nada digitado na linha de comando será interpretado como um valor para –action se nada mais for usado. Isso dá a vantagem adicional de permitir que a captura de entrada falsa para o script.

A instrução switch é uma ferramenta natural para avaliar os valores fornecidos para –action. As quatro ações são definidas, cada delas chamar a função apropriada. A condição quinta que é definida é a ação padrão e exibe uma mensagem que a ação não é permitida, whereupon ele chama a função GetHelp.

Uma coisa a serem lembrados sobre a instrução switch é que foi possível localizar várias correspondências. Por esse motivo, a instrução de saída é usada após cada chamada para as funções. O código de instrução switch é mostrado aqui:

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} 
}

Bem, que é sobre isso pessoal. Não há nenhum navegador Directory Active, diferente de ADSI Scriptomatic. Mas o script BrowseActive­DirectorySchema.ps1 deve servir bem por enquanto. Para mais diversão script do Active Directory, visite o Hub de script do Directory ativo. E sabe que estamos abrir cada momento do ano na Script Center.

Ed Wilson é um consultor sênior da Microsoft e um especialista script conhecido. Ele é um Microsoft Certified Trainer que fornece um workshop popular do Windows PowerShell para clientes Microsoft Premier em todo o mundo. Ele escreveu oito livros, incluindo vários em scripts do Windows, e ele contribuiu para livros quase uma dúzia. Ed contém mais de 20 certificações de setor.

Craig Liebendorfer é um wordsmith e longtime editor da Microsoft. Craig ainda can’t acredito ’s existe um trabalho que paga-lo para trabalhar com palavras todos os dias. Uma das suas coisas favoritas é irreverent humor, para que ele deve ajustar direita em aqui. Ele considera seu accomplishment maior na vida seja sua filha magnificent.