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 PowerShell que permitiria que você procure o esquema do Active Directory. Ele é chamado, oddly suficiente, BrowseActiveDirectorySchema.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 .
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.
A Figura 3 chamando o script com the–help alternar
O Nitty-Gritty
Agora, chegamos à função GetADSchema — aquele que faz a maior parte do trabalho real para o script na Figura 1 . A chave aqui está usando a classe DirectoryServices.ActiveDirectory.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 GetCurrentSchema).
O método estático GetCurrentSchema retorna uma instância de uma classe ActiveDirectorySchema que representa o esquema ao qual você está conectado no momento. a Figura 4 mostra os membros da classe ActiveDirectorySchema.
Depois de criar uma instância da classe DirectoryServices.ActiveDirectory.ActiveSchema .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 GetADSchema 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 .
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 GetOptional 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 ActiveDirectorySchemaClass. Se você consultar a propriedade OptionalProperties da classe ActiveDirectorySchemaClass, 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.
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 BrowseActiveDirectorySchema.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.