Tarefa agendada para script Powershell

Tarefa agendada para script Powershell

Então, estou tentando executar um script do PowerShell de acordo com uma programação. Todas as manhãs, às 6h, 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 execução. Minha opinião é que a política de execução continua perguntando se é seguro executar o script antes de executá-lo. Se alguém concordar que esse pode ser o motivo pelo qual o script não pode ser iniciado sozinho, você poderia me fornecer uma solução para contornar essa barreira?

Responder1

Onde está a tarefa agendada? No GPO ou em uma máquina local? O script e a máquina onde ele deve ser executado estão na mesma rede?

Tente agendar assim (se ainda não fez isso):

Programm/Script: PowerShell.exe

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

Editar: também não tenho certeza se você precisa ter o módulo AD-PS instalado na estação de trabalho onde deseja executar o script, porque pode ser que o comando Set-ADUsernão possa ser encontrado.

Responder2

A política de execução é fácil de verificar. Você pode executá-la como um script quando estiver conectado normalmente? Caso contrário, 'definir política de execução remota assinada', executada a partir de uma sessão administrativa do PowerShell, definirá isso globalmente para o servidor.

O usuário que está executando a tarefa agendada precisa ter direitos de 'Logon As Batch' na máquina em que esta está sendo executada. dado que este é um módulo AD, presumo que você esteja executando isso em um controlador de domínio; nesse caso, você precisará alterar o GPO do controlador de domínio padrão para atribuir o direito 'Fazer logon como lote' ao seu usuário. Se estiver sendo executado em uma estação de trabalho ou servidor membro com RSAT, você precisará 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 possa alterar objetos de usuário. Geralmente, se você estiver fazendo login em um controlador de domínio, terá o administrador de domínio que lhe dará esse direito, mas se você criou uma conta de serviço, ela pode não ter as permissões corretas. Você precisará investigar o nível de permissão necessário e aplicá-lo às áreas relevantes do seu domínio AD. Cuidado com isso.

Aposto que foi o Log on as Batch certo, me surpreendeu algumas vezes e não é óbvio quando está impedindo você.

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

Responder3

A Política de Execução abrange toda a máquina. Se funcionar de forma interativa, não parece provável que seja um problema ao ser executado como uma tarefa agendada.

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

Aqui está 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 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())

Responder4

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

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

insira a descrição da imagem aqui

informação relacionada