sexta-feira, 13 de julho de 2012

:: Manual do Windows PowerShell::



O Windows PowerShell foi criado para ser um shell de linha de comando e linguagem de script para a administração de sistemas. Com ele você pode administrar vários produtos Microsoft como Windows Server, Exchange Server eSharePoint Server; inclusive algumas opções de administração só estão disponíveis através dele.


Assim, o Windows PowerShell tornou-se uma ferramenta indispensável para o administrador de TI e aqui estão algumas referências importantes a respeito dele. Apesar de ser uma linguagem de script, possui um diferencial muito importante ao compararmos com outras linguagens, como o VB Script por exemplo. Você pode trabalhar com dados “tipados” além de poder fazer chamadas a classes do .NET Framework de forma simples e direta. Com ele é possível criar scripts para automatizar tarefas e também extender as funcionalidades dos produtos Microsoft.


Neste artigo, vou mostrar como configurar o ambiente para a execução de comandos remotos com o Windows PowerShell e criar um script para realizar uma instalação. O exemplo ilustrado utilizará dois servidores: ServidorA, onde será executado o script, e ServidorB onde será instalado um Windows Service a partir da execução do script.


Ao ser executado no ServidorA, o script executa o comando installutil –u no ServidorB para desinstalar a versão atual do Windows Service, caso exista. Depois disso, copia o conteúdo da versão atualizada a partir da pasta compartilhada\\ServidorA\MyWindowsService para a pasta C:\MyWindowsService no ServidorB, sobreescrevendo os arquivos atuais, e finalmente executa o comando installutil novamente para instalar a nova versão no ServidorB.


Preparando o ambiente para execução do script
Alguns comandos do Windows PowerShell precisam ser executados nos servidores envolvidos no processo para permitir a execução do script desta solução. Primeiramente é preciso configurar o Windows Remote Management e habilitar a execução de comandos remotos para o Windows PowerShell entre os servidores. Os comandos a seguir devem ser executados em ambos os servidores:



O comando listado a seguir é executado no ServidorA e permite que o script da solução seja executado neste servidor sem restrições.



Outra configuração importante diz respeito a permissões. O script será executado no ServidorA, porém, o comando para cópia dos arquivos da nova versão que será instalada (neste caso o comando utilizado é o ROBOCOPY) será executado remotamente no ServidorB. Assim nosso cenário é o seguinte:


1) O script executado no ServidorA executa o comando ROBOCOPY remotamente no ServidorB a fim de que sejam copiados os arquivos da nova versão do ServidorA para o ServidorB.


2) O script precisa passar uma credencial para o ServidorB que possua permissão para executar o comandoROBOCOPY neste servidor.


3) Quando o comando ROBOCOPY é executado, a credencial informada precisa ter permissão de leitura na pasta que contém os arquivos que serão copiados (localizada em \\ServidorA\MyWindowsService) e de gravação na pasta localC:\MyWindowsService no ServidorB. É importante destacar ainda que a mesma credencial será utilizada para instalar o serviço e portanto precisará de permissão para isso também no ServidorB.


Neste cenário, a credencial informada precisa ser passada pelo script executando no ServidorA para o ServidorB e logo em seguida, pelo execução do comando ROBOCOPY, do ServidorB para o ServidorA, conforme mostrado na figura a seguir:



O problema com este cenário é que esse “salto duplo” da credencial não é permitido. Esta questão é conhecida comodouble-hop e é uma característica do modelo de autenticação utilizado em redes baseadas no Active Directory.


*Para saber mais sobre a questão do “double-hop”: http://support.microsoft.com/kb/329986/pt-br


Entretanto, o Windows PowerShell oferece uma solução para este problema. Através da execução de comandos apropriados nos servidores envolvidos, é possível permitir a delegação de credenciais de um servidor para outro, conforme listado a seguir.

O primeiro comando, executado no ServidorB, habilita este servidor a atuar como delegado de outros servidores. O segundo comando, executado no ServidorA, habilita este servidor a aceitar credenciais delegadas pelo ServidorB.


Criando o script
Com o ambiente configurado, o passo seguinte é a criação do script Windows PowerShell responsável pela instalação do Windows Service. Para sua criação você pode utilizar o Windows PowerShell ISE, disponível nativamente noWindows 7 e Windows Server 2008 R2. Este editor, além de exibir o código com cores, semelhante ao Microsoft Visual Studio, permite realizar a depuração passo a passo do código, permitindo inclusive adicionar breakpoints.


Como vimos anteriormente, o script precisará de uma credencial com permissões específicas para cópia dos arquivos e instalação do serviço no ServidorB. Além do nome do usuário e a senha correspondentes a essa credencial, outros parâmetros precisarão ser passados ao script para sua execução, sendo eles:
- Nome do servidor onde o executável será instalado (ServidorB, neste exemplo).
- Nomes dos serviços incluídos no Windows Service que será instalado.
- Caminho da pasta compartilhada de onde serão copiados os arquivos (\\ServidorA\MyWindowsService, neste exemplo)
- Caminho local do executável no servidor de destino (C:\MyWindowsService\MyWindowsService.exe, neste exemplo).


O código para o recebimento dos parâmetros é o seguinte:



Todos os parâmetros são sequências simples de caracteres, à exceção do parâmetro $serviceNames que é um string array; isso porque o executável de um Windows Service pode conter vários serviços definidos nele e será necessário passar o nome de cada um deles. O comando installutil irá instalar todos os serviços, mas posteriormente eles deverão ser iniciados um a um. Importante destacar aqui que o nome a ser informado é o correpondente à propriedade“ServiceName” e não “DisplayName”, para cada um dos serviços. Ambas as propriedades são definidas no instalador de cada serviço incluído no projeto.


Após definir os parâmetros (esta definição precisa ser obrigatoriamente a primeira linha do script), são definidas algumas variáveis globais que serão utilizadas pelo script:



A variável $credential, criada a partir do usuário e senha informados como parâmetros, representa a credencial que será utilizada para copiar os arquivos do ServidorA para o ServidorB. A variável $installUtil representa o caminho para o executável do utilitário installutil e $localFolderPath corresponde à pasta local do ServidorB para onde os arquivos serão copiados.


Repare que a partir de agora os comandos são definidos para serem executados remotamente no ServidorB através do comando Invoke-Command.
Iniciando o processo de implantação, o script verifica se o executável do projeto já está instalado. Caso ele esteja, define que ele precisará ser desinstalado. Entretanto, antes de proceder a desinstalção, é possível que algum processo correspondente aos serviços do executável continue em execução por um tempo ainda após a desinstalação; isso pode ocasionar problemas posteriormente. Por isso, cada um dos serviços é parado e em seguida um loop é executado a cada cinco segundos até que o processo esteja definitivamente encerrado.



Somente após o encerramento de todos os processos a desinstalação é realizada. Perceba que a variável$uninstallService foi criada para indicar se é necessário desinstalar o serviço. Seu valor é definido para $true apenas se algum serviço estiver em execução no ServidorB.


Na sequência, caso algum serviço tenha sido encontrado, é executado o comando para desinstalação do executável. Caso contrário, no caso da primeira instalação, é criada a pasta no ServidorB para receber os arquivos.
Repare que caso a pasta já exista, a execução do script é encerrada através do retorno de uma exceção pelo comando Throw.



O passo a seguir é a cópia dos arquivos do ServidorA para a pasta correspondente no ServidorB através do comandoROBOCOPY.



Com os arquivos copiados, o comando installutil é executado para realizar a instalação dos serviços:



Com os serviços devidamente instalados, eles são iniciados:



Salvando o script com o nome InstallService.ps1 na pasta compartilhada \\ServidorA\Scripts, vamos agora executar o script no ServidorA supondo os seguintes parâmetros:
- Servidor de destino: ServidorB (onde será instalado o WindowsService)
- Nome dos serviços: MyService1, MyService2 e MyService3 (serviços incluídos no executável)
- Pasta de origem: \\ServidorA\MyWindowsService (de onde serão copiados os arquivos da nova versão)
- Caminho do executável: C:\MyWindowsService\MyWindowsService.exe (onde ficará localizado o executável no servidor de destino
- Usuário: contoso\administrator (usuário com permissão para copiar os arquivos e instalar o WindowsService)
- Senha: pass@word1 (senha do usuário utilizado)
Com essas informações, a linha de comando a ser executada no console do Windows Powershell é a seguinte:

FONTE: CorpTV


Nenhum comentário:

Postar um comentário