Geplante Aufgabe für Powershell-Skript

Geplante Aufgabe für Powershell-Skript

Ich versuche also, ein Powershell-Skript nach einem Zeitplan auszuführen. Jeden Morgen um 6 Uhr, jede Stunde des Tages wiederholen. Hier ist das Skript selbst:

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

Nun funktioniert das Skript einwandfrei, wenn ich es selbst ausführe. Aber es scheint, als würde das Skript nicht richtig ausgeführt, wenn seine Ausführung geplant ist. Ich vermute, dass die Ausführungsrichtlinie immer wieder fragt, ob es sicher ist, das Skript auszuführen, bevor es ausgeführt wird. Wenn jemand anderer der Meinung ist, dass dies der Grund sein könnte, warum das Skript nicht von selbst gestartet werden kann, könnten Sie mir bitte eine Lösung für dieses Hindernis anbieten?

Antwort1

Wo befindet sich die geplante Aufgabe? Auf GPO oder auf einem lokalen Rechner? Befinden sich das Skript und der Rechner, auf dem es ausgeführt werden soll, im selben Netzwerk?

Versuchen Sie, es folgendermaßen zu planen (falls Sie das noch nicht getan haben):

Programm/Script: PowerShell.exe

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

Bearbeiten: Außerdem bin ich mir nicht ganz sicher, ob das AD-PS-Modul auf der Workstation installiert sein muss, auf der Sie das Skript ausführen möchten, da der Befehl möglicherweise Set-ADUsernicht gefunden werden kann.

Antwort2

Die Ausführungsrichtlinie lässt sich leicht überprüfen. Können Sie sie als Skript ausführen, wenn Sie normal angemeldet sind? Wenn nicht, wird dies mit „set-execution policy remotesigned“, das von einer administrativen Powershell-Sitzung ausgeführt wird, global für den Server festgelegt.

Der Benutzer, der die geplante Aufgabe ausführt, muss über die Berechtigung „Als Batch anmelden“ für den Computer verfügen, auf dem dies ausgeführt wird. Da es sich um ein AD-Modul handelt, gehe ich davon aus, dass Sie dies auf einem Domänencontroller ausführen. In diesem Fall müssen Sie die GPO des Standarddomänencontrollers ändern, um Ihrem Benutzer die Berechtigung „Als Batch anmelden“ zuzuweisen. Wenn dies auf einer Arbeitsstation oder einem Mitgliedsserver mit RSAT ausgeführt wird, müssen Sie die lokale Sicherheitsrichtlinie verwenden, um dieses Recht zuzuweisen (SecPol.MSC).

Der Benutzer, der das Skript ausführt, muss auf Active Directory Zugriff auf eine Ebene haben, auf der er Benutzerobjekte ändern kann. Wenn Sie sich bei einem Domänencontroller anmelden, verfügen Sie im Allgemeinen über die Berechtigung „Domänenadministrator“, die Ihnen dieses Recht erteilt. Wenn Sie jedoch ein Dienstkonto erstellt haben, verfügt es möglicherweise nicht über die erforderlichen Berechtigungen. Sie müssen die erforderliche Berechtigungsebene ermitteln und diese auf die relevanten Bereiche Ihrer AD-Domäne anwenden. Gehen Sie dabei vorsichtig vor.

Ich würde wetten, dass es an der Stapelanmeldung lag, richtig. Ich bin ein paar Mal damit in Verlegenheit geraten, und es ist nicht offensichtlich, wann es einen aufhält.

Wenn Sie weitere Untersuchungen durchführen müssen, kann die Registerkarte „Verlauf der geplanten Aufgaben“ sowie die Ereignisanzeige hilfreich sein.

Antwort3

Die Ausführungsrichtlinie gilt für den gesamten Rechner. Wenn sie interaktiv funktioniert, ist es unwahrscheinlich, dass sie bei der Ausführung als geplante Aufgabe ein Problem darstellt.

Was Ihnen hier fehlt, sind Informationen. Mit zwei Befehlen und ohne Protokollierung erhalten Sie keine Informationen. Und Sie laden das Active Directory-Modul nicht, was einiges erklären könnte.

Hier ist ein Beispiel, wie Sie ein PowerShell-Skript als geplante Aufgabe starten und die Ausgabe protokollieren:

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

Hier ist ein Beispiel für das Laden des Active Directory-Moduls:

$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())

Antwort4

Es wird so etwas wie dieses Programm/Skript sein. Powershell.exe Argument und Pfad

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

Bildbeschreibung hier eingeben

verwandte Informationen