Tarefa agendada para o script Powershell

2

Então, estou tentando executar um script do PowerShell em um cronograma. Todas as manhãs às 6 da manhã, repita a cada hora do dia. Aqui está o script em si:

Get-Content C:\Users\administrator\Desktop\users.txt | ForEach-Object {
    Set-AdUser -Identity $_ -LogOnWorkstations $null
}

Agora, o script funciona perfeitamente quando eu mesmo o executo. Mas parece que o script não será executado corretamente quando estiver programado para ser executado. Meu pensamento é que a política de execução continua perguntando se é seguro executar o script antes de executá-lo. Se alguém concordar que essa pode ser a razão pela qual o roteiro não pode começar por conta própria, poderia me fornecer uma solução em torno dessa barreira?

    
por FixItSteve 08.10.2015 / 14:16

4 respostas

4

Onde está a tarefa? No GPO ou em uma máquina local? O script e a máquina devem ser executados na mesma rede?

Tente agendar dessa forma (se ainda não tiver feito isso):

Programm/Script: PowerShell.exe

Arguments: -ExecutionPolicy Bypass -Command "& 'FilePathToScript.ps1'"

Edit: Também não tenho certeza se você tem que ter o AD-PS-Module instalado na estação de trabalho onde você deseja executar o script, porque pode ser que o comando Set-ADUser não pode ser encontrado. / p>     

por 09.10.2015 / 13:53
1

A política de execução é fácil de verificar. Você pode executá-la como um script quando está conectado normalmente? Se não, então, 'política de execução de conjunto remotesigned', executado a partir de uma sessão de powershell administrativo irá definir que globalmente para o servidor hte.

O usuário que está executando a tarefa agendada precisa ter direitos de 'Logon As Batch' para a máquina em que está sendo executada. Dado que este é um módulo AD, presumo que você esteja executando isso em um Controlador de Domínio. Nesse caso, será necessário alterar o GPO do Controlador de Domínio Padrão para atribuir o direito "Efetuar Logon como Lote" ao usuário. Se isso estiver sendo executado em uma estação de trabalho ou servidor membro com RSAT, será necessário usar a política de segurança local para atribuir esse direito (SecPol.MSC).

O usuário que está executando o script precisa ter acesso ao Active Directory até o nível em que pode alterar os objetos do usuário. Geralmente, se você estiver fazendo logon em um controlador de domínio, você terá o Administrador de Domínio que lhe dará esse direito, mas se você tiver criado uma conta de serviço, talvez não tenha as permissões corretas. Você precisará investigar o nível de permissão exigido e aplicá-lo às áreas relevantes do seu domínio do AD. Cuidado com isso.

Eu aposto que foi o Log on como Batch, me pegou algumas vezes e não é óbvio quando você está parando.

Se você precisar investigar mais, a guia "Histórico de tarefas agendadas" pode ajudar, assim como o visualizador de eventos.

    
por 09.10.2015 / 16:33
0

A política de execução é ampla para a máquina. Se funcionar de forma interativa, não parece provável que seja um problema durante a execução de uma tarefa agendada.

O que você está perdendo aqui é informação. Você não obterá nenhuma informação com dois comandos e nenhum registro. E você não está carregando o módulo do Active Directory para explicar algumas coisas.

Este é um exemplo de como iniciar um script do PowerShell como uma tarefa agendada e registrar a saída:

Program/Script: PowerShell  
Arguments:  
-NonInteractive -WindowStyle minimized -c "powershell -c C:\Apps\AppName\SomeScript.ps1 -verbose > C:\Apps\AppName\Logs\SomeScript.log 2>&1"  

Aqui está um exemplo de carregamento do módulo do Active Directory:

$startTime = Get-Date
$logDateFormat = "yyyy-MM-dd HH:mm:ss"
[console]::WriteLine("{0} Loading Active Directory Module", [datetime]::Now.ToString($logDateFormat))
import-module ActiveDirectory  

Get-Content C:\Users\administrator\Desktop\users.txt | ForEach-Object {  
    [console]::WriteLine("{0} Clearing workstations for user: {1}", [datetime]::Now.ToString($logDateFormat), $_)
    Set-AdUser -Identity $_ -LogOnWorkstations $null
}

$endTime = Get-Date
[console]::WriteLine("{0} Finished.  Time Required: {1}", [datetime]::Now.ToString($logDateFormat), $endTime.Subtract($startTime).ToString())
    
por 09.10.2015 / 17:58
0

Será algo parecido com este programa / script Powershell.exe Argumento e caminho

 -ExecutionPolicy Bypass -File "C:\alert.ps1"

    
por 21.04.2016 / 19:23