shooan
Goto Top

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

Content-ID: 666471

Url: https://administrator.de/contentid/666471

Ausgedruckt am: 22.11.2024 um 20:11 Uhr

DerWoWusste
DerWoWusste 06.05.2021 um 10:53:43 Uhr
Goto Top
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?
148121
148121 06.05.2021 aktualisiert um 10:57:13 Uhr
Goto Top
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 face-wink. Btw. das Skript kann auch auf anderen Maschinen laufen, EWS funktioniert ja über den IIS (https).

Gruß w.
Doskias
Doskias 06.05.2021 um 10:56:24 Uhr
Goto Top
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
DerWoWusste
DerWoWusste 06.05.2021 um 11:08:32 Uhr
Goto Top
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
148121
148121 06.05.2021 aktualisiert um 11:18:53 Uhr
Goto Top
Zitat von @DerWoWusste:

Powershell aus dem Exchange startet das Modul automatisch mit, Powershell aus system32 nicht.
Das wird's vermutlich sein.
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... 🤔
shooan
shooan 06.05.2021 um 11:37:58 Uhr
Goto Top
Zitat von @DerWoWusste:

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?

Die Aufgabe startet.
Aber sie Arbeitet nicht. Es wird auch nicht gemeldet das die Aufgabe schon gestartet ist.
DerWoWusste
DerWoWusste 06.05.2021 um 11:38:45 Uhr
Goto Top
Ja...und der Rest, der psexec-Test?
shooan
shooan 06.05.2021 um 11:40:55 Uhr
Goto Top
Zitat von @148121:

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 face-wink. Btw. das Skript kann auch auf anderen Maschinen laufen, EWS funktioniert ja über den IIS (https).

Gruß w.

Der Exchange ist ja gestartet. Habe diese Aufgabe ja von Hand erst mal gestartet über die Aufgabenplanung um es zu testen.
Würde das Skript gerne auf dem Exchange Belassen den dort ist es ja auch "zu Hause".
Später Soll eine Verzögerung von 10 Minuten rein beim Systemstart.

Unser Exchange ist in gut 5 Minuten durchgebootet, dank SSD face-wink

Beste Grüße
Shooan
shooan
shooan 06.05.2021 um 11:41:45 Uhr
Goto Top
Zitat von @DerWoWusste:

Ja...und der Rest, der psexec-Test?
da bin ich noch drann nur Ruhig
shooan
shooan 06.05.2021 um 11:50:47 Uhr
Goto Top
Ich vergas zu Ewähnen das das Skript auf den EWS zurückgreift.

gerne Zeige ich das Skript mal bei dem @148121 geholfen hat es zu erstellen.

# ===== 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)

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

# 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 | %{
        # Mail-Details mit übermittelter ItemId abrufen
        $mail = $null
        try{
            [Microsoft.Exchange.WebServices.Data.EmailMessage]$mail = [Microsoft.Exchange.WebServices.Data.EmailMessage]::Bind($global:ews,$_.ItemId)
        }catch{}
        # Wenn die Mail gefunden wurde ...
        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
        }
    }
}

# 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){
        $global:connection.Open()
    }
    write-host "Connected." -F Green  
}

# Subscription erstellen
$global:connection.AddSubscription($global:subscription)
# Subscription öffnen
$global:connection.Open()


write-host "Waiting for new events ..." -F Green  
while($true){
    sleep 1
}

Gestetst habe ich das Skript mit der Normalen Powershell nicht die Spezielle für Exchange, da lief es problemlos und verarbeitetet die Mail.
148121
148121 06.05.2021 aktualisiert um 12:09:30 Uhr
Goto Top
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.
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 face-wink
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 ...
148121
148121 06.05.2021 aktualisiert um 12:07:29 Uhr
Goto Top
Zitat von @shooan:
Die Aufgabe startet.
Woran siehst du es genau?
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
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)
shooan
shooan 06.05.2021 aktualisiert um 13:35:56 Uhr
Goto Top
Zitat von @148121:

Zitat von @shooan:
Die Aufgabe startet.
Woran siehst du es genau?

Zumindest sagt mir das der Aufgabenplaner Status: Wird Ausgeführt

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
> 
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

**********************
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
**********************
Doskias
Doskias 06.05.2021 um 13:32:50 Uhr
Goto Top
Zitat von @shooan:

Zitat von @148121:

Zitat von @shooan:
Die Aufgabe startet.
Woran siehst du es genau?

Zumindest sagt mir das der Aufgabenplaner Status: Wird Ausgeführt
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.

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
>> 
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

**********************
> 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
> **********************
> 
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
shooan
shooan 06.05.2021 um 13:36:27 Uhr
Goto Top
Danke für den Tipp
shooan
shooan 06.05.2021 um 13:41:57 Uhr
Goto Top
Das Skript liegt ja im Installationsverzeichniss des EWS.

Von dort aus läst es sich ja starten.

Kann es sein das die Powershell beim starten im Falschen Pfad hängt?
shooan
shooan 06.05.2021 aktualisiert um 13:50:55 Uhr
Goto Top
Zitat von @DerWoWusste:

Ja...und der Rest, der psexec-Test?


Das kommt dabei raus wenn es als System ausgeführt wird.
Dann ist mir klar wieso das als System nicht laufen würde.
system
DerWoWusste
DerWoWusste 06.05.2021 um 14:02:12 Uhr
Goto Top
Ok, und nun starte die ISE mit dem anderen Account, welches du für den Task vergeblich benutzt hattest.
shooan
shooan 06.05.2021 aktualisiert um 14:22:08 Uhr
Goto Top
ISE als mein admin User gestartet nur als user nicht expliziet als Administrator.
Da kommt die gleiche sache.

also fehlen ihm die Typen?

Anbei noch ein Screenshot von der Ausgabe als User
fehler als user
DerWoWusste
DerWoWusste 06.05.2021 aktualisiert um 14:23:46 Uhr
Goto Top
Die Microsoft.Exchange.WebServices.dll muss im selben Pfad liegen, wie das Skript!
shooan
shooan 06.05.2021 um 14:37:06 Uhr
Goto Top
Liegen Sie doch. Wenn man das Skript so startet geht es ja.
skript und datein im gleichen verzeichniss
DerWoWusste
DerWoWusste 06.05.2021 aktualisiert um 14:41:01 Uhr
Goto Top
Und im Task ist auch eingestellt, dass dieses Skript in dem Verzeichnis auszuführen ist ("ausführen in")?
shooan
shooan 06.05.2021 um 15:12:35 Uhr
Goto Top
Natürlich
schaut du hier
starten in
148121
148121 06.05.2021 aktualisiert um 16:34:27 Uhr
Goto Top
Zitat von @shooan:
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
> **********************
> 
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):

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
}
shooan
shooan 06.05.2021 um 15:52:29 Uhr
Goto Top
Jetzt kommt folgende ausgabe bein starten des Skriptes

**********************
Start der Windows PowerShell-Aufzeichnung
Startzeit: 20210506155051
Benutzername: domain\admm
Als Benutzer ausführen: domain\admm
Computer: Exchange Server (Microsoft Windows NT 6.3.9600.0)
Hostanwendung: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Prozess-ID: 6732
**********************
Die Aufzeichnung wurde gestartet. Die Ausgabedatei ist "e:\log_skript\log1.txt".  

PS C:\Program Files\Microsoft\Exchange\Web Services\2.2> .\01.ps1
Ausnahme beim Aufrufen von "SubscribeToStreamingNotifications" mit 2 Argument(en):  "The request failed. Der  
Remotename konnte nicht aufgelöst werden: 'ex.domain.tld'"  
In C:\Program Files\Microsoft\Exchange\Web Services\2.2\01.ps1:40 Zeichen:1
+ $global:subscription = $global:ews.SubscribeToStreamingNotifications([Microsoft. ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ServiceRequestException


Id     Name            PSJobTypeName   State         HasMoreData     Location             Command
--     ----            -------------   -----         -----------     --------             -------
2      NewMailNotif...                 NotStarted    False                                ...
3      OnDisconnect...                 NotStarted    False                                ...
Ausnahme beim Aufrufen von "AddSubscription" mit 1 Argument(en):  "Der Wert darf nicht NULL sein.  
Parametername: subscription"  
In C:\Program Files\Microsoft\Exchange\Web Services\2.2\01.ps1:79 Zeichen:1
+ $global:connection.AddSubscription($global:subscription)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) , MethodInvocationException
    + FullyQualifiedErrorId : ArgumentNullException

Ausnahme beim Aufrufen von "Open" mit 0 Argument(en):  "You must add at least one subscription to this connection  
before it can be opened."  
In C:\Program Files\Microsoft\Exchange\Web Services\2.2\01.ps1:81 Zeichen:1
+ $global:connection.Open()
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) , MethodInvocationException
    + FullyQualifiedErrorId : ServiceLocalException

Waiting for new events ...

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: 20210506155120
**********************
148121
148121 06.05.2021 aktualisiert um 16:13:27 Uhr
Goto Top
"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.
Doskias
Doskias 06.05.2021 um 16:32:42 Uhr
Goto Top
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
shooan
shooan 06.05.2021 um 16:42:08 Uhr
Goto Top
Zitat von @148121:

"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.

Welcher Dienst genau wird denn heir abgefragt?
Was für eine Schleife würdest du denn vorschlagen diesbezüglich zu nehmen.


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.

Bin mir sicher das das Skript funktioniert, denn es sieht auch sehr strukturiert aus
148121
148121 06.05.2021 um 16:51:39 Uhr
Goto Top
S. Anpassung oben.
shooan
shooan 06.05.2021 aktualisiert um 18:20:30 Uhr
Goto Top
Ähm, leider muss ich dir sagen jetzt geht leider das Skript nicht mehr. face-sad

Ahh den fehler gefunden hatte vergessen die Anpassungen vor zu nehmen.

und dann funktioniert es auch schon, siehe das Log file

**********************
Start der Windows PowerShell-Aufzeichnung
Startzeit: 20210506173800
Benutzername: domain\user
Als Benutzer ausführen: domain\user
Computer: Exchange Server (Microsoft Windows NT 6.3.9600.0)
Hostanwendung: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Prozess-ID: 6732
**********************
Die Aufzeichnung wurde gestartet. Die Ausgabedatei ist "e:\log_skript\log2.txt".  

PS C:\Program Files\Microsoft\Exchange\Web Services\2.2> .\02.ps1

PS C:\Program Files\Microsoft\Exchange\Web Services\2.2> TerminatingError(): "Die Pipeline wurde beendet."  
>> TerminatingError(): "Die Pipeline wurde beendet."  

PS C:\Program Files\Microsoft\Exchange\Web Services\2.2> .\02.ps1

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> .\02.ps1
Waiting for new events ...
NewMail subscription event received.
Replying  Mail with Subject '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: 20210506181928
**********************
shooan
shooan 06.05.2021 um 18:31:15 Uhr
Goto Top
Zitat von @Doskias:

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

Das ist ein sehr guter Ansatz den werde ich mir mal im Hinterkopf behalten
shooan
shooan 07.05.2021 um 07:38:12 Uhr
Goto Top
Guten Morgen,

ich fasse noch mal zusammen.

Das Skript funktioniert wenn man es in der Powershell direkt aufruft siehe Screenshot.
skript geht1
was ich auch verstanden habe das so genannte Arbeitsverzeichniss $PSScriptRoot ist das Verzeichiss wo auch die ganzen Dateien vom EWS liegen müssen.

Das ist auch Super, was natürlich nicht ist wenn ich mich nun abmelde von dem Server wird ja auch die Powershell Konsole geschlossen.

Daher soll das ganze ja im Hintergrund Laufen. Ob das Skript nun die ganze Zeit rennt oder alle 5 Minuten gestartet wird schaut ob was neues gekommen ist und dann wieder sich beendet ist in erste linie erst mal zweitranig.

Wichtig ist mir das es läuft. Wie oft der Exchange neu gestarte wird das hängt von Microsoft ab wie ofst dieser Updates bekommt, aber in der Regel wird er ein mal im Monat durch gestattet.

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
allgemein
und unter Aktion sieht es so aus
aktion
Programm: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Argumente: -command "c:\C:\Skripte\Autorespnder_Bewerbung.ps1"
Starten in: c:\C:\Skripte

In dem Verzeichniss liegen auch alle benötigten Dateien.
dateien_verzeichniss

Wo ist denn mein Denkfehler das das ganze nicht gehen soll?

Beste Grüße

Shooan
Auch ein Task der nur das Skript starten soll ohne irgendwelche Trigger funktioniert auch nicht
148121
148121 07.05.2021 aktualisiert um 08:03:41 Uhr
Goto Top
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.

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
allgemein
und unter Aktion sieht es so aus
aktion
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 😁.

Also trink nen Kaffee, zieh die Handschuhe aus, und mach es richtig dann funktioniert das auch.

Gruß w.
shooan
shooan 07.05.2021 um 09:42:21 Uhr
Goto Top
Zitat von @148121:

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.

Wieder das dazu gelernt.

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
allgemein
und unter Aktion sieht es so aus
aktion
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"

Den tippfehler habe ich auch schon gesehen. Wurde auch schon behoben. Da gebe ich dir recht dann kann das nicht gehen.

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 😉

Das Stimmt die Erfahrung mit Skriten und den Taks ist mir nicht gerade geläufig. Da muss noch nachgebessert werden

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 😁.

Also trink nen Kaffee, zieh die Handschuhe aus, und mach es richtig dann funktioniert das auch.

Kaffee ist getrunken. Wenn man das Richtig verstanden hat braucht es den Trigger damit das los läuft. Du schriebst das es am besten sei zu Testen ob die Dienste da sind. Nun stellt sich mir die Frage was für ein Trigger sin machen würde? Systemstart? da ist dann aber noch nicht sichergestellt das auch die Dienste Laufen. Oder doch beim Start und ne verzögerung von 10 Minuten rein?
Oder nach einem Ereigniss? Vielleicht wenn der Dienst Microsoft Exchange-Transport gestartet ist?

Gruß w.
shooan
shooan 07.05.2021 um 14:56:26 Uhr
Goto Top
Nun habe ich es doch glatt hin bekommen das da Skript über den Task-Planer staren kann.

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.
trigger
Fakt ist aber das es aktuell Läuft und so wollte ich das haben.
Ich denke das ich die Zeit noch mal anpassen werde.

Oder hat noch jemand eine bessere Idee wie man es anders Ausführen lassen kann?

Bedanken möchte ich mich bei allen die Sie die Zeit und mir die Hilfe gegeben haben das Thema hier ab zu arbeiten.

Beste Grüße

Shooan
148121
148121 07.05.2021 aktualisiert um 16:06:07 Uhr
Goto Top
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 Task
screenshot
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 face-big-smile.

Oder hat noch jemand eine bessere Idee wie man es anders Ausführen lassen kann?
Ich würde das für den Zweck du du da hast auch so machen wie @Doskias es vorschlägt, denn das Skript erfasst ja jetzt keine Mails die eintreffen wenn das Skript mal nicht läuft, bzw. erfasst keine zwischenzeitlich eintreffenden Mails auch bei einem Reboot. Für deinen Zweck ist obige das eher ungeeignet und da macht es eher Sinn z.B. alle 5 Minuten den Posteingang via Task zu verarbeiten so erfasst das Skript dann auch alle anderen ungelesenen Mails. Das Skript oben ist dafür aber nicht ausgelegt denn es verarbeitet asynchrone Events die nur dann verarbeitet werden wenn das Skript dauerhaft läuft, ist also für diese Art der Prüfung (alle 5 Minuten nicht geeignet).

Gruß w.

p.s. Wenn's das dann war den Thread bitte als gelöst markieren!