arte powershell.pdf 1 19/09/17 18:08 - static.fnac-static.com · sobre como interagir com sistemas...

24

Upload: dangdung

Post on 07-Feb-2019

212 views

Category:

Documents


0 download

TRANSCRIPT

C

M

Y

CM

MY

CY

CMY

K

Arte Powershell.pdf 1 19/09/17 18:08

EDIÇÃO FCA – Editora de Informática, Lda. Av. Praia da Vitória, 14 A – 1000-247 Lisboa Tel: +351 213 511 448 [email protected] www.fca.pt DISTRIBUIÇÃO Lidel – Edições Técnicas, Lda. Rua D. Estefânia, 183, R/C Dto. – 1049-057 Lisboa Tel: +351 213 511 448 [email protected] www.lidel.pt LIVRARIA Av. Praia da Vitória, 14 A – 1000-247 Lisboa Tel: +351 213 511 448 * Fax: +351 213 522 684 [email protected] Copyright © 2016, FCA – Editora de Informática, Lda. ISBN edição impressa: 978-972-722-879-9 1.ª edição eBook: maio 2016 1.ª edição impressa: setembro 2017 Impressão e acabamento: Realbase – Soluções Informáticas, Lda. Depósito Legal n.º 427300/17 Capa: José Manuel Ferrão – Look-Ahead

Todos os nossos livros passam por um rigoroso controlo de qualidade, no entanto aconselhamos a consulta periódica do nosso site (www.fca.pt) para fazer o download de eventuais correções. Não nos responsabilizamos por desatualizações das hiperligações presentes nesta obra, que foram verificadas à data de publicação da mesma. Os nomes comerciais referenciados neste livro têm patente registada.

Reservados todos os direitos. Esta publicação não pode ser reproduzida, nem transmitida, no todo ou em parte, por qualquerprocesso eletrónico, mecânico, fotocópia, digitalização, gravação, sistema de armazenamento e disponibilização de informação,sítio Web, blogue ou outros, sem prévia autorização escrita da Editora, exceto o permitido pelo CDADC, em termos de cópia privadapela AGECOP – Associação para a Gestão da Cópia Privada, através do pagamento das respetivas taxas.

Marcas Registadas de FCA – Editora de Informática, Lda. – ®® ®

©© FFCCAA

ÍÍNNDDIICCEE GGEERRAALL

AGRADECIMENTOS .............................................................................................. IX

SOBRE O LIVRO ..................................................................................................XI O que posso encontrar neste livro? ........................................................................................................ XI Requisitos .................................................................................................................................................. XI A quem se dirige este livro? .................................................................................................................. XII Convenções .............................................................................................................................................. XII Organização do livro .............................................................................................................................. XII

Capítulo 1: Introdução ................................................................................................................... XIII Capítulo 2: Aspetos Básicos .......................................................................................................... XIII Capítulo 3: Scripting ....................................................................................................................... XIII Capítulo 4: Administração de Sistemas ....................................................................................... XIII Capítulo 5: Administração Remota ............................................................................................. XIV

Suporte ................................................................................................................................................... XIV

1. INTRODUÇÃO ................................................................................................... 1 1.1. O que é a PowerShell? .......................................................................................................................... 1 1.2. Porquê aprender PowerShell? ............................................................................................................. 6 1.3. CLI da PowerShell ................................................................................................................................ 7

1.3.1. Versão utilizada ...................................................................................................................... 11 1.3.2. Primeira demonstração prática ............................................................................................. 12

Conclusão .................................................................................................................................................. 15 Sites de consulta ....................................................................................................................................... 15

2. ASPETOS BÁSICOS .......................................................................................... 17 2.1. Comandos PowerShell: cmdlets ......................................................................................................... 17

2.1.1. Utilização de parâmetros ....................................................................................................... 18 2.1.2. Aliases ....................................................................................................................................... 22 2.1.3. Conjuntos de parâmetros (parameter sets) ............................................................................ 24

2.2. Cmdlet Get-Help .................................................................................................................................. 25 2.2.1. Atualização da ajuda .............................................................................................................. 29 2.2.2. Tópicos de ajuda ..................................................................................................................... 30

2.3. Cmdlet Get-Command ......................................................................................................................... 31 2.4. Pipelines .............................................................................................................................................. 36 2.5. Cmdlet Get-Member ............................................................................................................................ 40

2.5.1. Um exemplo completo ........................................................................................................... 41 2.6. Formatação ........................................................................................................................................ 44

2.6.1. Cmdlet Format-List ................................................................................................................... 44 2.6.2. Cmdlet Format-Table ................................................................................................................ 47 2.6.3. Cmdlet Format-Wide ................................................................................................................. 48

PPOOWWEERRSSHHEELLLL

©© FFCCAA

VI

Conclusão .................................................................................................................................................. 49 Sites de consulta ....................................................................................................................................... 49

3. SCRIPTING ................................................................................................... 51 3.1. Variáveis............................................................................................................................................. 51

3.1.1. Declaração e inicialização de variáveis ................................................................................ 53 3.1.2. Tipos de variáveis ................................................................................................................... 54 3.1.3. Âmbitos (scopes) ...................................................................................................................... 56 3.1.4. Uso de variáveis em comandos ............................................................................................ 57 3.1.5. Strings ....................................................................................................................................... 58 3.1.6. Arrays ....................................................................................................................................... 61 3.1.7. Hash tables ................................................................................................................................ 62

3.2. Instruções de decisão e de repetição............................................................................................... 65 3.3. Funções ............................................................................................................................................... 68

3.3.1. Utilização de parâmetros ....................................................................................................... 69 3.3.2. Parâmetros do tipo switch ...................................................................................................... 71 3.3.3. Aspetos avançados ................................................................................................................. 72

3.4. Scripts ................................................................................................................................................ 74 3.4.1. Outros aspetos interessantes ................................................................................................. 77

3.5. Tratamento de erros ........................................................................................................................ 78 Conclusão ................................................................................................................................................ 80 Sites de consulta ...................................................................................................................................... 80

4. ADMINISTRAÇÃO DE SISTEMAS .......................................................................... 81 4.1. Introdução .......................................................................................................................................... 81 4.2. Interação com ficheiros .................................................................................................................... 81

4.2.1. Criação de pastas .................................................................................................................... 84 4.2.2. Copiar ficheiros ....................................................................................................................... 85 4.2.3. Mover ficheiros ....................................................................................................................... 87 4.2.4. Modificar nome de ficheiros ................................................................................................. 87 4.2.5. Eliminar ficheiros ................................................................................................................... 87 4.2.6. Permissões ............................................................................................................................... 88

4.3. Impressoras ........................................................................................................................................ 89 4.4. Registo do Windows .......................................................................................................................... 91

4.4.1. Providers PowerShell ................................................................................................................ 92 4.4.2. Exemplos de interação com o Registo do Windows ............................................................ 94

4.5. Rede (networking) .............................................................................................................................. 96 4.5.1. Ligações de rede ..................................................................................................................... 97 4.5.2. DNS (Domain Name System) no lado cliente ...................................................................... 100 4.5.3. Diagnóstico de ligações de rede ......................................................................................... 103 4.5.4. Mapeamento de shares de rede ........................................................................................... 105

4.6. Sistema operativo ............................................................................................................................ 107 4.6.1. Sessões CIM ........................................................................................................................... 114 4.6.2. Filtragem de resultados obtidos ......................................................................................... 117

4.7. ADSI (Active Directory Services Interface) ...................................................................................... 117 4.7.1. Criação e eliminação de objetos .......................................................................................... 121

ÍÍNNDDIICCEE GGEERRAALL

©© FFCCAA

VII

4.7.2. Modificação de objetos ........................................................................................................ 122 4.7.3. Considerações finais ............................................................................................................. 123

4.8. Módulo Active Directory ................................................................................................................. 124 4.9. Utilização de jobs ............................................................................................................................. 130 4.10. Gestão de pacotes de instalação (Package Management) ............................................................ 135

4.10.1. Módulo PackageManagement .............................................................................................. 136 4.10.2. Providers ............................................................................................................................... 136 4.10.3. Repositórios de pacotes ..................................................................................................... 138 4.10.4. Gestão de pacotes ............................................................................................................... 138 4.10.5. Módulo PowerShellGet ........................................................................................................ 142

Conclusão ................................................................................................................................................ 143 Sites de consulta ..................................................................................................................................... 144

5. ADMINISTRAÇÃO REMOTA ............................................................................... 145 5.1. Aspetos básicos ............................................................................................................................... 145 5.2. Configuração ................................................................................................................................... 146

5.2.1. Cmdlet Enable-PSRemoting .................................................................................................... 148 5.2.2. Modificação das permissões das configurações de sessão .............................................. 149 5.2.3. Modificação dos privilégios do utilizador ........................................................................ 150 5.2.4. Observações finais ................................................................................................................ 150

5.3. Utilização ......................................................................................................................................... 151 5.3.1. Cmdlets com parâmetro ComputerName ............................................................................. 151 5.3.2. Sessões interativas ................................................................................................................ 152 5.3.3. Invocação remota de comandos ......................................................................................... 153 5.3.4. Sessões persistentes .............................................................................................................. 155

5.4. Sessões remotas CIM ...................................................................................................................... 157 5.5. Jobs remotos ..................................................................................................................................... 159 Conclusão ................................................................................................................................................ 162 Sites de consulta ..................................................................................................................................... 162

ÍNDICE REMISSIVO ........................................................................................... 163

© FCA

AAGGRRAADDEECCIIMMEENNTTOOSS

Em primeiro lugar, quero agradecer à minha esposa, Marina, pelo apoio fornecido durante todo o processo de escrita do livro.

Não posso deixar de referir a participação do Belarmino Mendonça, do Luís Filipe Barros, do Helder Robinson, do Rui Melo e do Nuno Gomes. As suas revisões, contribuições técnicas e opiniões sinceras tiveram uma influência positiva no resultado final.

Finalmente, queria também agradecer à Ana Correia e à Laura Faia (da FCA) pela disponibilidade demonstrada ao longo do projeto.

Luís Abreu

Em primeiro lugar, quero agradecer à minha esposa, Eugénia, e ao meu filho, Carlos, por todo o apoio e incentivo.

Quero ainda aproveitar esta oportunidade para agradecer ao meu amigo Luís Abreu, pelo desafio para participar na criação deste livro. Não posso, também, deixar de referir a participação do Belarmino Mendonça, do Luís Filipe Barros, do Helder Robinson, do Rui Melo e do Nuno Gomes. As suas revisões, contribuições técnicas e opiniões sinceras tiveram uma influência positiva no resultado final.

Finalmente, queria também agradecer à Ana Correia e à Laura Faia (da FCA) pela disponibilidade demonstrada ao longo do projeto.

Paulo Morgado

© FCA

SSOOBBRREE OO LLIIVVRROO

Nos últimos anos, a PowerShell tem ganhado cada vez maior popularidade e peso na administração e automatização de sistemas Windows. Neste livro, tentamos descrever e apresentar as principais caraterísticas associadas ao uso da PowerShell. Como veremos, des-crever exatamente o que é a PowerShell acaba por ser uma tarefa bem difícil. A PowerShell não é só uma consola para execução de comandos. Também não é só uma linguagem de scripting. Na realidade, estas são apenas duas das faces mais visíveis deste ambiente de execução, cujas principais funcionalidades serão analisadas neste livro.

OO QQUUEE PPOOSSSSOO EENNCCOONNTTRRAARR NNEESSTTEE LLIIVVRROO?? Este livro centra-se na apresentação das principais caraterísticas e funcionalida-

des disponibilizadas pela PowerShell. Para além de introduzir o leitor ao mundo da PowerShell e de fornecer os princípios básicos que servirão de ponto de partida para a exploração deste ambiente de execução, apresenta vários exemplos práticos de diferentes áreas nas quais a utilização da PowerShell contribui para o aumento da eficácia e da pro-dutividade dos utilizadores (administradores de sistema e programadores).

Assim, ao longo deste livro, o leitor poderá, por exemplo, encontrar informação sobre como interagir com sistemas de ficheiros e registo do Windows. Para além disso, apre-senta alguns comandos que podem auxiliar o leitor a efetuar a deteção e a resolução de eventuais problemas comuns (ligação à rede, DNS – Domain Name System, entre outros). Tópicos como WMI (Windows Management Instrumentation) e interação com Active Directory também não foram esquecidos e são analisados ao longo do livro.

Finalmente, existe ainda espaço para introduzir o remoting. Como veremos, esta é uma funcionalidade avançada, cujo principal objetivo é permitir a execução de comandos em máquinas remotas. Esta é, com toda a certeza, uma funcionalidade muito útil para o administrador de sistemas distribuídos.

RREEQQUUIISSIITTOOSS Este é um livro prático. Apesar disso, a verdade é que foi escrito para permitir

que a aprendizagem das funcionalidades da plataforma possa ser feita sem que o leitor tenha de estar sentado em frente de um computador.

Nos dias que correm, praticamente todos os sistemas Windows já possuem a PowerShell instalada. Dada a constante evolução da PowerShell, a sua versão tem vindo a

POWERSHELL

© FCA

XII

evoluir com a versão do sistema operativo. No entanto, tem havido uma preocupação para manter a última versão compatível com todas as versões de sistema operativo suportadas. Apesar de muitos dos exemplos apresentados poderem ser utilizados na versão 3.0 da PowerShell, recomendamos a instalação da versão 4.0 (ou superior) para garantir uma corre-ta execução de todos os comandos discutidos neste livro.

Essa versão (ou uma superior) pode ser obtida a partir da página oficial da PowerShell em https://msdn.microsoft.com/powershell/mt173057.aspx.

AA QQUUEEMM SSEE DDIIRRIIGGEE EESSTTEE LLIIVVRROO?? Este livro é dirigido a todos aqueles que pretendem colocar-se rapidamente a par

das principais funcionalidades introduzidas pela PowerShell. O livro parte do pressuposto de que o leitor já tem alguns conhecimentos sobre a plataforma Windows, pelo que não são apresentadas quaisquer noções básicas acerca desta plataforma.

CCOONNVVEENNÇÇÕÕEESS Ao longo deste livro, optou-se por seguir um conjunto de convenções que facili-

tam a interpretação do texto e do código apresentados. Assim, todos os comandos são apresentados no seguinte formato: Get-ChildItem

O caráter é usado para representar comandos que tiveram de ser divididos em várias linhas por falta de espaço no livro:

isto deveria estar

tudo numa linha

Por sua vez, as notas ou observações importantes poderão ser encontradas no interior de uma secção com o seguinte grafismo:

Nota importante

Esta é uma nota ou observação importante.

OORRGGAANNIIZZAAÇÇÃÃOO DDOO LLIIVVRROO Este livro encontra-se dividido em cinco capítulos, que poderão ser lidos sequen-

cialmente ou, se o leitor assim o preferir, de forma alternada (isto é, sem respeitar a ordem de capítulos apresentada).

SOBRE O LIVRO

© FCA

XIII

A leitura sequencial do livro conduz o leitor ao longo de um processo de aprendi-zagem da PowerShell que começa por introduzir os conceitos e comandos base antes de apresentar vários exemplos práticos de diversas áreas. Por outro lado, a leitura não sequen-cial (alternada) dos capítulos permite o uso do livro como referência para funcionalidades. Esta aproximação é possível devido ao facto de todas as (poucas) dependências entre capí-tulos estarem devidamente identificadas.

CCAAPPÍÍTTUULLOO 11:: IINNTTRROODDUUÇÇÃÃOO

Este capítulo dará início ao nosso estudo da PowerShell. Depois de justificar o por-quê do uso desta plataforma, o capítulo apresenta algumas das principais caraterísticas associadas ao uso da PowerShell. O capítulo não termina sem ilustrar um exemplo prático com algumas das potencialidades associadas ao uso da PowerShell.

CCAAPPÍÍTTUULLOO 22:: AASSPPEETTOOSS BBÁÁSSIICCOOSS Neste capítulo começaremos por apresentar um conjunto de cmdlets que permitem

a exploração dos restantes cmdlets e as principais caraterísticas deste ambiente de execução. Neste capítulo, aproveitaremos ainda para introduzir o conceito de formatador e verificar como recorrer a estes elementos para apresentar os resultados obtidos a partir da execução dos comandos.

CCAAPPÍÍTTUULLOO 33:: SSCCRRIIPPTTIINNGG Neste capítulo introduziremos várias das funcionalidades relacionadas com a

escrita de código script em PowerShell. Depois de introduzirmos o conceito de variável e de apresentarmos alguns dos principais tipos que podem ser usados diariamente na PowerShell, voltaremos a nossa atenção para o uso de estruturas de decisão e de repetição.

O capítulo refere ainda vários aspetos importantes relacionados com a escrita de funções e com a criação de ficheiros de script que permitem a reutilização de código PowerShell entre sessões de trabalho.

CCAAPPÍÍTTUULLOO 44:: AADDMMIINNIISSTTRRAAÇÇÃÃOO DDEE SSIISSTTEEMMAASS Neste capítulo, reutilizaremos os conhecimentos introduzidos nos capítulos ante-

riores e apresentaremos vários exempos práticos que mostram como a PowerShell pode ser usada na resolução de problemas normais do dia a dia do administrador de sistemas. Inte-

POWERSHELL

© FCA

XIV

ração com ficheiros, com pastas e com o Registo do Windows são alguns dos tópicos rela-cionados com a administração local que são apresentados.

O capítulo reserva ainda espaço para alguns tópicos mais avançados, como, por exemplo, a utilização de WMI e ADSI (Active Directory Service Interfaces) e a gestão de um Active Directory através dos comandos fornecidos pela ferramenta RSAT (Remote Server Administration Tool). Finalmente, introduziremos o conceito de job e veremos como é que se pode recorrer a estes objetos para efetuar a execução de comandos em background.

CCAAPPÍÍTTUULLOO 55:: AADDMMIINNIISSTTRRAAÇÇÃÃOO RREEMMOOTTAA

O último capítulo do livro aborda o uso de remoting. Depois de apresentar os aspe-tos teóricos relacionados com o uso de remoting, o capítulo apresenta todos os passos neces-sários à correta configuração de uma máquina para que possa receber comandos remotos.

Em seguida, serão apresentadas várias estratégias que podem ser utilizadas para permitir a execução de um comando remotamente. Assim, temas como sessões remotas interativas, o estabelecimento de sessões remotas e o uso de sessões CIM (Common Information Model) serão abordados com vários exemplos que ilustram a sua aplicação prática.

SSUUPPOORRTTEE Este livro foi elaborado com base na versão 5.0 da plataforma PowerShell. Se, por

acaso, o leitor encontrar informação que lhe pareça incorreta, ou tiver sugestões em relação ao conteúdo de alguma secção deste livro, então não hesite e envie um email com as suas questões para [email protected].

Eventuais alterações serão publicadas no site da editora em http://www.fca.pt.

© FCA

1 IINNTTRROODDUUÇÇÃÃOO

Neste capítulo, vamos iniciar a nossa viagem pelo mundo da PowerShell. Depois de intro-duzirmos a PowerShell e de apresentarmos algumas razões que justificam a sua aprendiza-gem, passaremos à prática e ilustraremos algumas funcionalidades e caraterísticas mais importantes no seu uso diário.

11..11 OO QQUUEE ÉÉ AA PPOOWWEERRSSHHEELLLL?? Mas afinal o que é a PowerShell? Será que estamos a falar de uma consola com

linha de comandos? Ou será que estamos a falar de uma linguagem de scripting? Na rea-lidade, a PowerShell é ambas. Mas a PowerShell é muito mais do que uma linha de coman-dos ou linguagem de scripting. Na verdade, estas são apenas duas das faces mais visíveis da PowerShell. Na nossa opinião, a PowerShell deve ser vista como um ambiente de execu-ção, que nos permite interagir com um sistema operativo através de um conjunto de fer-ramentas. À primeira vista, esta definição pode parecer muito abstrata, pelo que é conve-niente procedermos a uma explicação mais profunda.

A Figura 1.1 apresenta aquilo a que muitas pessoas chamam de PowerShell. Na reali-dade, essa figura apresenta apenas o CLI (Command Line Interface) da PowerShell. É através desta consola que podemos executar os comandos, os scripts e muitas das tarefas que até ao lançamento da PowerShell eram tipicamente executadas na consola Command Prompt (cmd.exe).

FFIIGGUURRAA 11..11 –– Command Line Interface da PowerShell

POWERSHELL

© FCA

2

Por exemplo, se executarmos o cmdlet Get-ChildItem, obteremos uma listagem com todos os itens (ficheiros e pastas) mantidos no interior da pasta atual. A Figura 1.2 apresenta os resultados obtidos a partir da execução desse cmdlet.

FFIIGGUURRAA 1..22 –– Obtenção das pastas e ficheiros mantidos no interior de uma pasta

O que é um cmdlet?

Um cmdlet é um dos vários tipos de comando que executam uma determinada operação num ambiente PowerShell. Os cmdlets podem ser executados diretamente a partir do CLI (como ilustrado no exemplo anterior) ou a partir de scripts escritos pelo utilizador. Na prática, um cmdlet executa uma determinada tarefa e retorna o seu resultado sob a forma de um objeto .NET. Como veremos, este objeto, que representa o resultado da sua execução, pode ser passado a outro cmdlet através de um pipe. A passagem destes objetos .NET de um cmdlet para outro através de pipes é uma das grandes vantagens da PowerShell em relação a outras shells (em que a passagem de informação entre comandos é feita através de texto que tem de ser interpretado pelo comando seguinte). Para além dos cmdlets, a PowerShell também suporta a execução de outros tipos de comandos, como, por exemplo, os tradicionais ficheiros exe ou bat. Os cmdlets diferem desses comandos nos seguintes aspetos:

– Os cmdlets são instâncias de classes .NET (e não executáveis);

– Geralmente, os cmdlets não efetuam operações de parsing, apresentação de erro ou formatação de resultados (estas operações ficam a cargo do ambiente de execução PowerShell);

– Os cmdlets são alimentados por objetos obtidos a partir da pipeline em vez de texto (como acontece com os comandos tradicionais);

– Os cmdlets processam apenas um único objeto de cada vez (record-oriented).

Como seria de esperar, também podemos criar os nossos próprios cmdlets. Para isso, temos de criar uma nova classe em C# (ou noutra linguagem compatível) e seguir as recomendações definidas em https://technet.microsoft.com/library/dd878294.aspx. A criação de novos cmdlets está fora do âmbito

INTRODUÇÃO

© FCA

3

deste livro, pelo que o utilizador interessado pode obter mais informações na documentação oficial existente em https://technet.microsoft.com/library/dd878294.aspx.

Antes de avançarmos, importa salientar que a PowerShell não é case sensitive. Por-tanto, no que diz respeito ao processamento dos comandos, ela não efetua quaisquer distinções entre minúsculas e maiúsculas. Na prática, isto significa que os nomes get-childitem, Get-childitem ou Get-ChildItem identificam sempre o mesmo cmdlet (a utilização de maiúsculas no texto do livro prende-se apenas com o uso de uma conven-ção aceite no mundo da PowerShell).

Regressando ao nosso exemplo, resta-nos dizer que poderíamos ter recorrido aos aliases dir ou ls para obter exatamente o mesmo resultado obtido com a execução do comando anterior. Na prática, um alias, que é usado para identificar um cmdlet (no Capí-tulo 2 analisaremos detalhadamente este tópico). Para além dos aliases anteriores, a PowerShell introduz ainda outros, que tentam simplificar a vida aos utilizadores com experiência no uso da consola cmd.exe ou da consola bash. Note-se que o uso destes aliases na escrita de scripts ou módulos não é considerado uma boa prática.

Para além da consola CLI, podemos executar comandos na PowerShell ISE (Integrated Script Environment). Este utilitário também pode ser usado na criação e depura-ção de scripts PowerShell. Uma das formas mais rápidas de o executarmos passa pelo uso do alias ise (que referencia o comando PowerShell_ise.exe) a partir de uma consola CLI.

A Figura 1.3 ilustra o aspeto desta aplicação. Como é possível verificar, a aplica-ção encontra-se dividida em três janelas. No canto inferior esquerdo encontramos uma consola CLI da PowerShell embebida. No canto superior esquerdo temos acesso a um editor que nos permite criar ou editar scripts. Finalmente, no lado direito temos uma jane-la que apresenta uma lista de cmdlets introduzidos pelos módulos registados na máquina. Ao escolhermos um comando, temos acesso a informação detalhada sobre esse comando. Esta janela permite-nos definir os valores dos vários parâmetros que podem ser utiliza-dos em conjunto com um cmdlet.

POWERSHELL

© FCA

4

FFIIGGUURRAA 1..33 –– Janela da PowerShell ISE

Módulos PowerShell

Um módulo pode conter cmdlets, funções, variáveis, providers e outros elementos (por exemplo, snap ins) que podem ser utilizados numa sessão PowerShell. Na prática, os módulos costumam agrupar vários comandos relacionados com uma determinada área. Como seria de esperar, os módulos podem ser distribuídos e instalados em qualquer máquina. Depois de instalados, os comandos definidos por esse módulo podem ser utilizados como qualquer outro cmdlet predefinido (em abono da verdade, importa referir que os chamados cmdlets predefinidos podem ser utilizados a partir de sessões PowerShell, porque os módulos que os contêm foram instalados aquando da instalação da PowerShell na máquina).

A partir da versão 3 da PowerShell, depois de instalado um módulo é automaticamente carregado na sequência da primeira execução de um dos comandos por si definidos (anteriormente, a execução de um comando tinha sempre de ser precedida do carregamento do módulo que o definia). A localização dos módulos usados pela PowerShell é definida pela variável de ambiente PSModulePath e pode ser recuperada através do comando seguinte:

PS E:\Users\luisabreu\Downloads> Get-ChildItem Env:\PSModulePath

O leitor com experiência noutras shells não pode deixar de reparar que o acesso a uma variável de ambiente segue a mesma sintaxe utilizada para aceder a um ficheiro ou a uma pasta existentes no disco. Isto acontece porque os cmdlets que utilizamos para navegar ao longo das pastas e ficheiros de um disco foram criados para consumir dados disponibilizados por um provider. Como já existe um provider predefinido para variáveis de ambiente, então podemos reutilizar o comando Get-ChildItem para apresentar uma listagem dessas variáveis (no excerto anterior, limitámo-nos a apresentar o valor da variável de ambiente PSModulePath).

© FCA

3 SSCCRRIIPPTTIINNGG

Neste capítulo apresentaremos algumas das funcionalidades disponibilizadas pela PowerShell que podem ser utilizadas em operações de scripting. Tópicos como variáveis, estruturas de decisão e repetição, âmbitos ou funções irão merecer atenção especial. No final, o leitor terá ao seu dispor todos os conhecimentos necessários para a escrita e reutilização de código script em PowerShell.

3.1 VVAARRIIÁÁVVEEIISS Até ao momento, limitámo-nos a executar um conjunto de comandos simples a

partir da CLI da PowerShell, sem que tenha sido necessário guardar provisoriamente os resultados obtidos a partir da execução de cada um desses comandos. Se essa necessidade tivesse surgido, então poderíamos resolver o problema através de uma variável. Na prática, podemos ver as variáveis como identificadores que permitem o acesso a espaços de memória que são utilizados para guardar determinados valores.

Na PowerShell, os nomes das variáveis começam sempre com o caráter $, confor-me ilustrado no seguinte excerto: PS F:\Downloads>$conteudos = Get-ChildItem

Neste caso, a variável $conteudos acaba por guardar o resultado obtido a partir da execução do cmdlet Get-ChildItem. Por outras palavras, $conteudos referencia um array de objetos, o que pode ser verificado através da seguinte execução: PS F:\Downloads>Get-Member -InputObject $conteudos

TypeName: System.Object[]

Name MemberType Definition

---- ---------- ----------

Count AliasProperty Count = Length

Neste caso, utilizámos o parâmetro InputObject para passar o objeto que estamos interessados em analisar. Como se pode verificar, estamos perante um array de elementos do tipo System.Object (tipo base de todos os objetos .NET). Em alternativa, poderíamos ter utilizado o método GetType, conforme ilustrado no excerto seguinte:

POWERSHELL

© FCA

52

PS F:\Downloads> $conteudos.GetType()

IsPublic IsSerial Name BaseType

-------- -------- ---- --------

True True Object[] System.Array

Nesta altura, o leitor poderá estar a interrogar-se acerca da proveniência do método GetType. Ora bem, a PowerShell recorre ao ambiente .NET para suportar o uso de objetos. Na prática, isto significa que todos os objetos herdam direta ou indiretamente de System.Object, tipo que introduz um método público designado por GetType. Este método devolve metadados que caraterizam o objeto sobre o qual foi executado (sendo o tipo de objeto uma das caraterísticas dos metadados devolvidos). Foi por isso possível invocar o método GetType sobre a variável no excerto anterior para obter o tipo de objeto referenciado pela variável $conteudos.

A variável $conteúdos representa um dos diferentes tipos de variáveis que podem ser utilizadas na PowerShell. As variáveis definidas pelo utilizador (categoria na qual se inclui a variável $conteudos apresentada no exemplo anterior) existem enquanto a consola estiver aberta ou até que tenham sido explicitamente eliminadas pelo utilizador (mais pormenores nos parágrafos seguintes).

Se quisermos manter uma variável entre várias sessões PowerShell, então devere-mos adicioná-las ao perfil do utilizador (mais informações sobre perfis de utilizador dispo-níveis em https://technet.microsoft.com/library/hh847857.aspx). Note-se, contudo, que, à semelhança do que acontece com as variáveis de ambiente, eventuais alterações ao valor dessas variáveis não são persistidas entre sessões, nem o seu valor é alterado se ocorrer alguma alteração no perfil. Na prática, isto significa que as variáveis definidas no perfil do utilizador possuem sempre o valor inicial aquando do arranque de uma nova sessão PowerShell.

Perfis em PowerShell

Em PowerShell, um perfil não é mais do que um ficheiro de script executado durante o arranque de uma sessão PowerShell. Os perfis permitem personalizar as sessões PowerShell através da injeção de variáveis, funções, aliases, módulos e outros elementos PowerShell. Atualmente, a PowerShell suporta vários tipos de perfis que podem ser aplicados às sessões de utilizadores e aos hosts usados no suporte dessas sessões. Apesar de suportar vários tipos de perfis, a verdade é que a PowerShell não introduz perfis predefinidos. Portanto, se estivermos interessados em criar um perfil, então teremos de criar o ficheiro de script no local correto.

A documentação disponível em https://technet.microsoft.com/library/hh847857.aspx analisa em detalhe os vários tipos de perfis e identifica os locais onde cada tipo de perfil deve ser definido.

Para além de variáveis definidas pelo utilizador, a PowerShell suporta o uso das chamadas variáveis automáticas. Estas variáveis são geridas pela própria PowerShell (por-tanto, nunca podem ser modificadas pelo utilizador) e usadas para guardar informação

SCRIPTING

© FCA

53

sobre o estado da PowerShell. Por exemplo, $PSHome é uma dessas variáveis e permite obter o caminho até à pasta de instalação da própria PowerShell.

O utilizador interessado pode obter mais informações sobre as variáveis automá-ticas em https://technet.microsoft.com/library/hh847768.aspx.

Finalmente, temos um terceiro tipo de variáveis, conhecidas como variáveis de preferência. Estas variáveis são criadas pela PowerShell e inicializadas com valores prede-finidos. Contudo, e ao contrário do que acontecia com as automáticas, as variáveis que se enquadram nesta categoria podem ser modificadas pelo utilizador. $MaximumHistoryCount é uma destas variáveis e serve para definir o número de comandos que devem ser grava-dos durante a sessão atual. Uma vez mais, redirecionamos o leitor interessado em obter mais detalhes sobre este tipo de variáveis para a documentação disponível em https://technet.microsoft.com/library/hh847796.aspx.

3.1.1 DDEECCLLAARRAAÇÇÃÃOO EE IINNIICCIIAALLIIZZAAÇÇÃÃOO DDEE VVAARRIIÁÁVVEEIISS

Em PowerShell, a declaração de variáveis não é obrigatória. Na prática, é normal declarar e inicializar uma variável numa única instrução, conforme ilustrado no exemplo do início da secção 2.1. Todas as variáveis não inicializadas possuem o valor especial $null. O excerto seguinte ilustra este ponto: PS F:\Downloads> $test -eq $null

True

PS F:\Downloads> $test = 10

PS F:\Downloads> $test -eq $null

False

No primeiro teste, $test ainda não tinha sido inicializada, pelo que possui automaticamente o valor $null. Esta condição deixa de se verificar a partir da altura em que atribuímos um valor à variável (neste caso, o valor 10). Se quisermos imprimir o valor de uma variável, temos apenas de escrever o seu nome na prompt da consola: PS F:\Downloads> $test

10

A eliminação do valor de uma variável pode ser efetuada através do cmdlet Clear-Variable ou da atribuição do valor $null: PS F:\Downloads> $test = $null

Se quisermos, podemos ainda obter uma listagem de todas as variáveis utilizadas durante uma sessão através do cmdlet Get-Variable. No excerto seguinte listamos todas as variáveis que contêm o nome te e que foram utilizadas na sessão atual:

POWERSHELL

© FCA

54

PS F:\Downloads> Get-Variable -Name *te*

Name Value

---- -----

conteudos {Acceptance Tests...

ExecutionContext

System.Management.Automation.EngineIntrinsics

FormatEnumerationLimit 4

NestedPromptLevel 0

OutputEncoding System.Text.ASCIIEncoding

PSBoundParameters {}

PSDefaultParameterValues {}

Em alternativa, podemos recorrer ao cmdlet Get-ChildItem para atingir o mes-mo objetivo. Isto é possível devido ao facto de existir um provider que permite enumerar as variáveis como se estas fossem pastas ou ficheiros no interior de outra pasta (no Capí-tulo 4 apresentaremos as principais caraterísticas relacionadas com o uso de providers em PowerShell): PS F:\Downloads> Get-ChildItem Variable:\*te*

Name Value

---- -----

conteudos {Acceptance Tests...

3.1.2 TTIIPPOOSS DDEE VVAARRIIÁÁVVEEIISS

Por predefinição, as variáveis definidas na PowerShell são loosely typed. Na práti-ca, isto significa que podemos guardar qualquer tipo de objeto numa variável: PS F:\Downloads> $a = 10

PS F:\Downloads> $a = "Luis"

PS F:\Downloads> $a

Luis

No excerto anterior, a variável $a começa por armazenar um inteiro para, em seguida, ser utilizada para guardar uma string. O tipo de dados de uma variável é sempre representado por um tipo .NET e inferido a partir do valor que ela guarda.

Se quisermos, podemos alterar este comportamento predefinido através de um atributo que qualifica o tipo de dados que pode ser armazenado numa variável. No

© FCA

5 AADDMMIINNIISSTTRRAAÇÇÃÃOO RREEMMOOTTAA

Até agora, vimos apenas como utilizar a PowerShell para resolver alguns problemas e efe-tuar algumas tarefas administrativas locais. Nos tempos que correm, esta aproximação não é suficiente, já que a maior parte dos problemas dos utilizadores tem de ser resolvida remotamente, sem qualquer acesso físico à máquina. Felizmente para nós, a PowerShell suporta o uso de remoting, permitindo assim executar comandos sobre máquinas remotas. A configuração e utilização de remoting é o tópico que vai ocupar este capítulo.

5.1 AASSPPEETTOOSS BBÁÁSSIICCOOSS Com o lançamento das últimas versões, a Microsoft tem apostado cada vez mais

na administração remota. Como seria de esperar, a PowerShell também tem recolhido benefícios desta aposta. O PowerShell remoting permite executar comandos numa máquina remota, e a sua utilização de remoting depende do uso do serviço WinRM (Windows Remote Management). Este serviço encarrega-se de manter as sessões de trabalho entre os compu-tadores.

Para conseguirmos ligar-nos a uma máquina remota, esta deve ter, pelo menos, um listener configurado previamente para aceitar comandos PowerShell. As ligações entre máquinas são feitas através do procolo WS-MAN (Web Services for Management), que, por sua vez, efetua a comunicação através de HTTP (ou HTTPS, se estivermos interessados em utilizar uma ligação segura).

Depois de estabelecida a ligação, os comandos enviados a partir do PC de origem são processados na máquina remota de destino, sendo os resultados devolvidos à máqui-na que iniciou a ligação. A execução remota de comandos em uma ou mais máquinas pode ser feita através de uma sessão persistente ou de uma sessão temporária. Em alter-nativa, podemos estabelecer uma sessão interativa para uma máquina remota.

Se optarmos pelo uso de uma sessão interativa, então o primeiro passo a dar será estabelecer uma ligação à máquina remota através do cmdlet Enter-PSSession. Quando essa ligação é estabelecida com sucesso, a consola passa a refletir o aspeto da máquina remota e todos os comandos introduzidos pelo utilizador são executados remotamente, como se tivessem sido introduzidos diretamente nesse computador. Quando terminamos

POWERSHELL

© FCA

146

a execução de comandos na máquina remota, então devemos encerrar essa sessão explici-tamente usando o cmdlet Exit-PSSession.

Se necessitarmos de invocar apenas um ou mais comandos em uma ou mais máquinas remotas, poderemos utilizar o cmdlet Invoke-Command. Quando este não recebe uma sessão através de parâmetros, encarrega-se de estabelecer uma sessão remota tem-porária durante a execução dos comandos especificados, sessão essa que é automatica-mente encerrada com o término da operação.

Finalmente, podemos também estabelecer uma sessão remota persistente. O estabelecimento de uma ligação deste tipo é feito através do cmdlet New-PSSession. À semelhança do que acontece com o cmdlet anterior, este pode ser utilizado para estabele-cer uma sessão remota partilhada por várias máquinas. Depois de criada uma sessão persistente, podemos estabelecer uma sessão interativa sobre esta sessão persistente. Para isso, temos apenas de passar o valor devolvido pelo cmdlet New-PSSession ao cmdlet Enter-PSSession. Em vez disso, podemos usar esse valor devolvido pelo cmdlet New-PSSession em conjunto com o cmdlet Invoke-Command para invocar um bloco de script em uma ou mais máquinas. Na secção 5.3.4 apresentaremos alguns exemplos que ilustram estas estratégias.

Nesta altura, convém ter em atenção que existem alguns cmdlets (especialmente os que foram introduzidos antes da versão 2.0 da PowerShell) que não utilizam o protoco-lo WS-MAN no estabelecimento de sessões remotas. Tipicamente, muitos destes cmdlets disponibilizam um parâmetro designado por ComputerName, que permite a especificação da máquina onde esse cmdlet deve ser executado. O cmdlet Get-Service é um deles. Nes-tes casos, a comunicação remota é estabelecida sobre DCOM (Distributed Component Object Model).

5.2 CCOONNFFIIGGUURRAAÇÇÃÃOO Para que uma sessão remota seja estabelecida com sucesso, a máquina destino

tem de ser configurada previamente e essa ligação efetuada por um utilizador com as permissões adequadas. A ativação de remoting num PC é feita através do cmdlet Enable--PSRemoting. Este deve ser executado localmente na máquina remota por um utilizador com privilégios de administração. Para além de ativar e modificar o comportamento de startup do serviço WinRM, o cmdlet encarrega-se de criar um listener capaz de aceitar comandos provenientes de outras máquinas e de configurar a firewall para que pedidos WS-MAN efetuados sobre HTTP não sejam bloqueados.

Em seguida, temos de modificar as permissões das configurações de sessão PowerShell no PC para permitir o acesso remoto de um utilizador ou grupo de utilizadores. Esta operação é feita através do cmdlet Set-PSSessionConfiguration, que permite espe-

ADMINISTRAÇÃO REMOTA

© FCA

147

cificar os utilizadores que têm permissão de Execução sobre uma configuração de sessão (como veremos em seguida, o cmdlet Enable-PSRemoting encarrega-se de efetuar este passo para garantir que os administradores da máquina possuem as permissões adequa-das sobre os ficheiros de configuração de sessão).

Configurações de sessão PowerShell

Todas as sessões PowerShell remotas estabelecidas necessitam das chamadas configurações de ses-são. Estas configurações são utilizadas para proteger os recursos existentes numa máquina ao cria-rem ambientes personalizados que são usados pelos utilizados que se ligam a essa máquina. Por exemplo, podemos utilizar as configurações de sessão para indicar quais os cmdlets ou as funções que um utilizador pode executar numa determinada sessão.

Por predefinição, existem duas configurações de sessão, designadas por Microsoft.PowerShell e Microsoft.PowerShell.Workflow. Para além destas duas configurações, pode haver uma terceira, designada por Microsoft.PowerShell32, que apenas existe em máquinas que usam sistemas operativos de 64 bits (esta configuração de sessão é utilizada para sessões executadas em modo de 32 bits). As configurações de sessão existentes numa máquina podem ser listadas através do cmdlet Get-PSSessionConfiguration.

Por omissão, a configuração de sessão Microsoft.PowerShell é usada por todas as sessões estabelecidas. Se pretendermos utilizar outra configuração, será necessário recorrer ao parâmetro ConfigurationName quando utilizamos os cmdlets New-PSSession, Enter-PSSession ou Invoke-Command.

Por predefinição, apenas membros do grupo local de Administradores possuem privilégios que per-mitem utilizar as configurações de sessão anteriores. Se pretendermos alterar este comportamento, deveremos recorrer ao cmdlet Set-PSSessionConfiguration (a alteração do security descriptor das configurações de sessão pode ser efetuada através do parâmetro ShowSecurityDescriptorUI).

Já que introduzimos o tópico de configuração de sessão, importa ainda referir que as configurações de sessão permitem influenciar o modo de linguagem usado. O modo de linguagem determina as funcionalidades que podem ser utilizadas numa sessão PowerShell. Por predefinição, a PowerShell suporta os modos FullLanguage, ContrainedLanguage, RestrictedLanguage e NoLanguage. Por exemplo, se uma sessão estiver em modo RestrictedLanguage, então não será possível executar blocos de script. O leitor interessado em obter mais detalhes sobre esta funcionalidade pode consultar a documentação disponível em https://technet.microsoft.com/library/dn433292.aspx.

Esta breve introdução às configurações de sessão não ficaria completa sem referir que, a partir da versão 3.0, tornou-se possível recorrer a ficheiros de configuração de sessões para definir as confi-gurações de uma sessão PowerShell. Esta aproximação simplifica a personalização das configurações de sessão, já que deixamos de escrever código para influenciar as propriedades de uma configura-ção de sessão.

O utilizador interessado pode obter mais detalhes sobre as configurações de sessão e sobre os ficheiros de configuração de sessão em https://technet.microsoft.com/library/hh847817.aspx e https://technet.microsoft.com/library/hh847838.aspx.

Finalmente, temos ainda de garantir que o utilizador que inicia a sessão remota possui as permissões adequadas nessa máquina. Estas permissões dependem do tipo de comando que queremos executar. A forma mais fácil de garantir este pressuposto consis-

POWERSHELL

© FCA

148

te em adicionar a conta do utilizador ao grupo de administradores locais da máquina que deve receber ligações remotas. Apesar de esta não ser a aproximação ideal para o mundo real, é a que vamos seguir neste livro, de forma a podermos concentrar-nos apenas nos aspetos relacionados com o estabelecimento de sessões remotas.

Configuração da firewall

Alguns cmdlets mais antigos (por exemplo, Get-Service ou Get-WMIObject) recorrem ao DCOM em vez do WinRM durante uma execução remota. A utilização destes cmdlets obriga a configurações adicionais da firewall que podem ser efetuadas através do cmdlet Set-NetFirewallRule. O excerto seguinte mostra como ativar todas as regras inativas relacionadas com o uso de WMI:

PS F:\> Get-NetFirewallRule | where DisplayName -Like '*Windows Management Instrumentation*' | Set-NetFirewallRule -Enabled True -Verbose

VERBOSE: Set-NetFirewallRule DisplayName: WMI-RPCSS-In-TCP-NoScope

VERBOSE: Set-NetFirewallRule DisplayName: WMI-WINMGMT-Out-TCP-NoScope

VERBOSE: Set-NetFirewallRule DisplayName: WMI-WINMGMT-In-TCP-NoScope

VERBOSE: Set-NetFirewallRule DisplayName: WMI-RPCSS-In-TCP

VERBOSE: Set-NetFirewallRule DisplayName: WMI-ASYNC-In-TCP-NoScope

VERBOSE: Set-NetFirewallRule DisplayName: WMI-WINMGMT-In-TCP

VERBOSE: Set-NetFirewallRule DisplayName: WMI-WINMGMT-Out-TCP

VERBOSE: Set-NetFirewallRule DisplayName: WMI-ASYNC-In-TCP

5.2.1 CCMMDDLLEETT EENNAABBLLEE--PPSSRREEMMOOTTIINNGG

Como referimos, o primeiro passo a dar para ativar o suporte de remoting passa pela execução do cmdlet Enable-PSRemoting na máquina que deve passar a receber comandos remotos. A Figura 5.1 ilustra o resultado obtido quando executamos esse cmdlet a partir de uma consola em modo de Administração.

Conheça as nossas publicações em w w w . f c a. p t

C# 6 – Programação com Produtividade (eBook) Luís Abreu e Paulo Morgado ISBN: 978-972-722-835-5 Formato: epub

Ebook com as novidades introduzidas pela versão 6 do C#, que vieram simplifi-car e aumentar a produtividade em .Net. Inicialização de propriedades e índices, strings, exceções, “Roslyn”. Com exemplos.

LINQ com C# Luís Abreu e Paulo Morgado ISBN: 978-972-722-547-7 216 páginas 17 X 24 cm

O LINQ (Language Integrated Query) revolucionou por completo a forma como tratamos (e interagimos com) os dados nas nossas aplicações. Esta nova lingua-gem (desenvolvida pela Microsoft) contribui…

TypeScript – O JavaScript Moderno para Criação de Aplicações Luís Abreu ISBN: 978-972-722-864-5 168 páginas 17 X 24 cm

Aumente a produtividade e reduza erros de código com a nova linguagem da Web. Principais conceitos, funcionalidades, ferramentas e aplicação de tarefas do JavaScript. Com projetos e exemplos práticos.

Node.js – Construção de Aplicações Web Luís Abreu ISBN edição impressa: 978-972-722-860-7 216 páginas 17 X 24 cm ISBN edição eBook: 978-972-722-836-2

Livro sobre as principais caraterísticas e funcionalidades do Node.js: construção de aplicações Web; módulos; Express; motores de templates; Bower e Grunt; SPA; bases de dados; sockets; entre outros.

Disponível também em formato eBook

Editora líder em INFORMÁTICA Acompanhe a FCA de perto e conheça as Nossas Coleções

Nova coleção sobre os grandes temas da Ciência dos Dados: Data Science,

Big Data, Analytics e Internet das Coisas. Com uma abordagem muito

prática e demonstração de exemplos e projetos, estes são os livros

essenciais aos profissionais do futuro!

Dedicada a todos os envolvidos com as Tecnologias de Informação, é

indispensável para todos aqueles que pretendam desenvolver as suas

aplicações de acordo com as tecnologias mais recentes

Nova coleção que serve os referenciais dos cursos de

educação e formação profissional da indústria metalomecânica. Com

livros profusamente ilustrados, escrita simples e exercícios para

autoaprendizagem

Coleção sobre um tema bastante importante no panorama atual,

onde apresentamos livros dedicados aos utilizadores, aos profissionais e aos estudantes

A coleção da FCA para os estudantes do Ensino Superior. Aborda as princi-

pais temáticas de um curso TI. Útil também para profissionais que

pretendam atualizar os seus conhecimentos

Dedicada não só aos profissionais de Sistemas de Informação, mas

também a Gestores e outros profissionais de Informática, assim como aos estudantes de licenciatu-

ras e mestrados

Destinada aos alunos dos diversos Cursos de Educação e Formação

para Jovens (3.º Ciclo do EB e cursos profissionais do ES) e para Adultos,

de acordo com os respetivos programas. Útil também para

autoformação

Esta coleção, única em Portugal, é dedicada à Gestão

de Projetos segundo as melhores e mais atuais práticas

Dedicada aos amantes do digital, coloca à disposição de

amadores e profissionais conhecimentos anteriormente apenas acessíveis através de

obras estrangeiras

Concebida para iniciação e prática, esta coleção permite-lhe aprender

a matéria através de exercícios

práticos, resolvidos passo a passo

Esta coleção mostra-lhe, com uma liguagem simples e

acessível, como tirar partido das últimas versões dos programas

para utilizadores e sistemas operativos mais utilizados,

através de exemplos e exercícios resolvidos para praticar

Os livros desta coleção, simples e objetivos, profusamente

ilustrados com exemplos passo a passo, levam-no a dominar com rapidez e facilidade as

matérias apresentadas

Novo! Novo!