Tarea programada para el script de Powershell

Tarea programada para el script de Powershell

Así que estoy intentando ejecutar un script de PowerShell según una programación. Todas las mañanas a las 6 a. m., repita cada hora del día. Aquí está el guión en sí:

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

Ahora, el script funciona perfectamente cuando lo ejecuto yo mismo. Pero parece que el script no se ejecutará correctamente cuando está programado para ejecutarse. Mi opinión es que la política de ejecución sigue preguntando si es seguro ejecutar el script antes de ejecutarlo. Si alguien más está de acuerdo en que esta podría ser la razón por la que el script no puede iniciarse por sí solo, ¿podría proporcionarme una solución para superar esta barrera?

Respuesta1

¿Dónde está la tarea programada? ¿En GPO o en una máquina local? ¿El script y la máquina donde debería ejecutarse están en la misma red?

Intente programarlo así (si aún no lo ha hecho):

Programm/Script: PowerShell.exe

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

Editar: Además, no estoy muy seguro de si debe tener el módulo AD-PS instalado en la estación de trabajo donde desea ejecutar el script, porque es posible que Set-ADUserno se pueda encontrar el comando.

Respuesta2

La política de ejecución es fácil de verificar. ¿Puedes ejecutarla como un script cuando inicias sesión normalmente? De lo contrario, 'establecer política de ejecución firmada remotamente', ejecutarla desde una sesión administrativa de PowerShell la configurará globalmente para el servidor.

El usuario que ejecuta la tarea programada debe tener derechos de "Iniciar sesión como lote" en la máquina en la que se está ejecutando. Dado que se trata de un módulo AD, supongo que lo está ejecutando en un controlador de dominio, en cuyo caso deberá modificar el GPO del controlador de dominio predeterminado para asignar el derecho 'Iniciar sesión como lote' a su usuario. Si esto se ejecuta en una estación de trabajo o servidor miembro con RSAT, debe utilizar la política de seguridad local para asignar este derecho (SecPol.MSC).

El usuario que ejecuta el script debe tener acceso a Active Directory hasta el nivel en el que pueda modificar los objetos del usuario. Generalmente, si inicia sesión en un controlador de dominio, tendrá un administrador de dominio que le otorgará este derecho, pero si ha creado una cuenta de servicio, es posible que no tenga los permisos adecuados. Deberá investigar el nivel de permiso requerido y aplicarlo a las áreas relevantes de su dominio AD. Cuidado con esto.

Apuesto a que fue el derecho de Iniciar sesión como lote, me sorprendió un par de veces y no es obvio cuándo te detiene.

Si necesita investigar más, la pestaña Historial de tareas programadas puede ser útil, al igual que el visor de eventos.

Respuesta3

La política de ejecución es para toda la máquina. Si funciona de forma interactiva, no parece probable que sea un problema cuando se ejecuta como una tarea programada.

Lo que te falta aquí es información. No obtendrá ninguna información con dos comandos y sin iniciar sesión. Y no está cargando el módulo de Active Directory, por lo que eso puede explicar algunas cosas.

A continuación se muestra un ejemplo de cómo iniciar un script de PowerShell como una tarea programada y registrar el resultado:

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

A continuación se muestra un ejemplo de cómo cargar el módulo de 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())

Respuesta4

Será algo como este programa/script Powershell.exe Argumento y ruta

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

ingrese la descripción de la imagen aquí

información relacionada