Aufgabenplanung PowerShell Skript startet nicht
Hallo Zusammen,
ich habe ein Skript bekommen das ich gerne so einstellen will das dieses beim Start des Exchangeservers aktiviert werden soll.
Ein Ausführung auf dem Exchangeserver in der Powershell funktioniert. Es macht dann auch was es soll.
Nur eben nicht wenn es in die Aufgabenplanung gepackt wird.
Bei dem Betreffenden Server handelt es sich um einen 2012r2.
In den Einstellungen der Aufgabenplanung wurde folgende Einstellungen vor genommen.
Allgemein:
Benutzerkonto: Admin User aus der Domäne. Aber auch schon dort mal mit System das gnze versucht.
- Unabhänig von der Benutzeranmeldung ausführen
Trigger:
Beim Start - Beim Systemstart Status Aktiviert
Aktion:
Programm Starten
Programm/Skript
%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe
Argumente
-file „C:\Program Files\Microsoft\Exchange\Web Services\2.2\Auto_Antwort_fuer_Bewerbungen.ps1“
das ganze auch schon mit -command versucht leider ohne Erfolg.
Sonnst ist nix mehr in der Aufgabe eingestellt.
Wo liegt denn der Denkfehler? Ach und der Befehl damit Skriptdateien überhaupt ausgeführt werden können wurde auch abgesetzt.
Beste Grüße
Shooan
ich habe ein Skript bekommen das ich gerne so einstellen will das dieses beim Start des Exchangeservers aktiviert werden soll.
Ein Ausführung auf dem Exchangeserver in der Powershell funktioniert. Es macht dann auch was es soll.
Nur eben nicht wenn es in die Aufgabenplanung gepackt wird.
Bei dem Betreffenden Server handelt es sich um einen 2012r2.
In den Einstellungen der Aufgabenplanung wurde folgende Einstellungen vor genommen.
Allgemein:
Benutzerkonto: Admin User aus der Domäne. Aber auch schon dort mal mit System das gnze versucht.
- Unabhänig von der Benutzeranmeldung ausführen
Trigger:
Beim Start - Beim Systemstart Status Aktiviert
Aktion:
Programm Starten
Programm/Skript
%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe
Argumente
-file „C:\Program Files\Microsoft\Exchange\Web Services\2.2\Auto_Antwort_fuer_Bewerbungen.ps1“
das ganze auch schon mit -command versucht leider ohne Erfolg.
Sonnst ist nix mehr in der Aufgabe eingestellt.
Wo liegt denn der Denkfehler? Ach und der Befehl damit Skriptdateien überhaupt ausgeführt werden können wurde auch abgesetzt.
Beste Grüße
Shooan
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 666471
Url: https://administrator.de/contentid/666471
Ausgedruckt am: 22.11.2024 um 20:11 Uhr
36 Kommentare
Neuester Kommentar
Hi.
Du hast vergessen, den Fehler zu beschreiben.
->Startet die Aufgabe nicht?
->Startet sie, aber arbeitet nicht?
->Startet sie, aber der Taskplaner meldet bereits, dass die Aktion nicht ausgeführt werden kann?
Zur DIagnose:
Downloade psexec, starte eine elevated command shell und darauf startest Du powershell so:
psexec -s -i powershell_ise
Nun hast Du eine Powershell_ISE als Systemkonto gestartet. Lade da dein Skript rein und lass es laufen - was m,eldet es als Systemkonto?
Du hast vergessen, den Fehler zu beschreiben.
->Startet die Aufgabe nicht?
->Startet sie, aber arbeitet nicht?
->Startet sie, aber der Taskplaner meldet bereits, dass die Aktion nicht ausgeführt werden kann?
Zur DIagnose:
Downloade psexec, starte eine elevated command shell und darauf startest Du powershell so:
psexec -s -i powershell_ise
Nun hast Du eine Powershell_ISE als Systemkonto gestartet. Lade da dein Skript rein und lass es laufen - was m,eldet es als Systemkonto?
Wo liegt denn der Denkfehler?
Naja, wenn du das beim Systemstart ausführen lässt auf dem Server auf dem auch der EX selbst läuft musst du auch erst mal sicherstellen das die Exchange Dienste überhaupt alle schon gestartet sind und eine entsprechende Prüfung einbauen das das Skript so lange wartet bis es soweit ist das der EX Anfragen über EWS akzeptiert . Btw. das Skript kann auch auf anderen Maschinen laufen, EWS funktioniert ja über den IIS (https).Gruß w.
Moin,
Ohne dein Skript zu kennen, was genau macht es denn. Und wie ist das Ergebnis der Ausführung in der Aufgabenplanung.
Aus dem bauch heraus schätze ich, dass du im Skript nicht das Exchange-Modul geladen hast und daher das Skript zwar gestartet wird, aber durch das fehlende Modul nicht ausgeführt wird. Powershell aus dem Exchange startet das Modul automatisch mit, Powershell aus system32 nicht.
Ansonsten reicht es aus Programm mit powershell.exe zu öffnen und der richtige Syntax ist -command "PS1-Datei"
Gruß
Doskias
Ohne dein Skript zu kennen, was genau macht es denn. Und wie ist das Ergebnis der Ausführung in der Aufgabenplanung.
Aus dem bauch heraus schätze ich, dass du im Skript nicht das Exchange-Modul geladen hast und daher das Skript zwar gestartet wird, aber durch das fehlende Modul nicht ausgeführt wird. Powershell aus dem Exchange startet das Modul automatisch mit, Powershell aus system32 nicht.
Ansonsten reicht es aus Programm mit powershell.exe zu öffnen und der richtige Syntax ist -command "PS1-Datei"
Gruß
Doskias
Powershell aus dem Exchange startet das Modul automatisch mit, Powershell aus system32 nicht.
Das wird's vermutlich sein.Dazu ins Skript am Anfang einfügen:
# Import Exchange add-in module
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://deinexchange.domainextension/PowerShell/ -Authentication Kerberos
Import-PSSession $Session -AllowClobber
Zitat von @DerWoWusste:
Nee, is es nicht, kenne das Skript, hab's ihm aus einem Skript im Forum angepasst, läuft komplett über EWS, das braucht die Exchange CMDLets nicht. Er hätt mich ja auch direkt anschreiben können, aber es musste hier ja extra nen neuen Fred für aufmachen... 🤔Powershell aus dem Exchange startet das Modul automatisch mit, Powershell aus system32 nicht.
Das wird's vermutlich sein.Zitat von @shooan:
Der Exchange ist ja gestartet. Habe diese Aufgabe ja von Hand erst mal gestartet über die Aufgabenplanung um es zu testen.
Ja aber darum geht es ja nicht.Der Exchange ist ja gestartet. Habe diese Aufgabe ja von Hand erst mal gestartet über die Aufgabenplanung um es zu testen.
Später Soll eine Verzögerung von 10 Minuten rein beim Systemstart.
Nicht später, jetzt, sonst ist klar das das Probleme gibt weil Aufgabenplanungs-Skripts gestartet werden wenn der Taskplaner Dienst läuft.Unser Exchange ist in gut 5 Minuten durchgebootet, dank SSD
Bedeutet nichts, entscheidend ist ob die Dienste schon bei Ausführung des Startskripts laufen, und das musst du eben im Skript prüfen sonst läuft das ja auf eine Exception und bricht schon ab bevor es auf die Events warten kann ...
Woran siehst du es genau?
Dann siehst du schwarz auf weiß was passiert und ob das Teil überhaupt gestartet wird. (Nicht vergessen Schreibrechte auf den Pfad für das auszuführende Prinzipal zu vergeben falls nicht schon gegeben)
Aber sie Arbeitet nicht. Es wird auch nicht gemeldet das die Aufgabe schon gestartet ist.
Wat denn jetzt? Bau dir einfach ein Logging in das Skript ein mittelsStart-Transcript 'D:\Pfad\log.txt'
# .... rest des Skripts
Stop-Transcript
Das sagt die die Aufgabenplanung aber auch, wenn du ein Skript startest und dort die Module nicht geladen werden. Die Aufgabenplanung startet das Skript erfolgreich und führt sie aus, das heißt aber nicht, dass das Skript auch läuft.
Dann siehst du schwarz auf weiß was passiert und ob das Teil überhaupt gestartet wird. (Nicht vergessen Schreibrechte auf den Pfad für das auszuführende Prinzipal zu vergeben falls nicht schon gegeben)
Hier der Log des Skrites
In deinem Log steht ganz oben noch eure Domain und der Name eures Exchange. Solltest du ggf. mal unkenntlich machen. Hab es bei mir schon unkenntlich gemacht.
Gruß
Doskias
Aber sie Arbeitet nicht. Es wird auch nicht gemeldet das die Aufgabe schon gestartet ist.
Wat denn jetzt? Bau dir einfach ein Logging in das Skript ein mittels>> Start-Transcript 'D:\Pfad\log.txt'
>> # .... rest des Skripts
>> Stop-Transcript
>>
Hier der Log des Skrites
**********************
> Start der Windows PowerShell-Aufzeichnung
> Startzeit: 20210506123423
> Benutzername: **hier unkenntlich machen**
> Als Benutzer ausführen: **hier unkenntlich machen**
> Computer: **hier unkenntlich machen** (Microsoft Windows NT 6.3.9600.0)
> Hostanwendung: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
> Prozess-ID: 27676
> **********************
> Die Aufzeichnung wurde gestartet. Die Ausgabedatei ist "e:\log_skript\log.txt".
>
> PS C:\Program Files\Microsoft\Exchange\Web Services\2.2> .\Auto_Bewerbung.ps1
>
> Id Name PSJobTypeName State HasMoreData Location Command
> -- ---- ------------- ----- ----------- -------- -------
> 10 NewMailNotif... NotStarted False ...
> 11 OnDisconnect... NotStarted False ...
> Waiting for new events ...
> NewMail subscription event received.
> Replying Mail with Subject 'RE: AW: AW: AW: Test' to 'shooan@gmx.de'
>
> PS C:\Program Files\Microsoft\Exchange\Web Services\2.2> TerminatingError(): "Die Pipeline wurde beendet."
>>> TerminatingError(): "Die Pipeline wurde beendet."
>>> TerminatingError(): "Die Pipeline wurde beendet."
>
> PS C:\Program Files\Microsoft\Exchange\Web Services\2.2> Stop-Transcript
> **********************
> Ende der Windows PowerShell-Aufzeichnung
> Endzeit: 20210506123553
> **********************
>
Gruß
Doskias
Zitat von @shooan:
Hier der Log des Skrites
OK es läuft also korrekt an, stoppt dann aber nach dem ersten Eintreffen einer Mail und Versenden der Antwort mit einem Terminating Error(). Dann lass uns mal schauen was da der Fehler ist und kappseln die Methodenaufrufe im Event mit einem Try-Catch um zu sehen was ihm beim Versenden nicht passt (Die laufen in einem separaten Thread, muss man etwas nachhelfen das diese auch auf der Konsole angezeigt werden):Hier der Log des Skrites
**********************
> Start der Windows PowerShell-Aufzeichnung
> Startzeit: 20210506123423
> Benutzername: Domain\admm
> Als Benutzer ausführen: domain\admm
> Computer: Exchangeserver (Microsoft Windows NT 6.3.9600.0)
> Hostanwendung: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
> Prozess-ID: 27676
> **********************
> Die Aufzeichnung wurde gestartet. Die Ausgabedatei ist "e:\log_skript\log.txt".
>
> PS C:\Program Files\Microsoft\Exchange\Web Services\2.2> .\Auto_Bewerbung.ps1
>
> Id Name PSJobTypeName State HasMoreData Location Command
> -- ---- ------------- ----- ----------- -------- -------
> 10 NewMailNotif... NotStarted False ...
> 11 OnDisconnect... NotStarted False ...
> Waiting for new events ...
> NewMail subscription event received.
> Replying Mail with Subject 'RE: AW: AW: AW: Test' to 'mail@gmx.de'
>
> PS C:\Program Files\Microsoft\Exchange\Web Services\2.2> TerminatingError(): "Die Pipeline wurde beendet."
>>> TerminatingError(): "Die Pipeline wurde beendet."
>>> TerminatingError(): "Die Pipeline wurde beendet."
>
> PS C:\Program Files\Microsoft\Exchange\Web Services\2.2> Stop-Transcript
> **********************
> Ende der Windows PowerShell-Aufzeichnung
> Endzeit: 20210506123553
> **********************
>
Wie @DerWoWusste schon schreibt ist es bei dem Script im Moment so definiert das die DLL im Verzeichnis des Scripts liegen muss "und das muss nicht das Arbeitsverzeichnis sein" denn $psscriptroot ist immer das Verzeichnis in dem das Skript selbst liegt. Aber auch nur wenn das Skript gespeichert ist, wenn man es nur per Copy n Paste in der ISE testet ist $psscriptroot leer, deswegen auch die Fehlermeldungen weil die Namespaces aus der DLL nicht geladen werden können!
# ===== START VARS =====
# Mailbox dessen Posteingang zu überwachen ist
$global:USERNAME = 'USERNAME'
$global:PASSWORD = 'PASSSWORD'
# Exchange-Server FQDN
$global:EXSERVER = 'EX.DOMAIN.TLD'
# ===== END VARS =====
$global:CONNECTIONTIMEOUT = 30
if ($PSVersionTable.PSVersion.Major -lt 3){write-host "ERROR: Minimum Powershell Version 3.0 is required!" -F Yellow; return}
# EWS DLL laden
Add-Type -Path "$PSScriptRoot\Microsoft.Exchange.WebServices.dll"
Get-EventSubscriber | Unregister-Event -Force
# Allen Zertifikaten vertrauen
Add-Type @"
using System.Net;
using System.Security.Cryptography.X509Certificates;
public class TrustAllCertsPolicy : ICertificatePolicy {
public bool CheckValidationResult(
ServicePoint srvPoint, X509Certificate certificate,
WebRequest request, int certificateProblem) {
return true;
}
}
"@
# Trust all certs policy dem ServicePointManager zuweisen
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy
# EWS Objekt erstellen
$global:ews = new-object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010_SP2)
$global:ews.Url = "https://$global:EXSERVER/ews/exchange.asmx"
# Benutze die Credentials mit dem das Skript ausgeführt wird
$global:ews.UseDefaultCredentials = $false
$global:ews.Credentials = new-object System.Net.NetworkCredential($global:USERNAME,$global:PASSWORD)
while(!$global:subscription){
try{
$global:subscription = $global:ews.SubscribeToStreamingNotifications([Microsoft.Exchange.WebServices.Data.FolderId[]](New-Object Microsoft.Exchange.WebServices.Data.FolderId ([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox)),[Microsoft.Exchange.WebServices.Data.EventType]::NewMail)
$global:connection = New-Object Microsoft.Exchange.WebServices.Data.StreamingSubscriptionConnection($global:ews,$global:CONNECTIONTIMEOUT)
}catch{
}
}
# Event das beim Eintreffen einer/mehrerer neuer Mails ausgeführt wird
Register-ObjectEvent $global:connection -EventName OnNotificationEvent -SourceIdentifier NewMailNotification -Action {
write-host "NewMail subscription event received." -F Green
# Alle eingetroffenen Mails verarbeiten
$Event.SourceEventArgs.Events | %{
try{
[Microsoft.Exchange.WebServices.Data.EmailMessage]$mail = [Microsoft.Exchange.WebServices.Data.EmailMessage]::Bind($global:ews,$_.ItemId)
if ($mail){
# lade Details der Mail
$mail.Load()
write-host "Replying Mail with Subject '$($mail.Subject)' to '$($mail.Sender.Address)'" -F Green
# Antwort erstellen
$mail_reply = $mail.CreateReply($false)
# benutzerdefinierte Antwort angeben
$mail_reply.BodyPrefix = 'Sehr geehrte Damen und Herren,<br/>das ist Test.<br/>Mit freundlichen Grüßen<br/>Firma XYZ'
# Antworten senden und Kopie speichern
$mail_reply.SendAndSaveCopy()
# Ursprüngliche Mail als gelesen markieren
$mail.IsRead = $true
}
}catch{
write-host "EXCEPTION: $($_.Exception.Message)" -F Red
}
}
} | out-null
# Event das beim Disconnect der Verbindung ausgeführt wird (Verbindung wird dann erneut hier wiederhergestellt)
Register-ObjectEvent $global:connection -EventName OnDisconnect -SourceIdentifier OnDisconnectNotification -Action {
write-host "Subscription-Connection disconnected, restarting connection ... " -F Yellow -NoNewline
while(!$global:connection.IsOpen){
try{
$global:connection.Open()
}catch{}
}
write-host "Connected." -F Green
} | out-null
try{
# Subscription erstellen
$global:connection.AddSubscription($global:subscription)
# Subscription öffnen
$global:connection.Open()
}catch{
write-host "EXCEPTION: $($_.Exception.Message)" -F Red
}
write-host "Waiting for new events ..." -F Green
while($true){
sleep 1
}
"Der Wert darf nicht NULL sein. Parametername: subscription"
Das war das was ich gesagt hatte, beim Start des Computers sind zu dem Zeitpunkt die Services noch nicht alle bereit und fällt das Hinzufügen der Subscription in einen Fehler und die Variable ist leer. Kannst du dir eine Schleife hinzufügen zum Warten auf die Bereitschaft der Dienste.Habe das Skript hier an meinem Exchange im Lab einwandfrei mit dem Taskplaner laufen lassen, macht das was es soll ...
Isch bin somit erst mal raus.
Ich persönlich würde den Start des Skriptes noch einmal überdenken. Dein Skript läuft beim Starten des Exchange und dann (wenn es nicht abbricht) endlos. Wenn es abbricht läuft es aber nicht nochmal los bis du den Exchange gestartet hast. Die Frage ist: Wie oft startest du den Exchange? Ich meinen zumindest nicht täglich. Was spricht dagegen das Skript einfach alle 5 Minuten auszuführen mit der Option, dass es nicht doppelt gestartet werden darf. Dann hast du zum einen das Problem nicht, dass du auf die Dienste warten musst und zum anderen startet das Skript automatisch neu, wenn es mal abstürzt. Ja das Postfach wird dann nicht Echtzeitüberwacht, aber E-Mail Kommunikation ist nun mal keine Echtzeitkommunikation. Und ob die Auto-Antwort für die Bewerbung sofort nach erhalt raus geht oder alle 5 Minuten ist in meinen Augen nicht entscheidend.
Wenn ich dir um 16:32 eine Bewerbung schreibe ist mir egal ob ich die Eingangsbestätigung um 16:33, 16:35 oder 16:39 erhalte.
Gruß
Doskias
Wenn ich dir um 16:32 eine Bewerbung schreibe ist mir egal ob ich die Eingangsbestätigung um 16:33, 16:35 oder 16:39 erhalte.
Gruß
Doskias
S. Anpassung oben.
Zitat von @shooan:
was ich auch verstanden habe das so genannte Arbeitsverzeichniss $PSScriptRoot ist das Verzeichiss wo auch die ganzen Dateien vom EWS liegen müssen.
Falsch. $psscriptroot ist bei einem Powershell-Skript wie ich oben schon geschrieben habe immer das Verzeichnis in dem das Skript selbst liegt, und die angegebene DLL kann auch irgendwo anders liegen nur musst du dann den Pfad im Path Parameter von Add-Type entsprechend anpassen. Die anderen EWS Dateien benötigt man nicht es reicht vollkommen die eine DLL.was ich auch verstanden habe das so genannte Arbeitsverzeichniss $PSScriptRoot ist das Verzeichiss wo auch die ganzen Dateien vom EWS liegen müssen.
Daher dachte ich es ist ne gute Idee das Skript über die Aufgabenplanung starten zu lassen beim Systemstart. Nur will das ganze nicht startetn.
Habe schon alles Probiert. Das schlimme ist das es ja beim @148121 geht
Das schlechte ist ja das überhaupt keine Meldungen kommen.
Unter Allgemein ist das eingestellt bei dem Task
und unter Aktion sieht es so aus
Programm: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Argumente: -command "c:\C:\Skripte\Autorespnder_Bewerbung.ps1"
Starten in: c:\C:\Skripte
Habe schon alles Probiert. Das schlimme ist das es ja beim @148121 geht
Das schlechte ist ja das überhaupt keine Meldungen kommen.
Unter Allgemein ist das eingestellt bei dem Task
und unter Aktion sieht es so aus
Programm: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Argumente: -command "c:\C:\Skripte\Autorespnder_Bewerbung.ps1"
Starten in: c:\C:\Skripte
Einiges falsch und Pfad doppelt gemoppelt (c:\c:\) und Tippfehler im Dateinamen. Das kann so niemals funktionieren!! Erstens stelle mal den Account auf SYSTEM um andere Berechtigungsprobleme erst mal auszuschließen, dann die Argumente auf
-EP ByPass -File "c:\Skripte\Autoresponder_Bewerbung.ps1"
Wo ist denn mein Denkfehler das das ganze nicht gehen soll?
Da ist kein Denkfehler du scheinst einfach noch zu wenig Erfahrung mit Tasks und Skripten an sich zu haben 😉Beste Grüße
Shooan
Auch ein Task der nur das Skript starten soll ohne irgendwelche Trigger funktioniert auch nicht
Logisch wenn er schon falsch angelegt ist 😁.Shooan
Auch ein Task der nur das Skript starten soll ohne irgendwelche Trigger funktioniert auch nicht
Also trink nen Kaffee, zieh die Handschuhe aus, und mach es richtig dann funktioniert das auch.
Gruß w.
Zitat von @shooan:
Eingestellt ist es so das es jeden Tag um 14 Uhr gestartet werden soll.
Wie es sich nun verhällt wenn es morgen um 14 uhr noch mal ausgeführt werden soll das kann ich noch nicht beurteilen.
Das regelt diese Einstellung im TaskEingestellt ist es so das es jeden Tag um 14 Uhr gestartet werden soll.
Wie es sich nun verhällt wenn es morgen um 14 uhr noch mal ausgeführt werden soll das kann ich noch nicht beurteilen.
Was passieren würde wenn es jeden Tag eine neue Instanz gestartet werden würde kann ich dir sagen: Dann würde jede Mail so oft beantwortet wie es PS Prozesse gibt, nach einer Woche also ein Bewerber gleich 7 Antwortmails erhalten wenn die Einstellung oben anders gesetzt wäre .
Oder hat noch jemand eine bessere Idee wie man es anders Ausführen lassen kann?
Gruß w.
p.s. Wenn's das dann war den Thread bitte als gelöst markieren!