Automatização de tarefas com PowerShell
Como realizar a automatização de tarefas com o PowerShell
Por quê automatizar?
O powershell é um shell de linha de comando baseado no .NET que pode ser utilizado para gerenciamento e automatização de tarefas.
Cada vez mais, a automatização de tarefas, traz grandes benefícios para o dia a dia do administrador do ambiente.
Além de prevenir o erro humano, na execução de tarefas rotineiras, possibilita que seja redirecionado os esforços do profissional para tarefas mais nobres.
Nesse artigo, estarei demonstrando de forma clara, simples e objetiva, como automatizar uma tarefa.
Versão do Powershell
É importante mencionar que estou utilizando a versão 7.1.0 (versão estável mais recente até o momento). Se você utiliza uma versão anterior à 7.0.1 recomendo que você atualize.
Para conferir sua versão utilize o comando Get-Host
Link para download https://github.com/PowerShell/PowerShell/releases/tag/v7.1.0
Automatizar o quê?
Atrevo-me a dizer que quase tudo pode ser automatizado quando aliamos algumas tecnologias. Quando utilizamos o Powershell em conjunto com o Active Directory, podemos facilitar em muito à implementação de mudanças no ambiente.
Um exemplo disso é quando um administrador de rede necessita alterar o padrão de hostnames de seu ambiente.
Como alterar o hostname automaticamente?
Cada administrador avalia quais parâmetros irá seguir para conduzir à mudança dos hostnames no seu ambiente. Nesse exemplo vamos ver como podemos automatizar o processo de troca de hostnames da rede através de um script.
Nosso script irá consultar o número de série de um equipamento em um arquivo.txt e retornará o patrimônio correspondente a esse numero de série.
Criando o arquivo .txt
É claro que automatizar uma tarefa assim envolve mais do que criar o script. No nosso exemplo, ter um arquivo .txt seguindo o padrão conforme abaixo (informações separadas por vírgula) será essencial.
Obs: Como estou usando uma VM, o número de série tem esse formato, no entanto, a princípio é o mesmo para qualquer equipamento.
Criando o script
Para segmentar o processo, dividi o script em funções.
A função Detect-Serial retorna o valor formatado do número de série do equipamento. Como assim?
Explicando a função:
A variavel $serialobject recebe o número de serie do equipamento através do cmdlet Get-CIMInstance win32_bios.
Format-list = Formata a saída do cmdlet como lista;
Out-String = Converte a saída para o tipo string.
No entanto, ao buscar o número de série do equipamento utilizando o comando Get-CIMInstance win32_bios não obtemos um retorno formatado. Observe:
Para realizar a formatação:
Acima eu retiro utilizo o parametro -replace, onde:
'\s' = representa os espaços em branco;
'' = É o que irá substituir os espaços em branco. No nosso exemplo deixamos sem nenhum valor, visto que não queremos substituir os espaços em branco por nenhum outro caractere.
Veja a saída:
Por fim, a variável $serial irá armazenar a substring da variável $serialobject a partir do “:”.
Resultado:
Com isso obtemos podemos realizar a pesquisa no arquivo .txt.
Pesquisando no TXT
Para pesquisar a informação no arquivo.txt e retornar o valor que queremos eu criei a função RetornaPatrimonio.
Explicando a função:
Para realizarmos a pesquisa no .txt utilizamos o Select-String.
-Path = O caminho onde o arquivo está;
-Pattern = O que deseja procurar. No meu caso eu desejava procurar o resultado da função Detect-Serial.
Resultado:
Formatando a saída:
Dessa vez a substring quer será selecionada segue um padrão diferente. A variável $number recebe uma substring de $numberobj a partir da última ‘,’.
Vemos assim que o valor que a variável $number recebe é o 000200. O arquivo numeros_serie.txt mostra então, que o número de patrimônio correspondente ao serial da máquina é 000200.
Importante: Nesse processo, cada administrador deve avaliar as saídas do prompt para efetuar uma formatação precisa. Isso irá ajudar na execução correta do script.
Alterando o nome
Para isso criarei duas funções. A função SetCredential e a função AlterarNome.
Conforme vamos ver, é necessário termos uma credencial do domínio para que a alteração do nome seja feita.
A função SetCredential
A função SetCredential atribui a uma variável $credential um novo objeto da classe PSCredential que irá armazenar as credenciais.
Os parâmetros para se criar esse objeto são “dominio\usuario, senha”. Porém, o powershell não aceita que uma senha seja adicionada sem criptografia, por isso, é necessário utilizar a função ConvertTo-SecureString. Com isso, a senha fica criptografada no sistema.
Importante: Por mais que o powershell realize a criptografia, sua senha ainda estará exposta no código fonte do script. Portanto, é importante prestar atenção para que o usuário utilizado na execução do script somente tenha permissões para o que for necessário.
A função AlterarNome
Antes de alterar o hostname, eu atribuo à variavel $NovoNomeComputer o padrão de nomenclatura que desejo. No caso ‘PCLAB’ + O numéro de patrimônio.
Por fim, utilizando o cmdlet Rename-Computer eu altero o nome da máquina.
-ComputerName = hostname atual;
-NewName = novo hostname;
-LocalCredential ou DomainCredential = As credenciais utilizadas para validar a ação.
Por fim, agendamos uma reinicialização após 30 minutos.
Executando o script
Após salvar o arquivo em formato .ps1, será necessário executar seguindo alguns padrões específicos.
Para isso, criei um arquivo .bat que chama o script Powershell (que dei o nome de hostname.ps1).
Veja abaixo:
É fundamental utilizarmos o paramêtro -ExecutionPolicy Bypass para que o script consiga ser executado.
Outro detalhe no arquivo acima é: a primeira linha executa o script utilizando o Powershell versão 5.1 enquanto a segunda linha o executa usando a versão 7.1. Fica a critério do administrador do ambiente qual versão será utilizada.
Melhore o processo!
As possibilidades do Powershell vai bem, além disso. Como disse, é uma demonstração básica de como automatizar um processo.
Somente no nosso exemplo, podemos pensar em várias formas de melhorar nosso código, como:
- Criar um arquivo de log para identificarmos possíveis erros,
- Estruturas condicionais para deixar o script ‘mais inteligente’,
e assim por diante.
Portanto, pense em suas necessidades e mãos à obra!
Conclusão
Com esse script, simples e objetivo, conseguimos ter uma base de como automatizar o processo de alteração de hostnames em um ambiente Windows.
Através de pesquisa em um arquivo .txt, identificamos informações necessárias para compor o novo hostname do computador e então fazer á alteração de forma automatizada em sua rede.
Referências
https://docs.microsoft.com/en-us
Thomas Rodrigues parabéns pelo artigo! Ficou bem explicado e de fácil entendimento.
Ansioso para o próximo.
Continue firme forte!
Abraços.