O script VMowers do Powershell não está sendo executado a partir da tarefa agendada

2

Plano de fundo / meta

Estou tentando criar uma tarefa agendada que:

  • Executar no horário especificado (uma vez)
  • Execute um script do PowerShell que:
    • Registra toda a saída como uma transcrição
    • Conecta-se ao meu servidor vCenter usando credenciais criptografadas armazenadas
    • Encerra os sistemas operacionais convidados de todas as VMs em uma determinada pasta

Problema

O script é executado perfeitamente no console, mas nem mesmo começa a executar como uma tarefa.

O código

#Stop an error from occurring when a transcript is already stopped
$ErrorActionPreference="SilentlyContinue"
Stop-Transcript | out-null

#Reset the error level before starting the transcript
$ErrorActionPreference="Continue"
Start-Transcript -path C:\temp\Shutdown_NonProductionVMs.log -append

#Add the VMWare Snap-in
Add-PSSnapin -Name VMWare.VimAutomation.Core

#Get the Credentials
$creds = Get-VICredentialStoreItem -file  C:\temp\pscreds.creds

#Connect to the server using the credentials file
Connect-VIServer -Server $creds.host -User $creds.User -Password $creds.Password

#Get all VMs within the non-production VMs folder and then shut them down
#NOTE the -WhatIf tag, which will stop it from shutting down the VMs until we're sure the script is good.

Get-Folder -Name "03. Non-Production VMs" | Get-VM | Shutdown-VMGuest -WhatIf

#Clean Up
Disconnect-VIServer -Force -Confirm:$false
Remove-PSSnapin -Name VMWare.VimAutomation.Core
Stop-Transcript

O que eu verifiquei / tentei até agora e outros leads

  • Novamente, esse script é executado perfeitamente bem em um console quando o console é aberto como administrador.
  • Eu defini uma política de execução de machinelevel de "Irrestrito" para ver se isso ajudaria.
  • Estou executando a tarefa como o mesmo usuário que criei o arquivo de credenciais com
  • Estou executando a tarefa com os maiores privilégios.
  • Estou executando a tarefa com credenciais armazenadas (minhas credenciais de usuário - as mesmas que funcionam no console).
  • Eu tentei comentar o código relacionado à transcrição para ver se isso foi feito; sem dados.
  • A tarefa continua a ser executada perpetuamente. Eu não obtenho nenhum resultado e ele não termina.

Alguma ideia? Agradecemos antecipadamente por qualquer ajuda que você possa dar!

    
por SeanKilleen 28.01.2013 / 15:45

1 resposta

3

Se você lançar o Powershell em uma sessão "console" interativa, provavelmente estará lançando a versão de 64 bits do Powershell. (O executável residirá no Windows \ System32.) Você também pode iniciar o Powershell de 32 bits a partir do Windows de 64 bits, executando a versão que reside no Windows \ SysWOW64. Verifique se você sabe qual versão o Agendador de Tarefas está iniciando.

Tenha em mente que cada versão do Powershell tem uma política de execução completamente separada. Portanto, você precisa definir a política de execução duas vezes para abranger as versões de 32 e 64 bits do Powershell.

O snap-in que você está tentando carregar também pode ser crítico. Alguns snap-ins e objetos COM só podem ser carregados em um ambiente de 32 ou 64 bits. No entanto, acabei de testar em um servidor Server 2008 R2 com o PowerCLI instalado e não tive problemas para carregar o snapin que você mencionou em ambos os ambientes. Então eu não acho que é o problema aqui. Mas ainda é algo a considerar. Pode depender dessa versão do PowerCLI que você instalou. Certifique-se de que o snapin seja carregado a partir de shells PS de 32 e 64 bits.

Por fim, você pode nos dizer exatamente o que a tela Ação em sua tarefa agendada diz? Que linha de comando exata (com argumentos) você está executando? Você pode obter mais informações de depuração se executar algo como cmd /c powershell.exe c:\yourscript.ps1 2>&1> C:\debug.txt

Também pode ajudar a nos fornecer a saída de Get-ExecutionPolicy -List de ambientes de 32 e 64 bits.

Também no seu post você menciona:

The task just continues to run perpetually. I don't get any result and it doesn't terminate.

Isso geralmente indica que está aguardando a entrada do usuário.

Editar: Typos, erros de digitação eveyrwhere

    
por 28.01.2013 / 16:20