Administrando AD Directory Services com PowerShell
Introdução
Este artigo visa mostrar ao ITPro formas de otimizar as tarefas de administração Windows Server com PowerShell.
Assume-se que o leitor deste post já possui um ambiente em operação e procura formas de agilizar determinadas tarefas de seu dia a dia.
Vamos usar diversas opções de comandos PowerShell em um domínio chamado contoso.com.
Otimizando tarefas
Criação de contas no Active Directory
Abrir o Windows PowerShell no próprio servidor AD ou em uma estação que possua o pacote admin tool do AD ou RSAT (para Windows Server 2012 para frente).
Importar o módulo Active Directory com o comando abaixo:
Import-Module ActiveDirectory
OBS: Importante frisar que, a partir do Powershell 3.0, os módulos são importados automaticamente. Sem a necessidade do comando Import-Module. O Administrador deverá executa-lo se sua versão for 2.0.
Após import do módulo Active Directory usaremos uma linha de comando que irá criar uma conta no domínio contoso.com – OU Users, já habilitada e com senha definida. Neste comando o usuário, ao efetuar o log on com a nova conta será solicitado a alterar a senha:
New-ADUser -Name "Uilson Souza" -SamAccountName uilson.souza -DisplayName "Uilson Souza" -Title "Conta para acesso corporativo" -Enable $true -ChangePasswordAtLogon $true -AccountPassword (ConvertTo-SecureString "Password123*" -AsPlainText -force) -PassThru -Path "OU=Users,DC=contoso,DC=com"
No comando acima foi criado a conta Uilson Souza com login name uilson.souza, senha Password123*, solicitando troca do password no primeiro logon que for feito, alocada na OU Users do domínio contoso.com.
Os detalhes da conta podem ser listados com o comando get-aduser conforme abaixo:
Get-ADUser uilson.souza –Properties *
O comando acima mostra todas as propriedades do user uilson.souza.
O processo acima pode ficar ainda mais automatizado, caso você precise criar contas para mais de um usuário de uma só vez. Tudo vai depender da realidade em que o ITPro atua. Em casos de áreas operacionais (call centers, etc) em que o administrador precise criar contas para uma lista de novos operadores de call center ou um departamento em que diversos usuários terão sua conta com as mesmas propriedades.
Vamos imaginar que eu criei uma OU chamada CallCenter dentro da OU Users no meu domínio contoso.com e eu tenha que criar contas para 10 novos usuários deste departamento.
O processo pode ser feito de uma só vez a partir do comando FOREACH em um script no PowerShell ISE.
A partir do Windows PowerShell digite o comando ISE e pressione ENTER.
Você será levado ao Windows PowerShell ISE, conforme abaixo:
No script abaixo você poderá criar várias contas ao mesmo tempo a partir de uma variável e um laço criado pelo FOREACH. Dessa forma, ele repetirá a linha de comando acima para todos os usuários deverão estar listados em um arquivo TXT. A diferença é que vamos alocar essas contas numa nova OU chamada CallCenter:
ForEach ($NewUser in (Get-Content C:\UserList.txt)){
New-ADUser -Name "Call Center Operator" -SamAccountName $NewUser -DisplayName "Call Center User" -Title "Call Center User" -Enable $true -ChangePasswordAtLogon $true -AccountPassword (ConvertTo-SecureString "Password123*" -AsPlainText -force) -PassThru -Path "OU=CallCenter,OU=Users,DC=contoso,DC=com")
}
A variável $NewUser irá executar o comando para todos usernames inseridos no arquivo UserList.txt.
Lembrando que seu arquivo de base TXT não deve ter espaços antes ou depois do user name digitado e tampouco linhas em branco. Isso afetará toda execução do comando:
No Windows PowerShell ISE grave o script criado com o nome que lhe for conveniente. No exemplo acima, salvei o arquivo com o nome Script_CriaLogin_CallCenter.PS1 numa pasta chamada PowerShellScripts (C:\PowerShellScripts).
O script acima pode ser executado a partir do Windows PowerShell ISE ou diretamente pelo próprio prompt do Windows PowerShell, posicionado na pasta criada acima e digitando
.\Script_CriaLogin_CallCenter.ps1
Verificando se uma conta está bloqueada
Em determinadas situações o administrador pode querer saber se uma determinada conta está bloqueada, seja de algum usuário que não se conecta a uma estação ou uma determinada conta de serviço.
No item acima mostramos como listar todas as propriedades da conta (get-aduser username –Properties *). Uma dessas propriedades é a “LockedOut” que vai indicar se a conta está bloqueada (True) ou se está desbloqueada (False):
Get-ADUser uilson.souza –Properties LockedOut
Com o comando acima o ITPro determina se a conta está (ou não) bloqueada.
E se o resultado da figura acima fosse “True” ao invés de “False”?
Simplesmente iriamos usar o cmdlet Unlock-ADAccount de diversas maneiras:
Desbloquear a conta que se encontra em estado de LockedOut
Unlock-ADAccount uilson.souza
Podemos usar o FOREACH da mesma forma que usamos no item 1 para aplicar este comando em larga escala:
Import-Module ActiveDirectory
ForEach ($LokedUser in (Get-Content C:\UserList.txt)){
Unlock-ADAcoount $LockedUser
}
Vamos melhorar mais ainda este script? Imagine que temos uma quantidade de usuários que está com a conta bloqueada e não se lembram mais de suas senhas. O comando abaixo vai desbloquear a conta, criar uma nova senha e solicitar a alteração da mesma no primeiro log on:
ForEach ($LockedUser in (Get-Content C:\UserList.txt)){
Unlock-ADAccount $LockedUser
Set-ADAccountPassword -identity $LockedUser -Reset -NewPassword (ConvertTo-SecureString -AsPlainText "!!!zaq12wsx" -Force) -ChangePasswordAtLogon $True
}
A variável $LockedUser vai buscar o conteúdo do arquivo UserList.txt e o aplicará para cada username informado no mesmo arquivo.
Se o ITPro precisa saber quais contas podem estar bloqueadas em uma determinada OU do domínio:
Search-ADAccount -LockedOut -SearchBase "OU=CallCenter,OU=Users,DC=contoso,DC=com" | Select-Object Name,SamAccountName
O comando acima vai listar as contas da OU CallCenter do domínio contoso.com que possam estar bloqueadas.
Habilitando ou desabilitando uma conta
Em uma situação de demissão, férias, ou afastamento de um funcionário da corporação:
Disable-ADAccount –Identity uilson.souza ou simplesmente Disable-ADAccount uilson.souza
Para habilitar a conta:
Enable-ADAccount –Identity uilson.souza ou simplesmente Enable-ADAcount uilson.souza
Caso haja necessidade de execução em lote, o administrador também pode automatizar o processo com o ForEach igual aos exemplo citados acima.
Gerenciando grupos
Abaixo o comando para criação de grupos no AD:
New-ADGroup -Name Dpto_RecursosHumanos -GroupCategory Security -GroupScope Global -DisplayName "Grupo de usuários do Setor Recursos Humanos" -Description "Grupo do setor Recursos Humanos com acesso a Pasta RH no File Server" -Path "OU=RecursosHumanos,DC=contoso,DC=com"
O comando acima cria um grupo na OU RecursosHumanos, na OU Users do domínio contoso.com, com o nome “Depto_RecursosHumanos”, na categoria Security, sendo um grupo Global.
Para inserir usuários em um grupo utilize um dos comandos abaixo:
Get-ADUser uilson.souza | Add-ADPrincipalGroupMembership –MemberOf Dpto_RecursosHumanos –Confirm:$False
O comando acima irá inserir o usuário “uilson.souza” no grupo “Dpto_RecursosHumanos”.
Outra forma de inserir um usuário em um grupo:
Add-ADGroupMember –Identity Dpto_RecursosHumanos –Members uilson.souza –Confirm:$False
Imaginemos o primeiro comando uma situação em que você abre as propriedades do usuário e insere o grupo na aba “Member Of”. O segundo comando retrata a situação em que você acessa as propriedades de um grupo e insere um ou mais usuários na aba “Members”.
Para remover um usuário de um grupo:
Get-ADUser uilson.souza | Remove-ADPrincipalGroupMembership –MemberOf Dpto_RecursosHumanos –Confirm:$False
Ou:
Remove-ADGroupMember –Identity Depto_RecursosHumanos –Members uilson.souza –Confirm:$False
OBS: O parâmetro “-Confirm:$False” fará com que o comando seja executado sem pedir confirmação. Por padrão, toda vez que esses comandos são executados você precisa confirmar, conforme abaixo:
Vamos analisar agora dois cenários bem comuns na inserção de usuários via PowerShell.
Caso 1 – O ITPro precisa inserir no grupo Depto_RecursosHumanos, todos os usuários da OU RecursosHumanos que fica na OU Users do domínio contoso.com. Veja abaixo como montar essa linha de comando:
Get-ADUser –Filter * -SearchBase “OU=RecursosHumanos,OU=Users,DC=contoso,DC=com” | Add-ADPrincipalGroupMembership –MemberOf Dpto_RecursosHumanos –Confirm:$False
O comando acima irá inserir todos os usuários da OU no grupo.
Caso 2 – O ITPro precisa inserir uma lista de usuários em diversos grupos. Imagine que um grupo de usuários precisa de acesso a uma série de grupos que vão lhes permitir usar determinadas aplicações ou entrar em um conjunto de pastas em seu File Server. Veja abaixo como ficaria esse script:
$UserNames = Get-Content C:\UserList.txt
$GroupNames = Get-Content C:\Groups.txt
ForEach ($Group in $GroupNames) {
ForEach ($User in $UserNames) {
Add-ADGroupMember -Identity $Group -Members $User -Confirm:$False
}
}
No Script acima o administrador vai buscar em dois arquivos a lista de usuários (UserList.txt) e de grupos (Groups.txt). O “ForEach” faz o laço entre as listas fazendo com que todos os usuários listados no TXT de users, sejam inclusos nos grupos listados no TXT de grupos.
Relembrando – O parâmetro “-Confirm:$False”, se não colocado vai fazer com que uma mensagem de confirmação apareça antes de processar o script.
OBS: Os dados inseridos nos arquivos TXT não podem conter espaços antes ou depois do nome de usuário ou grupo e também não podemos ter linhas em branco. Isso ocasiona um erro na execução do script
Consultando dados de usuários e grupos
Uma das partes mais importantes dos cmdlets do módulo ActiveDirectory é o fato de poder extrair informações do AD Users and Computers relativas a usuários e grupos.
No item 1 deste artigo mostramos como exibir todas as propriedades da conta de um usuário. Obviamente que é interessante montar consultas mais apuradas.
Consulta 1 – Você precisa informar ao determinado gerente quem são os usuários do setor financeiro. É necessário informar o nome e o username do funcionário:
get-aduser -Filter 'Department -eq "Financeiro"' -SearchBase "OU=Users,DC=contoso,DC=com" | Select-Object Name,SamAccountName
Outra forma de pegar esta informação e organizar seus departamentos por OU (Organizational Unit). Dessa forma, além de um melhor controle, você utilizaria até menos parâmetros nas linhas de comando do PowerShell. Abaixo uma consulta de usuários do setor financeiro, sabendo que todos ele estão na OU Financeiro:
Get-ADUser –Filter * -SearchBase “OU=Financeiro,OU=Users,DC=Contoso,DC=com” | Select-Object Name,SamAccountName
Consulta 2 – Preciso saber em quais grupos o usuário “uilson.souza” está inserido:
Get-ADUser uilson.souza | Get-ADPrincipalGroupMembership | Select-Object Name
Consulta 3 – Preciso saber a qual OU (detalhes) o usuário uilson.souza está cadastrado:
Get-ADUser uilson.souza | Select-Object DistinguishedName
Consulta 4 – O usuário uilson.souza voltou de férias, mas, não consegue se fazer log on na rede. Será que sua conta já foi habilitada? Será que ele esqueceu sua senha, digitou errado além do limite permitido na política do AD e a bloqueou? O comando abaixo mostra como extrair essa informação
Get-ADUser uilson.souza –Properties LockedOut,Enabled
Se o resultado do campo LockedOut for “True”, então é necessário desbloquear a conta. Se o resultado do campo Enabled for “Fase”, você precisa habilita-la. Esses comandos foram mostrados neste artigo (seções 2 e 3).
Consulta 5 – Preciso saber quem são os usuários do grupo “Acesso Web Application”:
Get-ADGroupMember –Identity “Acesso Web Application” | Select-Object Name,SamAccountName
O comando acima mostra os usuários que pertencem ao grupo “Acesso Web Application”. O parâmetro “Select-Object” irá trazer duas colunas (lado a lado) com o nome e o username.
Consulta 6 – Quero saber quais contas estão desabilitadas em meu domínio:
Get-ADUser -Filter * | where-object {$_.Enabled -eq $False} | Select-Object Name,SamAccountName
Com o comando acima você saberá quais contas estão desabilitadas. O parâmetro “Select-Object” irá trazer duas colunas (lado a lado) com o nome e o username.
Para o caso do seu domínio conter múltiplas florestas em diversos países, a consulta usando o comando acima pode causar lentidão e demorar a lhe trazer o resultado. Abaixo você pode refinar a busca a partir da OU do País em questão. Se sua empresa possui filiais em vários países e a você só interessa buscar contas desabilitatas
Get-ADUser -Filter * -SearchBase "OU=Brazil,DC=contoso,DC=com" | where-object {$_.Enabled -eq $False} | Select-Object Name,SamAccountName
Consulta 7 – Das contas inativas, quero saber quais que não se conectam a mais de 30 dias
Search-ADAccount -UsersOnly -AccountInactive -TimeSpan 30.00:00:00 -SearchBase "OU=Users,OU=Brazil,DC=corp,DC=axa-assistance,DC=us" | Select-Object Name,SamAccountName
Você também pode desabilitar essas contas, obviamente, tendo certeza de que nenhuma delas irá mais voltar:
Search-ADAccount -UsersOnly -AccountInactive -TimeSpan 30.00:00:00 -SearchBase "OU=Users,OU=Brazil,DC=corp,DC=axa-assistance,DC=us" | Disable-ADAccount
Movendo Objetos
Exemplo: O usuário Uilson Souza (username – uilson.souza) pertence a OU Tecnologia dentro de Users no domínio contoso.com. Depois de anos de trabalho árduo, ele foi promovido para Gerência de TI. Sua conta de usuário deve ser movida da OU atual para a OU ITManagement. Abaixo o comando:
get-aduser uilson.souza | Move-ADObject -TargetPath "OU=ITManagement,OU=Users,OU=contoso,DC=com"
A mesma linha de raciocínio pode ser feita com grupos, computadores, etc.
Conclusão
Este artigo mostrou diversos exemplos de comandos e script´s PowerShell para automatizar tarefas do dia a dia do ITPro que atua com administração de usuários no AD Directory Services.
Muitos outros exemplos poderiam ser mostrados, entretanto, deixo livre para que mais informações possam ser inseridas.
O blog Microsoft Space está seguindo uma linha de posts voltados a automatização de tarefas com Powershell em diversas frentes: IIS, AD Federation Services, Web Application Proxy e o próprio AD DS. Recomendo a leitura dos posts citados neste blog.