O Windows PowerShell Automatizando o usuário de configuração, parte 2

Don Jones

Conteúdo

Criar um usuário
Faltando Exchange?
Opções, opções, opções

Na edição anterior desta coluna, criei a base para um usuário automatizada script de configuração. Criei uma função chamada ProvisionInputCSV, que foi criado para ler informações do usuário de um arquivo CSV e retornar informações na forma de um hashtable. Levou dessa abordagem porque ele permitido-me para em seguida, criar várias outras "Importar" funções — importar de um banco de dados, importar de uma planilha, ou qualquer — e ter cada um retorno um hashtable procurando idênticos. Minha função de provisionamento real simplesmente precisa aceitar hashtable, que pode conter elementos de um usuário primeiro nome, último nome, cidade, departamento e assim por diante.

Na coluna deste mês, pode começar a usar esse hashtable para criar um usuário novo, a caixa de correio habilitada no Active Directory (ou um usuário não-caixa de correio,) se você não estiver usando o Exchange Server 2007.

A estrutura básica da função provisionamento tem esta aparência:

Function Provision {
  PROCESS {
  }
}

Eu já tiver estabelecido que a função será exibida uma hashtable no pipeline, que ele irá acessar via a variável especial $ _ dentro a scriptblock PROCESS. A hashtable terá chaves que correspondem a atributos de usuário, e os valores de nessas chaves conterá informações de cada usuário. Estes são alguns exemplos:

  • $ _ ['sn'] = "Jorge"
  • $ _ ['givenname'] = "Don"
  • $ _ ['samaccountname'] = "donj"

Atributos disponíveis exatos dependerá o que você tenha coloca em sua função ProvisionInputCSV ou outra função de importação.

Lembre-se de que a configuração de usuário geralmente envolve várias etapas, como a criação de uma conta, criar uma pasta e assim por diante. Seria fácil fique todas essas tarefas em minha função de criar, mas isso tornaria a função bastante complicada — e mais complicada significa mais difícil depurar e solucionar problemas. Em vez disso, usarei a função criar como uma espécie de lista de tarefas mestre, dividindo cada tarefa check-out em sua própria função da subsidiária. No final, a função criar aparência será semelhante a esta:

Function Provision {
  PROCESS {
    CreateUser $_
    CreateHomeFolder $_
    AddToGroups $_
    UpdateAttributes $_
  }
}

O Windows PowerShell perguntas e respostas

P não vejo um parâmetro –computerName na muito vários cmdlets. O Windows PowerShell pode ser usado para gerenciar computadores remotos?

A versão do Windows PowerShell 1 limitou os recursos de sistema de interação remota. O cmdlet Get-WmiObject oferece, como você pode ter descobertos, um parâmetro nome_do_computador para que você possa recuperar informações de um ou mais computadores remotos, assim:

Get-WmiObject Win32_Service –computerName
  "localhost","server2","server3"

Mas isso é sobre a capacidade de gerenciamento remoto apenas interno que você encontrará a primeira versão do Windows PowerShell.

No entanto, outras tecnologias, como o Exchange Server e o Active Directory, são inerentemente "remotos" — isto é, o computador cliente sabe não é um servidor de email ou um controlador de domínio e será um contato como apropriado. Portanto, você não precisa realmente um nome_do_computador parâmetro - para comandos que funcionam com essas tecnologias.

Cada uma das quatro funções de subsidiárias manipula uma das principais tarefas que descritas a primeira parte desta série e cada está sendo passada o conjunto completo de informações do usuário na variável $ _. Portanto, há — o meu script provisionamento é feito!

Criar um usuário

Apenas brincando. Obviamente, ainda preciso escrever a funcionalidade real, que reside nessas quatro funções da subsidiária. Nesta parte, eu focar a função de CreateUser. A primeira iteração esse código pressupõe que você tenha o Exchange Server 2007 em seu ambiente. (Infelizmente, isso não funcionar para versões anteriores do Exchange Server.) Qualquer computador que está usando para executar esse script deve ter as ferramentas de gerenciamento do Exchange Server instalado, e você terá que verifique se que o snap-in Exchange Server para o Windows PowerShell é carregado. Para verificar, executar Get-PSSnapin e veja se ele é listado. Se não for, executar Get-PSSnapin-registrado para verifique se ele é instalado. Em seguida, para carregar o snap-in em shell, execute este:

Add-PSSnapin Microsoft.Exchange.Management.PowerShell.Admin. 

Se você obtiver Cansado de digitar esse comando, você pode adicioná-lo para o script que contém todas as funções de configuração ou você pode adicioná-lo ao seu perfil do Windows PowerShell para que ele carga quando você abre o shell. (Eu expliquei como você pode criar perfis personalizados na edição de outubro de 2008 desta coluna " O poder de perfis."

Aqui está a estrutura básica para minha função:

Function CreateUser {
  Param($userinfo)
}

Observe que eu incluí um bloco de parâmetro, que informa o shell de quais parâmetros que estou esperando. Quando eu chamar essa função, a hashtable que eu passo serão automaticamente armazenado na variável $ userinfo.

Há outra maneira de escrever isso:

Function CreateUser($userinfo) {
}

Essa sintaxe tem exatamente o mesmo efeito. No entanto, o shell usa a primeira versão internamente para que tendem a usar essa versão mesmo. Eu também acho que usando o bloco de parâmetro torna a função mais fácil de ler pressionada durante viagens.

Dentro da função, precise executar apenas um único comando: nova caixa de correio. Isso, na verdade, mais do que apenas criar uma nova caixa de correio; ele também cria um novo usuário no Active Directory. Preciso saber algumas partes de informação com antecedência, incluindo o banco de dados da caixa de correio onde desejo que a caixa de correio a ser armazenado. A sintaxe básica fica assim (que é, na verdade, todos os uma longa e única linha de comando):

New-Mailbox –UserPrincipalName don@concentratedtech.com 
  -alias DonJ 
  –database "Storage Group 1\Mailbox Database 1" 
  –name Don Jones 
  –organizationalUnit Users 
  –password $password 
  –FirstName Don 
  –LastName Jones 
  –DisplayName "Don Jones" 
  –ResetPasswordOnNextLogon $true

Você pode ver o que eu preciso surgir com uma senha para o novo usuário e decidir qual OU (unidade organizacional) para colocar o usuário no. (Neste exemplo, "usuários" é tecnicamente um contêiner, não uma OU, mas o comando aceita um.) Supondo que minha função ProvisionInputCSV foi modificada para produzir tudo o que precisa, pode esperar a variável de userinfo $ para conter as seguintes informações ­minimum:

  • UPN (nome principal de usuário)
  • OU (unidade ORGANIZACIONAL de destino)
  • MailDatabase
  • givenName (primeiro nome)
  • sn (Sobrenome)
  • samAccountName (que será utilizo como 'alias')

Que me oferece a seguinte função:

Function CreateUser {
  Param($userinfo)

New-Mailbox –UserPrincipalName $userinfo['upn'] 
  -alias $userinfo['samAccountName'] 
  –database $userinfo['mailboxDatabase'] 
  –name ($userinfo['givenName'] + ' ' + $userinfo['sn']) 
  –organizationalUnit $userinfo['ou'] 
  –password 'P@ssw0rd!' –FirstName ($userinfo['givenName'] 
  –LastName $userinfo['sn']) 
  –DisplayName ($userinfo['givenName'] + ' ' + $userinfo['sn']) 
  –ResetPasswordOnNextLogon $true
}

(Novamente, o comando deve ser uma única linha, mas eu tiver quebrado aqui para facilitar a síntese.) Combinado com Meus funções de criar e ProvisionInputCSV, essa função criará os novos usuários e torná-los como caixa de correio habilitada.

Poucas coisas interessantes pena observar aqui:

  • Nada no comando diferencia maiúsculas de minúsculas, embora o Active Directory preserva qualquer casing você usar em coisas como nomes.
  • Eu estou fornecendo os - parâmetros de nome e - displayName uma expressão como um valor. EU colocar a expressão (entre parênteses) para verificar o shell avalia a expressão e passa os resultados para o parâmetro. Essa técnica permite que eu use os atributos givenName e sn para construir um nome completo.
  • Eu já embutida em uma senha temporária em vez de fazer um backup. Fazer backup de senhas requer uma maneira de comunicar-se as senhas para usuários e que está fora do escopo desta discussão.
  • A variável $ true é criado para o shell e representa o valor booleano True (o oposto do False).

Faltando Exchange?

O Windows PowerShell não ajuda na criação de um usuário habilitado para caixa de correio se você não estiver usando o Exchange Server 2007. No entanto, você ainda pode criar a conta de usuário básicos no Active Directory. Para fazer isso, você precisa os cmdlets do Active Directory livres para o Windows PowerShell, que estão disponíveis no www.Quest.com/PowerShell. Instale aqueles no computador em que você vai ser executando o script e adicionar o snap-in para o shell executando isso:

Add-PSSnapin Quest.ActiveRoles.ADManagement 

Observe que o nome do snap-in inclui o nome de um produto comercial de Quest (ActiveRoles Server), mas você não precisará desse produto para usar os cmdlets no snap-in.

Você usará o comando New-QADUser, executando algo assim na função de CreateUser:

New-QADUser –samAccountName $userinfo['samAccountName'] 
  –parentContainer $userinfo['OU'] 
  –FirstName $userinfo['givenName'] 
  –LastName $userinfo['sn'] 
  –Name ($userinfo['givenName'] + ' ' + $userinfo['sn']) 
  –UserPrincipalName $userinfo['UPN'] 
  –displayName ($userinfo['givenName'] + ' ' + $userinfo['sn']) 
  –userPassword "P@ssw0rd!" | Enable-QADUser

Observe que eu já enviada por pipe a saída desse comando, que consiste o usuário recém-criado — a um segundo comando que permite que a conta de usuário. Você pode decidir se esse design é apropriado para seu ambiente.

O comando New-QADUser tem dezenas de parâmetros que você pode usar para definir atributos adicionais do Active Directory, mas eu estou deixando este comando como - é para torná-lo mais paralelo com a versão do Exchange Server. Irá preencher atributos adicionais a última parte desse script.

Opções, opções, opções

Mesmo se você executar o Exchange Server 2007, você ainda pode preferir usar QADUser de novo para criar contas de usuário. Isso certamente oferece mais flexibilidade, como esse comando pode manipular qualquer atributo de diretório. E New-QADUser irá fazer o script compatível com qualquer ambiente, se o Exchange Server 2007 está em uso ou não.

Se você tiver o Exchange Server 2007, você pode usar uma sintaxe alternativa de New-Mailbox para criar uma caixa de correio e vinculá-lo à conta do Active Directory recém-criado. Você verá que o Windows PowerShell normalmente oferece várias maneiras diferentes de fazer algo — a abordagem certa normalmente é aquele que funciona melhor para você com o mínimo de aprendizado envolvidos.

Próximo mês, eu vamos dar essa função configuração um pouco mais fazendo criar pastas base para usuários e se aplicam a direita Access Control Lists (ACLs) para as pastas. As ACLs são especialmente difícil trabalhar com, e você pode ser surpreso com o Windows PowerShell técnica que pode ajudar a fazer o trabalho com mais facilidade.

Don Jones é co-fundador da Tecnologia concentrarem, onde blogs he semanais sobre aplicativos do Windows PowerShell, SQL Server,-V e outros tópicos. Entrar em contato com ele através de seu site.