Hier ist es nun, mein eigenes Script.
Diese Seite beinhaltet alle Relevanten Informationen zu dem Script sowie das Change Log. Selbstverständlich kann das Script hier auch als *.zip-Datei heruntergeladen werden :)
[wpfilebase tag=browser id=9/]
[wpfilebase tag=browser id=7/]
[wpfilebase tag=browser id=5/]
[wpfilebase tag=browser id=4/]
[wpfilebase tag=file id=7]
[wpfilebase tag=file id=5]
[wpfilebase tag=file id=1]
Der Leser Stafan hat noch folgenden Hinweis für die Verwendung auf Windows 8.1 x64 Systemen:
Das Problem scheint hauptsächlich mit der .dll Datei zusammen zu hängen, ich habe den Folgenden Schritt jedoch für die .dll, .config, .ps1 und .ini ausgeführt: Rechtsklick auf die jeweilige Datei –> Eigenschaften –> Unten der Button „Diese Datei stammt von einem anderen Computer…“ –> Zulassen
Danke Stefan :)
<# Exchange Server / O365 Out of Office Tool 2.3 © Andres Sichel // asichel.de // blog@asichel.de Hilft bei der Konfiguration von Abwesenheitsnachrichten für Benutzer mit Mailboxen auf einem Exchange Server 2010 / 2013 / 2016 / O365 Changelog 2.3: - Sprachauswahl der GUI (EN oder DE) - Language selection (EN or DE) - Code aufgeräumt - Liste mit allen Mailboxen mit aktiven Out Of Office Changelog 2.2: - Benutzerliste wird geldaen (Nur Mailboxen von 2007 & höher werden berücksichtig) - Fehlerbeseitigung und ProgressBar - Neues Icon - Variablen mit Start-OU für Benutzerlisten (Settings.ini) - Weiterleitung kann konfiguriert werden - Login nach Office 365 implementiert (Settings.ini) - Start der Anwendung optimiert, nur noch .Net4 oder höher - Code aufgeräum / optimiert - Zugehörige Dateien: - GvS.Controls.HtmlTextbox.dll - icon.ico - settings.ini - exit.png - OOO_2.2.exe - aktiv.png - inaktiv.png Changelog 2.1: - Benutzerliste wird geldaen (Nur Mailboxen von 2007 & höher werden berücksichtig) - Fehlerbeseitigung und ProgressBar - Benutzerliste kann auf Knopfdruck neu erzeugt werden um evtl. neue Mailboxen vorzuschlagen - Tool kann in die Infosymbolleiste minimiert werden - Neues Icon - Variablen mit Servernamen und anmeldung (Settings.ini) - Start der Anwendung optimiert - Je nach Anzahl der Benutzer kann der Start dauern! - Code aufgeräum / optimiert - Zugehörige Dateien: - GvS.Controls.HtmlTextbox.dll - icon.ico - settings.ini - exit.png - OOO_2.2.exe #> # Ausführungspfad wichtig für die HTML DLL GvS.controls muss im Pfad vom Script liegen $scriptRoot = [System.AppDomain]::CurrentDomain.BaseDirectory.TrimEnd('\') if ($scriptRoot -eq $PSHOME.TrimEnd('\')) { $scriptRoot = $PSScriptRoot } ######################################################################################################################################### # Systembibliotheken laden [Reflection.Assembly]::LoadFile("$scriptRoot\GvS.Controls.HtmlTextbox.dll") [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") [void][reflection.assembly]::Load("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089") [void][reflection.assembly]::Load("System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089") [void][reflection.assembly]::Load("System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089") [void][reflection.assembly]::Load("System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089") [void][reflection.assembly]::Load("System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a") [void][reflection.assembly]::Load("System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089") [void][reflection.assembly]::Load("System.DirectoryServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a") [void][reflection.assembly]::Load("System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089") [void][reflection.assembly]::Load("System.ServiceProcess, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a") ######################################################################################################################################### #INIfile laden function Get-IniContent ($scriptRoot) { $ini = @{} switch -regex -file $scriptRoot { "^\[(.+)\]" # Section { $section = $matches[1] $ini[$section] = @{} $CommentCount = 0 } "^(;.*)$" # Comment { $value = $matches[1] $CommentCount = $CommentCount + 1 $name = "Comment" + $CommentCount $ini[$section][$name] = $value } "(.+?)\s*=(.*)" # Key { $name,$value = $matches[1..2] $ini[$section][$name] = $value } } return $ini } $globalsettingsfile = "$scriptRoot\settings.ini" $inifile = get-inicontent "$globalsettingsfile" ######################################################################################################################################### #Werte aus der Settings.INI einlesen und weitere globale Variablen # Yes & No und der Haken "Anmledung mit aktuellem benutzer" ist bereits beim start des Programms gesetzt - Wird bei O365 ingoniert # Steht hier Yes kann der Wert im programm nicht geändert werden $LoggedOnUser = $inifile.LogonSettings.LoggedOnUser # Ist der Servername gesetzt muss dieser nicht immer angegeben werden, # ist hier ein Wert vergeben kann dieser im Programm nicht geändert werden $SetServername = $inifile.LogonSettings.SetServername # Wenn Yes müssen beide obrigen werte gesetzt sein da es sonst zum fehler kommt. # Andernfalls wird die Anmeldung ausgeführt sobald das Programm startet $LogOnatStart = $inifile.LogonSettings.LogOnatStart #Anmeldung an Office 365, OU muss leer sein anedere werte werden ignoriert $LogOntoO365 = $inifile.LogonSettings.O365 #Display language - Anzeigesprache konfigurieren $DisplayLang = $inifile.LogonSettings.DisplayLang # Gibt an aus welcher OU die Benutzer eingelesen werden, wenn der Wert "0" ist werden alle Benutzer geladen (OU muss eindeutig sein!) # nicht gültig für Office 365, da muss der wert leer sein $OU = $inifile.LogonSettings.OrganizationalUnit # Globale Variable für die versionsnummer $VersionNumber ="2.3" ######################################################################################################################################### #Ladebalkenfenster für ersten Start anzeigen (Benutzer werden geladen) $Icon = [system.drawing.icon]::ExtractAssociatedIcon("$scriptRoot\icon.ico") $Font = New-Object System.Drawing.Font("Arial",10,[System.Drawing.FontStyle]::Regular) $Fenster0 = New-Object System.Windows.Forms.Form $Fenster0.Size = New-Object System.Drawing.Size(890,710) $Fenster0.Height = 100 $Fenster0.Width = 500 $Fenster0.Text = "Out of Office Tool Version $VersionNumber $MsgLoadUser" $Fenster0.StartPosition = "CenterScreen" $Fenster0.BackColor = "#B2E4FF" $Fenster0.Icon = $Icon $Fenster0.Font = $Font $Fenster0.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::FixedSingle ######################################################################################################################################### # Hauptfensterfenster erstellen und konfigurieren $Fenster1 = New-Object System.Windows.Forms.Form $Fenster1.Size = New-Object System.Drawing.Size(890,710) $Fenster1.MaximumSize = "890,710" $Fenster1.MinimumSize = "890,710" $Fenster1.Text = "Exchange Server / O365 Out of Office Tool Version $VersionNumber © Andres Sichel" $Fenster1.StartPosition = "CenterScreen" $Fenster1.BackColor = "#B2E4FF" $Fenster1.Icon = $Icon $Fenster1.Font = $Font $Fenster1.WindowState = "Normal" $Fenster1.add_SizeChanged({Minimieren}) $Fenster1.KeyPreview = $True #Enter drücken zulassen (nur für Benutzerabfragen) $Fenster1.Add_KeyDown({if ($_.KeyCode -eq "Enter"){Abfrage}}) $Fenster1.Add_KeyDown({if ($_.KeyCode -eq "Escape"){Abmelden}}) # Mit Escape wird Abmelden ausgeführt und das Fenster wird geschlossen ######################################################################################################################################### # Minimieren funktion einbauen #Kontextmenü für Icon erstellen $Kontext = New-Object System.Windows.Forms.ContextMenu $KontextExit = New-Object System.Windows.Forms.MenuItem $KontextInfo = New-Object System.Windows.Forms.MenuItem $KontextExit.Text = "Exit" $KontextExit.Index = 1 $KontextExit.add_Click({$NotifyIcon.Visible = $False,$Fenster1.close()}) $KontextInfo.Text = "Info" $KontextInfo.Index = 2 $KontextInfo.add_Click({ShowInfo}) # NotifyIcon erstellen, erscheint wenn Fenster minimiert worden ist $NotifyIcon = New-Object System.Windows.Forms.NotifyIcon $NotifyIcon.Icon = $Icon $NotifyIcon.Visible = $false $NotifyIcon.add_Click({Iconclick}) $NotifyIcon.Text = "Out of Office Tool $VersionNumber" $NotifyIcon.BalloonTipTitle = "Out of Office Tool $VersionNumber" $NotifyIcon.BalloonTipIcon = "Info" $NotifyIcon.ContextMenu = $Kontext $NotifyIcon.ContextMenu.MenuItems.AddRange($KontextInfo) $NotifyIcon.ContextMenu.MenuItems.AddRange($KontextExit) function ShowInfo { $Fenster1.Hide() $Fenster2 = New-Object System.Windows.Forms.Form $Fenster2.Size = New-Object System.Drawing.Size(300,300) $Fenster2.MaximumSize = "300,300" $Fenster2.MinimumSize = "300,300" $Fenster2.Text = "Out of Office Tool $VersionNumber Info" $Fenster2.StartPosition = "CenterScreen" $Fenster2.BackColor = "#B2E4FF" $Fenster2.Icon = $Icon $Fenster2.Font = $Font $Fenster2.WindowState = "Normal" #Text1 $Text3 = New-Object System.Windows.Forms.Label $Text3.Location = New-Object System.Drawing.Size(20,20) $Text3.Size = New-Object System.Drawing.Size(240,150) $Text3.Text = "Out of Office Tool Erstellt von Andres Sichel blog@asichel.de Version $VersionNumber" $Text3.TextAlign = "MiddleCenter" $Fenster2.Controls.Add($Text3) $FontB = New-Object System.Drawing.Font("Arial",14,[System.Drawing.FontStyle]::Regular) $CloseInfo = New-Object System.Windows.Forms.Button $CloseInfo.Location = New-Object System.Drawing.Size(90,200) $CloseInfo.Size = New-Object System.Drawing.Size(100,30) $CloseInfo.Text = "OK" $CloseInfo.BackColor = "#0064AF" $CloseInfo.font = $FontB $CloseInfo.foreColor = "White" $CloseInfo.Add_Click({$Fenster2.Close()}) $Fenster2.Controls.Add($CloseInfo) $Fenster2.Add_Shown({$Fenster2.Activate()}) [void] $Fenster2.ShowDialog() } function Minimieren { if($Fenster1.WindowState -eq [Windows.Forms.FormWindowState]"Minimized") { $Fenster1.Hide() $NotifyIcon.Visible = $True $NotifyIcon.ShowBalloonTip(5000) } } function IconClick { if($Fenster1.Visible) { $Fenster1.Hide() } else { $Fenster1.Show() $Fenster1.WindowState = [Windows.Forms.FormWindowState]"Normal" } } ######################################################################################################################################### #Globale Objekte erstellen $progressBar1 = New-Object System.Windows.Forms.ProgressBar $TextProgressBar = New-Object system.Windows.Forms.Label $GroupBox1 = New-Object System.Windows.Forms.GroupBox $GroupBox2 = New-Object System.Windows.Forms.GroupBox $GroupBox3 = New-Object System.Windows.Forms.GroupBox $GroupBox4 = New-Object System.Windows.Forms.GroupBox $GroupBox5 = New-Object System.Windows.Forms.GroupBox $GroupBox6 = New-Object System.Windows.Forms.GroupBox $GroupBox7 = New-Object System.Windows.Forms.GroupBox $UserName = New-Object System.Windows.Forms.Combobox $Abfrage = New-Object System.Windows.Forms.Button $ReportGrid = New-Object System.Windows.Forms.Button $TextExtern = New-Object System.Windows.Forms.Label $TextZeitStart = New-Object System.Windows.Forms.Label $TextZeitEnde = New-Object System.Windows.Forms.Label $About1 = New-Object System.Windows.Forms.Label $ServerName = New-Object System.Windows.Forms.Textbox $Login = New-Object System.Windows.Forms.Button $WindowsUser = New-Object System.Windows.Forms.CheckBox $Speichern = New-Object System.Windows.Forms.Button $Abmelden = New-Object System.Windows.Forms.Button $BenutzerLaden = New-Object System.Windows.Forms.Button $HTMLForm1 = New-Object GvS.Controls.HtmlTextbox $HTMLForm2 = New-Object GvS.Controls.HtmlTextbox $RadioDisabled = New-Object System.Windows.Forms.RadioButton $RadioDisabled.Checked = $true $RadioEnabled = New-Object System.Windows.Forms.RadioButton $Extern = New-Object System.Windows.Forms.CheckBox $ExternKontakte = New-Object System.Windows.Forms.RadioButton $ExternAlle = New-Object System.Windows.Forms.RadioButton $Zeit = New-Object System.Windows.Forms.CheckBox $ZeitStart = New-Object System.Windows.Forms.DateTimePicker $DatumStart = New-Object System.Windows.Forms.DateTimePicker $ZeitEnde = New-Object System.Windows.Forms.DateTimePicker $DatumEnde = New-Object System.Windows.Forms.DateTimePicker $Ausgabe1 = New-Object System.Windows.Forms.Label $ExitBild = New-Object System.Windows.Forms.PictureBox $StatusBild = New-Object System.Windows.Forms.PictureBox $ToolTip = New-Object System.Windows.Forms.ToolTip $Weiterleitung = New-Object System.Windows.Forms.CheckBox $WeiterleitungMail = New-Object System.Windows.Forms.ComboBox $WeiterleitungMailKopie = New-Object System.Windows.Forms.CheckBox $TextWeiterleitung = New-Object System.Windows.Forms.Label ######################################################################################################################################### #GUI text / Display language if ($DisplayLang -eq "de") { <# statische texte #> $NotifyIcon.BalloonTipText = "Out of Office Tool wurde minnimiert, Klick zum öffnen" $GroupBox1.Text = "Zusatzoption bei aktiven Out of Office" $GroupBox2.Text = "Verbindungs / Benutzeroptionen" $GroupBox3.Text = "Out of Office Status abfragen / setzen" $GroupBox4.Text = "Informationen" $GroupBox5.Text = "Nachricht für Interne Empfänger" $GroupBox6.Text = "Erweiterte Einstellungen" $GroupBox7.Text = "Report" $TextProgressBar.text="Programmstart wird vorbereitet!" $TextExtern.Text = "Nachricht für Externe Empfänger:" $TextZeitStart.Text = "Startzeit:" $TextZeitEnde.Text = "Endzeit:" $TextWeiterleitung.Text = "Keine Informationen über Mailweiterleitung abgefragt" $TextProgressBar.Text = "Start wird vorbereitet" $Login.Text = "Anmelden" $WindowsUser.Text = "Anmeldung mit aktuellem Benutzer" $Abfrage.Text = "Abfragen" $ReportGrid.Text = "Liste aller Benutzer mit OoO" $Speichern.Text = "Speichern / aktualisieren" $BenutzerLaden.Text = "Benutzerliste erneut laden?" $RadioDisabled.Text = "Out of Office deaktivieren / ist deaktiviert" $RadioEnabled.Text = "Out of Office aktivieren / ist aktiviert" $Extern.Text = "Auch an Absender außerhalb der Organisation senden?" $ExternKontakte.Text = "Antworten nur an Absender in meiner Kontaktliste senden" $ExternAlle.Text = "Antworten an alle externen Absender senden" $Zeit.Text = "Antworten nur in diesem Zeitraum senden:" $Weiterleitung.Text = "E-Mail weiterleitung an anderen Empfänger?" $WeiterleitungMail.Text = "E-Mail zur Weiterleitung" $WeiterleitungMailKopie.Text = "Nachrichten an Empfänger und alternativen Empfänger übermitteln?" <# dynamische Texte in Funktionen #> $MsgLogonFail = "Anmeldung nicht erfolgreich" $MsgLogonSuccess ="Erfolgreich angemeldet, los gehts!` Benutzerliste wird geladen!" $MsgLoadUser = "Benutzer werden geladen" $MsgNoUser = "Es wurde kein Benutzer eingetragen oder der Benutzer existiert nicht." $MsgOOOdisabled = "Abwesenheitsassistent ist deaktiviert" $MsgOOOEnabledAll = "Abwesenheitsassistent ist mit Nachrichten an alle Absender aktiv" $MsgOOOEnabledContact = "Abwesenheitsassistent ist mit Nachrichten an bekannte Absender aktiv" $MsgOOOEnabledInt = "Abwesenheitsassistent ist mit Nachrichten an interne Absender aktiv" $MsgOOOEnabledTmAll = "Abwesenheitsassistent ist Zeitgesteuert mit Nachrichten an alle Absender aktiv" $MsgOOOEnabledTmContact = "Abwesenheitsassistent ist Zeitgesteuert mit Nachrichten an bekannt Absender aktiv" $MsgOOOEnabledTmInt = "Abwesenheitsassistent ist Zeitgesteuert mit Nachrichten an interne Absender aktiv" $MsgFwDisabled = "Keine E-Mail weiterleitung eingerichtet!" $MsgFwEnableCopy = "Mails werden an angebene Adresse in Kopie weitergeleitet" $MsgFwEnableNoCopy = "Mails werden an angebene Adresse weitergeleitet" $MsgOOOSetDisable = "Die Abwesenheitsnotiz fuer den Benutzer $Mailbox1 wurde deaktiviert" $MsgNoText = "Bitte einen Text hinterlegen" $MsgOOOsetAll = "Die Abwesenheistnotiz fuer das Konto $Mailbox1 wurde gespeichert / aktualisiert. Es wird eine Externe Nachricht an ALLE Absender verschickt." $MsgOOOSetContact = "Die Abwesenheistnotiz fuer das Konto $Mailbox1 wurde gespeichert / aktualisiert. Es wird eine Externe Nachricht nur an ALLE Absender aus der Kontaktliste verschickt" $MsgOOOSetInt = "Die Abwesenheistnotiz fuer das Konto $Mailbox1 wurde gespeichert / aktualisiert. Es wird KEINE Externe Nachricht" $MsgOOOSetTmAll = "Die Abwesenheistnotiz fuer das Konto $Mailbox1 wurde gespeichert / aktualisiert. Nachricht an alle externen Absender! Zusätzlich ist eine Zeitspanne konfiguriert! Von $StartZeit bis $EndZeit." $MsgOOOSetTmContact = "Die Abwesenheistnotiz fuer das Konto $Mailbox1 wurde gespeichert / aktualisiert. Nachricht nur an Bekannte Absender! Zusätzlich ist eine Zeitspanne konfiguriert! Von $StartZeit bis $EndZeit." $MsgOOOSetTmInt = "Die Abwesenheistnotiz fuer das Konto $Mailbox1 wurde gespeichert / aktualisiert. Keine Nachricht an Externe Absender. Zusätzlich ist eine Zeitspanne konfiguriert! Von $StartZeit bis $EndZeit." $MsgFwSet = "E-Mail weiterleitung eingerichtet!" $MsgFwSetCopy = "E-Mail Kopie-Weiterleitung eingerichtet!" $MsgFwSetNo = "Keine E-Mail weiterleitung eingerichtet!" $MsgLogoff = "Erfolgreich abgemeldet" $MsUserLoadSuccess = "Benutzerliste wurde erneut geladen" $MsgAutoLogonDisabeld = "Automatische Anmeldung wurde deaktiviert" $MsgAutoLogonFailedText = "Bitte Variablen in Settings.ini setzen" $MsgAutoLogonFailedTitle = "Automatischer Login fehlgeschlagen" $MsgTextGridTitle = "Alle Benutzer mit Out of Office" } if ($DisplayLang -eq "en") { <# statische texte #> $NotifyIcon.BalloonTipText = "Out of Office Tool was minimized, click to open" $GroupBox1.Text = "Automatic replies settings" $GroupBox2.Text = "Connection settings" $GroupBox3.Text = "Out of Office enable / enabled" $GroupBox4.Text = "Additional informations" $GroupBox5.Text = "Message for internal reciepients" $GroupBox6.Text = "Advanced settings" $GroupBox7.Text = "Report" $TextProgressBar.text="Programm starts..." $TextExtern.Text = "Message for external recipients" $TextZeitStart.Text = "Start time" $TextZeitEnde.Text = "End time" $TextWeiterleitung.Text = "No informations about mail forwarding" $TextProgressBar.Text = "Start in progress" $Login.Text = "Log on" $WindowsUser.Text = "Log on with Windows User" $Abfrage.Text = "Query" $ReportGrid.Text = "Report all users with OoO" $Speichern.Text = "Save / update" $BenutzerLaden.Text = "Rerun User query" $RadioDisabled.Text = "Out of Office disabled" $RadioEnabled.Text = "Out of Office enabled" $Extern.Text = "Send message to external reciepients?" $ExternKontakte.Text = "Send replies only to senders in my contacts list" $ExternAlle.Text = "Send replies to all senders" $Zeit.Text = "Send replies only during this time period" $Weiterleitung.Text = "Forward mails to another recipient?" $WeiterleitungMail.Text = "Mail forwarding" $WeiterleitungMailKopie.Text = "Deliver message to both forwarding address and mailbox" <# dynamische Texte in Funktionen #> $MsgLogonFail = "Logon not successfull" $MsgLogonSuccess ="Logon successfull, lets go!` Userlist loaded" $MsgLoadUser = "Userlist loading" $MsgNoUser = "No username set or user does not exist" $MsgOOOdisabled = "Out of Office is disabled" $MsgOOOEnabledAll = "Out of Office for all external senders enabled" $MsgOOOEnabledContact = "Out of Office for all senders in contact list enabled" $MsgOOOEnabledInt = "Out of Office only for internal senders enabled" $MsgOOOEnabledTmAll = "Out of Office for all external senders with time peroid enabled" $MsgOOOEnabledTmContact = "Out of Office for all senders in contact list with time period enabled" $MsgOOOEnabledTmInt = "Out of Office only for internal senders with time period enabled" $MsgFwDisabled = "No mailforwarding settings" $MsgFwEnableCopy = "Copy forwarding to adress enabled" $MsgFwEnableNoCopy = "Forwarding to address enabled" $MsgOOOSetDisable = "Out of Office for user $Mailbox1 disabled" $MsgNoText = "Please insert Out of Office Message" $MsgOOOsetAll = "Out of Office settings for $Mailbox1 saved / refreshed. Replay send to all external senders." $MsgOOOSetContact = "Out of Office settings for $Mailbox1 saved / refreshed. Reply send to all senders in contact list" $MsgOOOSetInt = "Out of Office settings for $Mailbox1 saved / refreshed. Reply send only to internal senders" $MsgOOOSetTmAll = "Out of Office settings for $Mailbox1 saved / refreshed. Reply send to all external senders! Time period configured from $StartZeit till $EndZeit." $MsgOOOSetTmContact = "Out of Office settings for $Mailbox1 saved / refreshed. Reply send to all senders in contact list! Time period configured from $StartZeit till $EndZeit." $MsgOOOSetTmInt = "Out of Office settings for $Mailbox1 saved / refreshed. Reply send only to internal senders. Time period configured from $StartZeit till $EndZeit." $MsgFwSet = "E-Mail forwarding configured" $MsgFwSetCopy = "E-Mail copy forwarding configured" $MsgFwSetNo = "No E-Mail forwarding configured" $MsgLogoff = "Logoff successfull" $MsUserLoadSuccess = "user list refreshed succsessfull" $MsgAutoLogonDisabeld = "Automatic logon disabeld" $MsgAutoLogonFailedText = "Please set variables in settings.ini file" $MsgAutoLogonFailedTitle = "Automatic logon failure" $MsgTextGridTitle = "All Users with Out of Office" } ######################################################################################################################################### #Gruppenboxen: Namen vergeben und Layout erstellen # Gruppenbox für Zusatzoptionen $GroupBox1.Location = New-Object System.Drawing.Size(400,100) $GroupBox1.size = New-Object System.Drawing.Size(465,190) $GroupBox1.Font = $Font $Fenster1.Controls.Add($GroupBox1) # Gruppenbox fuer Server Benutzer und usw $GroupBox2.Location = New-Object System.Drawing.Size(5,50) $GroupBox2.size = New-Object System.Drawing.Size(380,190) $GroupBox2.Font = $Font $Fenster1.Controls.Add($GroupBox2) # Gruppenbox fuer Status Out of Office $GroupBox3.Location = New-Object System.Drawing.Size(400,10) $GroupBox3.size = New-Object System.Drawing.Size(370,80) $GroupBox3.Font = $Font $Fenster1.Controls.Add($GroupBox3) # Gruppenbox Ergebnisausgabe $GroupBox4.Location = New-Object System.Drawing.Size(5,480) $GroupBox4.size = New-Object System.Drawing.Size(380,180) $GroupBox4.Font = $Font $Fenster1.Controls.Add($GroupBox4) # Gruppenbox HTML Felder $GroupBox5.Location = New-Object System.Drawing.Size(400,300) $GroupBox5.size = New-Object System.Drawing.Size(465,360) $GroupBox5.Font = $Font $Fenster1.Controls.Add($GroupBox5) # Gruppenbox Erweiterte Optionen $GroupBox6.Location = New-Object System.Drawing.Size(5,300) $GroupBox6.size = New-Object System.Drawing.Size(380,170) $GroupBox6.Font = $Font $Fenster1.Controls.Add($GroupBox6) #Gruppenbox für Report $GroupBox7.Location = New-Object System.Drawing.Size(5,245) $GroupBox7.size = New-Object System.Drawing.Size(380,50) $GroupBox7.Font = $Font $Fenster1.Controls.Add($GroupBox7) ######################################################################################################################################### #Form für Ladebalken erstellen $progressBar1 = New-Object System.Windows.Forms.ProgressBar $progressBar1.Name = 'progressBar1' $progressBar1.Value = 0 $progressBar1.Style="Continuous" $System_Drawing_Size = New-Object System.Drawing.Size $System_Drawing_Size.Width = 500 - 40 $System_Drawing_Size.Height = 20 $progressBar1.Size = $System_Drawing_Size $progressBar1.Left = 5 $progressBar1.Top = 40 $Fenster0.Controls.Add($progressBar1) $Fenster0.Show()| out-null $Fenster0.Refresh() ######################################################################################################################################### # Funktionen erstellen function Anmelden { if ($LogOntoO365 -eq "yes") { #Anmeldung an Office 365 iniitieren $Fenster1.Cursor = [System.Windows.Forms.Cursors]::WaitCursor #Am Exchange Server anmelden #Zertifikatsprüfungen abschalten $SkipCertificate = New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck -Verbose #Servernamen auslesen $Server = "outlook.office365.com" $ServerName.Text = "outlook.office365.com" #Anmeldedaten erfragen $cred = Get-Credential #PS-Session starten --> Bei connection URI den korrekten Exchange 2010 oder 2013 Servernamen eingeben, vorzugsweise CAS-Server $Session = New-PSSession ` -ConfigurationName Microsoft.Exchange ` -ConnectionUri https://$Server/PowerShell-liveid/ ` -Authentication basic ` -SessionOption $SkipCertificate ` -credential $cred ` -AllowRedirection ` -Name Exchange #Importieren der erzeugten Session in die aktuelle Session, lokal gleichlautende Befehle werden ersetzen Import-PSSession -Session $Session -AllowClobber -Verbose $Fenster1.Cursor = [System.Windows.Forms.Cursors]::Arrow if (!$Session.State -eq "open") { $Ausgabe1.text = $MsgLogonFail } else { $Ausgabe1.text = $MsgLogonSuccess $Fenster0.Show() if ($OU -notlike $null) { $UserArray = Get-User -OrganizationalUnit $OU -RecipientTypeDetails UserMailbox -SortBy Name -ResultSize Unlimited } else { $UserArray = Get-User -RecipientTypeDetails UserMailbox -SortBy Name -ResultSize Unlimited } $i = 0 foreach($user in $UserArray) { $i++ [int]$pct = ($i/$UserArray.count)*100 $progressbar1.Value = $pct $TextProgressBar.text="$MsgLoadUser : $($user.name)" $Fenster0.Refresh() $UserName.items.add($user.Name) $WeiterleitungMail.items.add($user.Name) } $BenutzerLaden.Enabled = $true } $Fenster0.Hide() $UserName.Enabled = $true $RadioDisabled.Enabled = $true $RadioEnabled.Enabled = $true $Weiterleitung.Enabled = $true $ReportGrid.Enabled = $true } else { if (!$WindowsUser.Checked) #Wenn anmeldung nicht automatsich erfolgt { $Fenster1.Cursor = [System.Windows.Forms.Cursors]::WaitCursor #Am Exchange Server anmelden #Zertifikatsprüfungen abschalten $SkipCertificate = New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck -Verbose #Servernamen auslesen $Server = $ServerName.Text; #Anmeldedaten erfragen $cred = Get-Credential #PS-Session starten --> Bei connection URI den korrekten Exchange 2010 oder 2013 Servernamen eingeben, vorzugsweise CAS-Server $Session = New-PSSession ` -ConfigurationName Microsoft.Exchange ` -ConnectionUri http://$Server/PowerShell/ ` -Authentication Kerberos ` -SessionOption $SkipCertificate ` -credential $cred ` -Name Exchange #Importieren der erzeugten Session in die aktuelle Session, lokal gleichlautende Befehle werden ersetzen Import-PSSession -Session $Session -AllowClobber -Verbose $Fenster1.Cursor = [System.Windows.Forms.Cursors]::Arrow if (!$Session.State -eq "open") { $Ausgabe1.text = $MsgLogonFail } else { $Ausgabe1.text =$MsgLogonSuccess $Fenster0.Show() if ($OU -notlike $null) { $UserArray = Get-User -OrganizationalUnit $OU -RecipientTypeDetails UserMailbox -SortBy Name -ResultSize Unlimited } else { $UserArray = Get-User -RecipientTypeDetails UserMailbox -SortBy Name -ResultSize Unlimited } $i = 0 foreach($user in $UserArray) { $i++ [int]$pct = ($i/$UserArray.count)*100 $progressbar1.Value = $pct $TextProgressBar.text="$MsgLoadUser : $($user.name)" $Fenster0.Refresh() $UserName.items.add($user.Name) $WeiterleitungMail.items.add($user.Name) } $BenutzerLaden.Enabled = $true } $Fenster0.Hide() $UserName.Enabled = $true $RadioDisabled.Enabled = $true $RadioEnabled.Enabled = $true $Weiterleitung.Enabled = $true $ReportGrid.Enabled = $true } else { $Fenster1.Cursor = [System.Windows.Forms.Cursors]::WaitCursor #Am Exchange Server anmelden #Zertifikatsprüfungen abschalten $SkipCertificate = New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck -Verbose #Servernamen auslesen $Server = $ServerName.Text; #Anmeldedaten erfragen #PS-Session starten --> Bei connection URI den korrekten Exchange 2010 oder 2013 Servernamen eingeben, vorzugsweise CAS-Server $Session = New-PSSession ` -ConfigurationName Microsoft.Exchange ` -ConnectionUri http://$Server/PowerShell/ ` -Authentication Kerberos ` -SessionOption $SkipCertificate ` -Name Exchange #Importieren der erzeugten Session in die aktuelle Session, lokal gleichlautende Befehle werden ersetzen Import-PSSession -Session $Session -AllowClobber -Verbose $Fenster1.Cursor = [System.Windows.Forms.Cursors]::Arrow if (!$Session.State -eq "open") { $Ausgabe1.text = $MsgLogonFail } else { $Ausgabe1.text = $MsgLogonSuccess $Fenster0.Show() if ($OU -notlike $null) { $UserArray = Get-User -OrganizationalUnit $OU -RecipientTypeDetails UserMailbox -SortBy Name -ResultSize Unlimited } else { $UserArray = Get-User -RecipientTypeDetails UserMailbox -SortBy Name -ResultSize Unlimited } $i = 0 foreach($user in $UserArray) { $i++ [int]$pct = ($i/$UserArray.count)*100 $progressbar1.Value = $pct $TextProgressBar.text="$MsgLoadUser : $($user.name)" $Fenster0.Refresh() $UserName.items.add($user.Name) $WeiterleitungMail.items.add($user.Name) } $BenutzerLaden.Enabled = $true } $Fenster0.Hide() $UserName.Enabled = $true $RadioDisabled.Enabled = $true $RadioEnabled.Enabled = $true $Weiterleitung.Enabled = $true $ReportGrid.Enabled = $true } } }#Beende Funktion Anmelden function Abfrage { #Felder leeren $HTMLForm1.Text = $null $HTMLForm2.Text = $null $WeiterleitungMail.Text = $null $Ausgabe1.Text = $null $Mailbox = $username.text if (($Username.text.Length -eq 0) -or (!(Get-Recipient $Username.text -ErrorAction SilentlyContinue))) { $Ausgabe1.text = $MsgNoUser } else { $Info = Get-MailboxAutoReplyConfiguration -Identity $Mailbox | select AutoReplyState,StartTime,Endtime,ExternalAudience,ExternalMessage,InternalMessage $info2 = Get-Mailbox $Mailbox | select DeliverToMailboxAndForward,ForwardingAddress,ForwardingSmtpAddress #$Ausgabe1.text = $Info | Out-String <# Hier werden nun die verschieden Stati abgefrgat, Buttons und Boxen aktiviert / deaktiviert und die Entsprechenden Daten vom Postfach hineingeschrieben #> if (($Info.AutoReplyState -match "Disabled") -and ($Info.ExternalAudience -match "All") ) { $Radiodisabled.Checked = $true $RadioDisabled.Enabled = $true $RadioEnabled.Enabled = $true $Extern.Checked = $true $Extern.Enabled = $false $ExternKontakte.Enabled = $false $ExternAlle.Enabled = $false $ExternAlle.Checked = $true $Zeit.Enabled = $false $Zeit.Checked = $false $ZeitStart.Enabled = $false $DatumStart.Enabled = $false $ZeitEnde.Enabled = $false $DatumEnde.Enabled = $false $HTMLForm1.Text = $Info.InternalMessage $HTMLForm2.Text = $Info.ExternalMessage $Ausgabe1.Text = $MsgOOOdisabled $StatusBild.ImageLocation = "$scriptRoot\inaktiv.png" $HTMLForm1.Enabled = $false $HTMLForm2.Enabled = $false } if (($Info.AutoReplyState -match "Disabled") -and ($Info.ExternalAudience -match "Known")) { $Radiodisabled.Checked = $true $RadioDisabled.Enabled = $true $RadioEnabled.Enabled = $true $Extern.Checked = $true $Extern.Enabled = $false $ExternKontakte.Enabled = $false $ExternAlle.Enabled = $false $ExternKontakte.Checked = $true $Zeit.Enabled = $false $Zeit.Checked = $false $ZeitStart.Enabled = $false $DatumStart.Enabled = $false $ZeitEnde.Enabled = $false $DatumEnde.Enabled = $false $HTMLForm1.Text = $Info.InternalMessage $HTMLForm2.Text = $Info.ExternalMessage $Ausgabe1.Text = $MsgOOOdisabled $StatusBild.ImageLocation = "$scriptRoot\inaktiv.png" $HTMLForm1.Enabled = $false $HTMLForm2.Enabled = $false } if (($Info.AutoReplyState -match "Disabled") -and ($Info.ExternalAudience -match "None")) { $Radiodisabled.Checked = $true $RadioDisabled.Enabled = $true $RadioEnabled.Enabled = $true $Extern.Checked = $false $Extern.Enabled = $false $ExternKontakte.Enabled = $false $ExternAlle.Enabled = $false $ExternKontakte.Checked = $false $Zeit.Enabled = $false $Zeit.Checked = $false $ZeitStart.Enabled = $false $DatumStart.Enabled = $false $ZeitEnde.Enabled = $false $DatumEnde.Enabled = $false $HTMLForm1.Text = $Info.InternalMessage $HTMLForm2.Text = $Info.ExternalMessage $Ausgabe1.Text = $MsgOOOdisabled $StatusBild.ImageLocation = "$scriptRoot\inaktiv.png" $HTMLForm1.Enabled = $false $HTMLForm2.Enabled = $false } if (($Info.AutoReplyState -match "Enabled") -and ($Info.ExternalAudience -match "All") ) { $RadioEnabled.Checked = $true $RadioEnabled.Enabled = $true $Radiodisabled.Enabled = $true $HTMLForm1.Text = $Info.InternalMessage $HTMLForm2.Text = $Info.ExternalMessage $Extern.Checked = $true $Extern.Enabled = $true $ExternAlle.Enabled = $true $ExternAlle.Checked = $true $ExternKontakte.Enabled =$true $Zeit.Checked = $false $Zeit.Enabled = $true $Ausgabe1.Text = $MsgOOOEnabledAll $StatusBild.ImageLocation = "$scriptRoot\aktiv.png" $HTMLForm1.Enabled = $true $HTMLForm2.Enabled = $true } if (($Info.AutoReplyState -match "Enabled") -and ($Info.ExternalAudience -match "Known")) { $RadioEnabled.Checked = $true $RadioEnabled.Enabled = $true $Radiodisabled.Enabled = $true $HTMLForm1.Text = $Info.InternalMessage $HTMLForm2.Text = $Info.ExternalMessage $Extern.Checked = $true $Extern.Enabled = $true $ExternAlle.Enabled = $true $ExternKontakte.Enabled =$true $ExternKontakte.Checked = $true $Zeit.Checked = $false $Zeit.Enabled = $true $Ausgabe1.Text = $MsgOOOEnabledContact $StatusBild.ImageLocation = "$scriptRoot\aktiv.png" $HTMLForm1.Enabled = $true $HTMLForm2.Enabled = $true } if (($Info.AutoReplyState -match "Enabled") -and ($Info.ExternalAudience -match "None")) { $RadioEnabled.Checked = $true $RadioEnabled.Enabled = $true $Radiodisabled.Enabled = $true $HTMLForm1.Text = $Info.InternalMessage $HTMLForm2.Text = $Info.ExternalMessage $Extern.Checked = $false $Extern.Enabled = $true $ExternAlle.Checked = $false $ExternKontakte.Checked = $false $Zeit.Checked = $false $Zeit.Enabled = $true $Ausgabe1.Text = $MsgOOOEnabledInt $StatusBild.ImageLocation = "$scriptRoot\aktiv.png" $HTMLForm1.Enabled = $true $HTMLForm2.Enabled = $true } if (($info.AutoReplyState -match "Scheduled") -and ($Info.ExternalAudience -match "All")) { $RadioEnabled.Checked = $true $RadioEnabled.Enabled = $true $Radiodisabled.Enabled = $true $HTMLForm1.Text = $Info.InternalMessage $HTMLForm2.Text = $Info.ExternalMessage $Extern.Checked = $true $Extern.Enabled = $true $ExternAlle.Enabled = $true $ExternAlle.Checked = $true $ExternKontakte.Enabled =$true $Zeit.Checked = $true $Zeit.Enabled = $true $ZeitStart.Text = [System.Timespan]::Parse($Info.StartTime.ToString("HH:mm")) $ZeitEnde.Text = [System.Timespan]::Parse($Info.EndTime.ToString("HH:mm")) $DatumStart.Value = $Info.StartTime $DatumEnde.Value = $Info.EndTime $Ausgabe1.Text = $MsgOOOEnabledTmAll $StatusBild.ImageLocation = "$scriptRoot\aktiv.png" $HTMLForm1.Enabled = $true $HTMLForm2.Enabled = $true } if (($Info.AutoReplyState -match "Scheduled") -and ($Info.ExternalAudience -match "Known")) { $RadioEnabled.Checked = $true $RadioEnabled.Enabled = $true $Radiodisabled.Enabled = $true $HTMLForm1.Text = $Info.InternalMessage $HTMLForm2.Text = $Info.ExternalMessage $Extern.Checked = $true $Extern.Enabled = $true $ExternAlle.Enabled = $true $ExternKontakte.Enabled =$true $ExternKontakte.Checked = $true $Zeit.Checked = $true $Zeit.Enabled = $true $ZeitStart.Text = [System.Timespan]::Parse($Info.StartTime.ToString("HH:mm")) $ZeitEnde.Text = [System.Timespan]::Parse($Info.EndTime.ToString("HH:mm")) $DatumStart.Value = $Info.StartTime $DatumEnde.Value = $Info.EndTime $Ausgabe1.Text = $MsgOOOEnabledTmContact $StatusBild.ImageLocation = "$scriptRoot\aktiv.png" $HTMLForm1.Enabled = $true $HTMLForm2.Enabled = $true } if (($Info.AutoReplyState -match "Scheduled") -and ($Info.ExternalAudience -match "None")) { $RadioEnabled.Checked = $true $RadioEnabled.Enabled = $true $Radiodisabled.Enabled = $true $HTMLForm1.Text = $Info.InternalMessage $HTMLForm2.Text = $Info.ExternalMessage $Extern.Checked = $false $Extern.Enabled = $true $ExternAlle.Checked = $false $ExternKontakte.Checked = $false $Zeit.Checked = $True $Zeit.Enabled = $true $ZeitStart.Text = [System.Timespan]::Parse($Info.StartTime.ToString("HH:mm")) $ZeitEnde.Text = [System.Timespan]::Parse($Info.EndTime.ToString("HH:mm")) $DatumStart.Value = $Info.StartTime $DatumEnde.Value = $Info.EndTime $Ausgabe1.Text = $MsgOOOEnabledTmInt $StatusBild.ImageLocation = "$scriptRoot\aktiv.png" $HTMLForm1.Enabled = $true $HTMLForm2.Enabled = $true } if ($info2.ForwardingAddress -eq $null) { $WeiterleitungMail.Enabled = $false $Weiterleitung.Checked = $false $Weiterleitung.Enabled = $true $WeiterleitungMailKopie.Enabled = $false $WeiterleitungMailKopie.Checked = $false $TextWeiterleitung.Text = $MsgFwDisabled } } if ( ($info2.ForwardingAddress -ne $null) -and ($info2.DeliverToMailboxAndForward -eq $true)) { $info3 = get-mailbox $info2.ForwardingAddress $Weiterleitung.Enabled = $true $Weiterleitung.Checked = $true $WeiterleitungMail.Enabled = $true $WeiterleitungMail.Text = $info3 $WeiterleitungMailKopie.Checked = $true $TextWeiterleitung.Text = $MsgFwEnableNoCopy } if ( ($info2.ForwardingAddress -ne $null) -and ($info2.DeliverToMailboxAndForward -eq $false)) { $info3 = get-mailbox $info2.ForwardingAddress $Weiterleitung.Enabled = $true $Weiterleitung.Checked = $true $WeiterleitungMail.Enabled = $true $WeiterleitungMail.Text = $info3 $WeiterleitungMailKopie.Checked = $false $TextWeiterleitung.Text = $MsgFwEnableNoCopy } } # Beendet die Funktion Abfrage function Speichern { $Mailbox1 = $username.text if (($Username.text.Length -eq 0) -or (!(Get-Recipient $Username.text -ErrorAction SilentlyContinue))) { $Ausgabe1.text = $MsgNoUser } else { <# Hir werden jetzt alle Variationen abgerfgat die eingetragen werden können, mit Zeit, ohne Externe Absender usw. Jeweils auch die Abfrage ob Text hinterlegt worden ist #> if ($RadioDisabled.Checked) { Set-MailboxAutoReplyConfiguration $Mailbox1 -AutoReplyState disabled $Ausgabe1.Text = $MsgOOOSetDisable } if (($RadioEnabled.Checked) -and ($Extern.checked) -and ($ExternAlle.Checked) -and (!$ExternKontakte.Checked) -and (!$Zeit.Checked)) #Aktiv, alle externen { if (($HTMLForm1.Text.Length -eq 0) -or ($HTMLForm2.Text.Length -eq 0)) { $Ausgabe1.Text = $MsgNoText } else { $Intern = $HTMLForm1.Text $Extern = $HTMLForm2.Text Set-MailboxAutoReplyConfiguration $Mailbox1 -AutoReplyState enabled -InternalMessage "$intern" -ExternalMessage "$extern" -ExternalAudience All $Ausgabe1.text = $MsgOOOsetAll } } if (($RadioEnabled.Checked) -and ($Extern.checked) -and (!$ExternAlle.Checked) -and ($ExternKontakte.Checked) -and (!$Zeit.Checked)) #aktiv, extern nur kontakte { if (($HTMLForm1.Text.Length -eq 0) -or ($HTMLForm2.Text.Length -eq 0)) { $Ausgabe1.Text = $MsgNoText } else { $Intern = $HTMLForm1.Text $Extern = $HTMLForm2.Text Set-MailboxAutoReplyConfiguration $Mailbox1 -AutoReplyState enabled -InternalMessage "$intern" -ExternalMessage "$extern" -ExternalAudience Known $Ausgabe1.text = $MsgOOOSetContact } } if (($RadioEnabled.Checked) -and (!$Extern.checked) -and (!$ExternAlle.Checked) -and (!$ExternKontakte.Checked) -and (!$Zeit.Checked)) #aktiv, keine Externen nachrichten keine Zeitspanne { if (($HTMLForm1.Text.Length -eq 0) -or ($HTMLForm2.Text.Length -eq 0)) { $Ausgabe1.Text = $MsgSet } else { $Intern = $HTMLForm1.Text $Extern = $HTMLForm2.Text Set-MailboxAutoReplyConfiguration $Mailbox1 -AutoReplyState enabled -InternalMessage "$intern" -ExternalMessage "$extern" -ExternalAudience none $Ausgabe1.text = $MsgOOOSetInt } } if (($RadioEnabled.Checked) -and ($Extern.checked) -and ($ExternAlle.Checked) -and (!$ExternKontakte.Checked) -and ($Zeit.Checked)) #aktiv, extern alle und Zeitspanne { if (($HTMLForm1.Text.Length -eq 0) -or ($HTMLForm2.Text.Length -eq 0)) { $Ausgabe1.Text = $MsgNoText } else { $Gebiet = New-Object system.globalization.cultureinfo 'en-us' $Datum_Start = [System.DateTime]::Parse($DatumStart.Value.ToString("MM.dd.yyyy"),$Gebiet) $Zeit_Start = [System.Timespan]::Parse($ZeitStart.Value.ToString("HH:mm")) $StartZeit = $Datum_Start.Add($Zeit_Start) $StartZeit = Get-Date $StartZeit -format 'MM.dd.yyyy HH:mm' $Datum_Ende = [System.DateTime]::Parse($DatumEnde.Value.ToString("MM.dd.yyyy"),$Gebiet) $Zeit_Ende = [System.Timespan]::Parse($ZeitEnde.Value.ToString("HH:mm")) $EndZeit = $Datum_Ende.Add($Zeit_Ende) $EndZeit = Get-Date $EndZeit -format 'MM.dd.yyyy HH:mm' $Intern = $HTMLForm1.Text $Extern = $HTMLForm2.Text Set-MailboxAutoReplyConfiguration $Mailbox1 -AutoReplyState scheduled -InternalMessage "$intern" -ExternalMessage "$extern" -StartTime $StartZeit -EndTime $EndZeit -ExternalAudience all $Ausgabe1.text = $MsgOOOSetTmAll } } if (($RadioEnabled.Checked) -and ($Extern.checked) -and (!$ExternAlle.Checked) -and ($ExternKontakte.Checked) -and ($Zeit.Checked)) #aktiv, extern nur kontakte und Zeitspanne { if (($HTMLForm1.Text.Length -eq 0) -or ($HTMLForm2.Text.Length -eq 0)) { $Ausgabe1.Text = $MsgNoText } else { $Gebiet = New-Object system.globalization.cultureinfo 'en-us' $Datum_Start = [System.DateTime]::Parse($DatumStart.Value.ToString("MM.dd.yyyy"),$Gebiet) $Zeit_Start = [System.Timespan]::Parse($ZeitStart.Value.ToString("HH:mm")) $StartZeit = $Datum_Start.Add($Zeit_Start) $StartZeit = Get-Date $StartZeit -format 'MM.dd.yyyy HH:mm' $Datum_Ende = [System.DateTime]::Parse($DatumEnde.Value.ToString("MM.dd.yyyy"),$Gebiet) $Zeit_Ende = [System.Timespan]::Parse($ZeitEnde.Value.ToString("HH:mm")) $EndZeit = $Datum_Ende.Add($Zeit_Ende) $EndZeit = Get-Date $EndZeit -format 'MM.dd.yyyy HH:mm' $Intern = $HTMLForm1.Text $Extern = $HTMLForm2.Text Set-MailboxAutoReplyConfiguration $Mailbox1 -AutoReplyState scheduled -InternalMessage "$intern" -ExternalMessage "$extern" -StartTime $StartZeit -EndTime $EndZeit -ExternalAudience Known $Ausgabe1.text = $MsgOOOSetTmContact } } if (($RadioEnabled.Checked) -and (!$Extern.checked) -and (!$ExternAlle.Checked) -and (!$ExternKontakte.Checked) -and ($Zeit.Checked)) #aktiv, keine Externen und Zeitspanne { if (($HTMLForm1.Text.Length -eq 0) -or ($HTMLForm2.Text.Length -eq 0)) { $Ausgabe1.Text = $MsgNoText } else { $Gebiet = New-Object system.globalization.cultureinfo 'en-us' $Datum_Start = [System.DateTime]::Parse($DatumStart.Value.ToString("MM.dd.yyyy"),$Gebiet) $Zeit_Start = [System.Timespan]::Parse($ZeitStart.Value.ToString("HH:mm")) $StartZeit = $Datum_Start.Add($Zeit_Start) $StartZeit = Get-Date $StartZeit -format 'MM.dd.yyyy HH:mm' $Datum_Ende = [System.DateTime]::Parse($DatumEnde.Value.ToString("MM.dd.yyyy"),$Gebiet) $Zeit_Ende = [System.Timespan]::Parse($ZeitEnde.Value.ToString("HH:mm")) $EndZeit = $Datum_Ende.Add($Zeit_Ende) $EndZeit = Get-Date $EndZeit -format 'MM.dd.yyyy HH:mm' $Intern = $HTMLForm1.Text $Extern = $HTMLForm2.Text Set-MailboxAutoReplyConfiguration $Mailbox1 -AutoReplyState scheduled -InternalMessage "$intern" -ExternalMessage "$extern" -StartTime $StartZeit -EndTime $EndZeit -ExternalAudience none $Ausgabe1.text = $MsgOOOSetTmInt } } if (($Weiterleitung.Checked) -and (!$WeiterleitungMailKopie.Checked)) { $ForwardAddress = $WeiterleitungMail.Text Set-Mailbox $Mailbox1 -ForwardingAddress $ForwardAddress -DeliverToMailboxAndForward $false $TextWeiterleitung.Text = $MsgFwSet } if (($Weiterleitung.Checked) -and ($WeiterleitungMailKopie.Checked)) { $ForwardAddress = $WeiterleitungMail.Text Set-Mailbox $Mailbox1 -ForwardingAddress $ForwardAddress -DeliverToMailboxAndForward $true $TextWeiterleitung.Text = $MsgFwSetCopy } if (!$Weiterleitung.Checked) { Set-Mailbox $Mailbox1 -ForwardingAddress $null $TextWeiterleitung.Text = $MsgFwSetNo } } } # Beendet die Funktion Speichern function Abmelden { Remove-PSSession -Name Exchange $Ausgabe1.text = $MsgLogoff $Fenster1.Close() } # Beendet die Funktion Abmelden <# Aktionen bei veränderten Radio Buttons für aktiviertes /deaktiviertes Out of Office Jenachdem welcher Status abgerfragt wird, bzw welcher Status gesetzt wird müssen die Buttons ein und ausgeschaltet werden #> function Button_Status { if ($RadioEnabled.Checked) { $RadioDisabled.Enabled = $true $RadioEnabled.Enabled = $true $Extern.Enabled = $true $ExternKontakte.Enabled = $false $ExternAlle.Enabled = $False $Zeit.Enabled = $true $ZeitStart.Enabled = $false $ZeitEnde.Enabled = $false $DatumStart.Enabled = $false $DatumEnde.Enabled = $false $HTMLForm1.Enabled = $true $HTMLForm2.Enabled = $true } else { $RadioDisabled.Enabled = $true $RadioEnabled.Enabled = $true $Extern.Enabled = $false $Extern.Checked = $false $ExternKontakte.Enabled = $false $ExternAlle.Enabled = $False $Zeit.Enabled = $false $Zeit.Checked = $false $ZeitStart.Enabled = $false $ZeitEnde.Enabled = $false $DatumStart.Enabled = $false $DatumEnde.Enabled = $false $HTMLForm1.Enabled = $false $HTMLForm2.Enabled = $false } if ($Extern.Checked) { $ExternKontakte.Enabled = $true $ExternAlle.Enabled = $true } else { $ExternKontakte.Enabled = $false $ExternKontakte.Checked = $false $ExternAlle.Enabled = $false $ExternAlle.Checked = $false } if ($Zeit.Checked) { $ZeitStart.Enabled = $true $ZeitEnde.Enabled = $true $DatumStart.Enabled = $true $DatumEnde.Enabled = $true } if ($Weiterleitung.Checked) { $WeiterleitungMail.Enabled = $true $WeiterleitungMailKopie.Enabled = $true } else { $WeiterleitungMail.Enabled = $false $WeiterleitungMailKopie.Enabled = $false } } if ($RadioDisabled.Checked) {Button_Status} $handler_UserArray = { $Fenster1.Cursor = [System.Windows.Forms.Cursors]::WaitCursor $Fenster0.Show() | Out-Null $UserName.Items.Clear(); if ($OU -notlike $null) { $UserArray = Get-User -OrganizationalUnit $OU -RecipientTypeDetails UserMailbox -SortBy Name -ResultSize Unlimited } else { $UserArray = Get-User -RecipientTypeDetails UserMailbox -SortBy Name -ResultSize Unlimited } $i = 0 foreach($user in $UserArray) { $i++ [int]$pct = ($i/$UserArray.count)*100 $progressbar1.Value = $pct $TextProgressBar.text="$MsgLoadUser $($user.name)" $Fenster0.Refresh() $UserName.items.add($user.Name) $WeiterleitungMail.items.add($user.Name) } $Fenster0.Close() $Fenster1.Cursor = [System.Windows.Forms.Cursors]::Arrow $Ausgabe1.Text = $MsUserLoadSuccess } $handler_Report = { $Fenster1.Cursor = [System.Windows.Forms.Cursors]::WaitCursor if ($OU -notlike $null) { $QueryMBXReport = (Get-Mailbox -OrganizationalUnit $OU -ResultSize Unlimited -RecipientTypeDetails UserMailbox).Name $QueryMBXReport | Get-MailboxAutoReplyConfiguration | ? {($_.AutoReplyState -eq "Enabled") -or ($_.AutoReplyState -eq "Scheduled") } |select Identity,AutoReplyState,ExternalAudience,StartTime,EndTime | Out-GridView -Title $MsgTextGridTitle } else { $QueryMBXReport = (Get-Mailbox -ResultSize Unlimited -RecipientTypeDetails UserMailbox).Name $QueryMBXReport | Get-MailboxAutoReplyConfiguration | ? {($_.AutoReplyState -eq "Enabled") -or ($_.AutoReplyState -eq "Scheduled") } |select Identity,AutoReplyState,ExternalAudience,StartTime,EndTime | Out-GridView -Title $MsgTextGridTitle } $Fenster1.Cursor = [System.Windows.Forms.Cursors]::Arrow $Ausgabe1.Text = $MsUserLoadSuccess } ######################################################################################################################################### # Sämtliche Texte hinzufügen $TextExtern.Location = New-Object System.Drawing.Size(10,185) $TextExtern.Size = New-Object System.Drawing.Size(450,20) $GroupBox5.Controls.Add($TextExtern) # Text fuer die Start und Endzeit einbauen $TextZeitStart.Location = New-Object System.Drawing.Size(25,133) $TextZeitStart.Size = New-Object System.Drawing.Size(70,20) $GroupBox1.Controls.Add($TextZeitStart) $TextZeitEnde.Location = New-Object System.Drawing.Size(25,163) $TextZeitEnde.Size = New-Object System.Drawing.Size(60,20) $GroupBox1.Controls.Add($TextZeitEnde) #Text für Ergebnisausgabe E-Mail weiterleitung $TextWeiterleitung.Location = New-Object System.Drawing.Size(10,130) $TextWeiterleitung.Size = New-Object System.Drawing.Size(350,35) $GroupBox6.Controls.Add($TextWeiterleitung) # Info-Text Anzeigen lassen $About1.Location = New-Object System.Drawing.Size(5,10) $About1.Size =New-Object System.Drawing.Size(400,35) $About1.Text = "Exchange Server / O365 Out of Office Tool Version $VersionNumber © Andres Sichel // asichel.de // blog@asichel.de" $Fenster1.Controls.Add($About1) $TextProgressBar.Left=5 $TextProgressBar.Top= 10 $TextProgressBar.Width= 500 - 20 $TextProgressBar.Height=15 $Fenster0.controls.add($TextProgressBar) ######################################################################################################################################### # Verbindungsoptionen # Eingabefeld für Servernamen bauen If ($SetServername -gt 0) { $SetServer = $SetServername $ServerName.ReadOnly = $true } else { $SetServer = "'Servername im FQDN'" } $ServerName.Location = New-Object System.Drawing.Size(10,40) $ServerName.Size = New-Object System.Drawing.Size(200,20) $ServerName.Text = "$SetServer" $ServerName.TabIndex = 1 $GroupBox2.Controls.Add($ServerName) # Anmeldebutton bauen $Login.Location = New-Object System.Drawing.Size(250,40) $Login.Size = New-Object System.Drawing.Size(80,22) $Login.TabIndex = 3 $Login.BackColor = "white" $Login.Add_Click({Anmelden}) $GroupBox2.Controls.Add($Login) # Abfrage aktuelle Benutzer If ($LoggedOnUser -eq "Yes") { $WindowsUser.Checked = $true $WindowsUser.Enabled = $false } else { $WindowsUser.Checked = $false } $WindowsUser.Location = New-Object System.Drawing.Size(10,70) $WindowsUser.Size = New-Object System.Drawing.Size(250,20) $WindowsUser.TabIndex = 2 $GroupBox2.Controls.Add($WindowsUser) # Eingabefeld für Usernamen bauen $UserName.Location = New-Object System.Drawing.Size(10,100) $UserName.Size = New-Object System.Drawing.Size(200,20) $UserName.AutoCompleteMode = 3 $UserName.AutoCompleteSource = 256 $UserName.DataBindings.DefaultDataSourceUpdateMode = 0 $UserName.FormattingEnabled = $True $UserName.Enabled = $false $UserName.TabIndex = 4 $GroupBox2.Controls.Add($UserName) # Abfragebutton bauen $Abfrage.Location = New-Object System.Drawing.Size(250,100) $Abfrage.Size = New-Object System.Drawing.Size(80,22) $Abfrage.TabIndex = 5 $Abfrage.BackColor = "white" $Abfrage.Add_Click({Abfrage}) $GroupBox2.Controls.Add($Abfrage) # Speicherbutton bauen $Speichern.Location = New-Object System.Drawing.Size(25,140) $Speichern.Size = New-Object System.Drawing.Size(170,22) $Speichern.TabIndex = 20 $Speichern.BackColor = "white" $Speichern.Add_Click({Speichern}) $GroupBox2.Controls.Add($Speichern) # Benutzer neu laden bauen $BenutzerLaden.Location = New-Object System.Drawing.Size(230,140) $BenutzerLaden.Size = New-Object System.Drawing.Size(120,40) $BenutzerLaden.TabIndex = 7 $BenutzerLaden.Enabled = $false $BenutzerLaden.BackColor = "white" $BenutzerLaden.Add_Click($handler_UserArray) $GroupBox2.Controls.Add($BenutzerLaden) #Reportbutton bauen $ReportGrid.Location = New-Object System.Drawing.Size(5,20) $ReportGrid.Size = New-Object System.Drawing.Size(200,20) $ReportGrid.TabIndex = 7 $ReportGrid.Enabled = $false $ReportGrid.BackColor = "white" $ReportGrid.Add_Click($handler_Report) $GroupBox7.Controls.Add($ReportGrid) # Abmeldebutton bauen $ToolTip.SetToolTip($ExitBild, "Abmelden & Exit") $ExitBild.Location = New-Object System.Drawing.Size(790,22) $ExitBild.ImageLocation = "$scriptRoot\exit.png" $ExitBild.SizeMode = "AutoSize" $ExitBild.Text = "Exit" $ExitBild.TabIndex = 21 $ExitBild.add_mouseclick{Abmelden} $Fenster1.Controls.Add($ExitBild) ######################################################################################################################################### #HTML Felder # Interne Nachricht $HTMLForm1.Location = New-Object System.Drawing.Size(10,25) $HTMLForm1.Size = New-Object System.Drawing.Size(450,150) $HTMLForm1.ToolbarStyle = 2 $HTMLForm1.TabIndex = 18 $HTMLForm1.Enabled = $false $GroupBox5.Controls.Add($HTMLForm1) # Externe Nachricht $HTMLForm2.Location = New-Object System.Drawing.Size(10,205) $HTMLForm2.Size = New-Object System.Drawing.Size(450,150) $HTMLForm2.ToolbarStyle = 2 $HTMLForm2.TabIndex = 19 $HTMLForm2.Enabled = $false $GroupBox5.Controls.Add($HTMLForm2) ######################################################################################################################################### # Optionsfelder erstellen # Auswahlbuttons erstellen $RadioDisabled.Location = New-Object System.Drawing.Size(10,25) $RadioDisabled.Size = New-Object System.Drawing.Size(350,20) $RadioDisabled.Enabled = $false $RadioDisabled.TabIndex = 8 $RadioDisabled.add_Click({Button_Status}) $GroupBox3.Controls.Add($RadioDisabled) $RadioEnabled.Location = New-Object System.Drawing.Size(10,50) $RadioEnabled.Size = New-Object System.Drawing.Size(350,20) $RadioEnabled.Enabled = $false $RadioEnabled.TabIndex = 9 $RadioEnabled.add_Click({Button_Status}) $GroupBox3.Controls.Add($RadioEnabled) # Checkbox auch für Externe Empfänger $Extern.Location = New-Object System.Drawing.Size(10,25) $Extern.Size = New-Object System.Drawing.Size(370,20) $Extern.TabIndex = 10 $Extern.add_Click({Button_Status}) $GroupBox1.Controls.Add($Extern) # RadioButton Extern nur Kontaktliste $ExternKontakte.Location = New-Object System.Drawing.Size(25,45) $ExternKontakte.Size = New-Object System.Drawing.Size(380,20) $ExternKontakte.TabIndex = 11 $GroupBox1.Controls.Add($ExternKontakte) # RadioButton Extern alle $ExternAlle.Location = New-Object System.Drawing.Size(25,70) $ExternAlle.Size = New-Object System.Drawing.Size(380,20) $ExternAlle.TabIndex = 12 $GroupBox1.Controls.Add($ExternAlle) # Checkbox Zeitintervall $Zeit.Location = New-Object System.Drawing.Size(10,100) $Zeit.Size = New-Object System.Drawing.Size(370,20) $Zeit.add_Click({Button_Status}) $Zeit.TabIndex = 13 $GroupBox1.Controls.Add($Zeit) # StartzeitFeld einbauen $ZeitStart.Location = New-Object System.Drawing.Size(100,130) $ZeitStart.Size = New-Object System.Drawing.Size(70,20) $ZeitStart.CustomFormat = "HH:mm" $ZeitStart.Format = 'Custom' $ZeitStart.Name = "Startzeit" $TextZeitStart.TabIndex = 14 $ZeitStart.ShowUpDown = $true $GroupBox1.Controls.Add($ZeitStart) # StartdatumFeld einbauen $DatumStart.Location = New-Object System.Drawing.Size(180,130) $DatumStart.Size = New-Object System.Drawing.Size(130,20) $DatumStart.CustomFormat = " ddd dd.MM.yyyy" $DatumStart.Format = 'Custom' $DatumStart.Name = "Startdatum" $DatumStart.TabIndex = 15 $GroupBox1.Controls.Add($DatumStart) # EndzeitFeld einbauen $ZeitEnde.Location = New-Object System.Drawing.Size(100,160) $ZeitEnde.Size = New-Object System.Drawing.Size(70,20) $ZeitEnde.CustomFormat = "HH:mm" $ZeitEnde.Format = 'Custom' $ZeitEnde.Name = "Endzeit" $ZeitEnde.TabIndex = 16 $ZeitEnde.ShowUpDown = $true $GroupBox1.Controls.Add($ZeitEnde) # EnddatumFeld einbauen $DatumEnde.Location = New-Object System.Drawing.Size(180,160) $DatumEnde.Size = New-Object System.Drawing.Size(130,20) $DatumEnde.CustomFormat = " ddd dd.MM.yyyy" $DatumEnde.Format = 'Custom' $DatumEnde.Name = "Enddatum" $DatumEnde.TabIndex = 17 $GroupBox1.Controls.Add($DatumEnde) # Ausgabetextfeld bauen $Ausgabe1.Location = New-Object System.Drawing.Size(5,25) $Ausgabe1.Size = New-Object System.Drawing.Size(200,150) $Ausgabe1.Font = $Font $GroupBox4.Controls.Add($Ausgabe1) # Ststusbild anzeigen lassen $ToolTip.SetToolTip($StatusBild, "Out of Office Status") $StatusBild.Location = New-Object System.Drawing.Size(225,25) $StatusBild.SizeMode = "AutoSize" $StatusBild.Text = "Out of Office Status" $StatusBild.TabIndex = 21 $GroupBox4.Controls.Add($StatusBild) ######################################################################################################################################### # Erweiterte optionen # Checkbox Zeitintervall $Weiterleitung.Location = New-Object System.Drawing.Size(10,25) $Weiterleitung.Size = New-Object System.Drawing.Size(320,20) $Weiterleitung.Enabled = $false $Weiterleitung.add_Click({Button_Status}) $Weiterleitung.TabIndex = 13 $GroupBox6.Controls.Add($Weiterleitung) $WeiterleitungMail.Location = New-Object System.Drawing.Size(25,45) $WeiterleitungMail.Size = New-Object System.Drawing.Size(300,20) $WeiterleitungMail.AutoCompleteMode = 3 $WeiterleitungMail.AutoCompleteSource = 256 $WeiterleitungMail.DataBindings.DefaultDataSourceUpdateMode = 0 $WeiterleitungMail.FormattingEnabled = $True $WeiterleitungMail.TabIndex = 1 $WeiterleitungMail.Enabled = $false $GroupBox6.Controls.Add($WeiterleitungMail) $WeiterleitungMailKopie.Location = New-Object System.Drawing.Size(25,70) $WeiterleitungMailKopie.Size = New-Object System.Drawing.Size(340,40) $WeiterleitungMailKopie.Enabled = $false $WeiterleitungMailKopie.add_Click({Button_Status}) $WeiterleitungMailKopie.TabIndex = 13 $GroupBox6.Controls.Add($WeiterleitungMailKopie) ######################################################################################################################################### # Aktion für automatsiche Anmledung ausführen <# Dies ist keine Funktion. Ist der Wert zur Automatischen anmeldung auf "Yes" festgelegt, so wird unmittelbar nach Programmstart die Anmeldung ausgeführt!#> if (($LogOnatStart -eq "Yes") -and ($SetServername -gt 0) -and ($LoggedOnUser -eq "Yes")) { Anmelden } if ($LogOnatStart -eq "no") { $Ausgabe1.Text = $MsgAutoLogonDisabeld $Fenster0.hide() } if (($LogOnatStart -eq "Yes") -and ($SetServername -lt 0) -and ($LoggedOnUser -eq "No")) { $AutoLogonFail = [Windows.Forms.MessageBox] $AutoLogonFail::Show($MsgAutoLogonFailedText , $MsgAutoLogonFailedTitle, "OK", "Error") } if (($LogOnatStart -eq "Yes") -and ($SetServername -lt 0) -and ($LoggedOnUser -eq "Yes")) { $AutoLogonFail = [Windows.Forms.MessageBox] $AutoLogonFail::Show($MsgAutoLogonFailedText , $MsgAutoLogonFailedTitle, "OK", "Error") } ######################################################################################################################################### # Fenster anzeigen lassen [System.Windows.Forms.Application]::Run($Fenster1) [System.Windows.Forms.Application]::EnableVisualStyles() [System.Windows.Forms.Application]::DoEvents() $Fenster1.Add_Shown({$Fenster1.Activate()}) $notifyIcon.Dispose()
Hi Andi, kann man das Tool auf MOdern Auth umstellen? Microsoft dreht ja mit 1.10 die Legacy-Authentifizierung ab.
SG Bernd
Wenn die Textfelder für die Nachrichten nicht angezeigt werden: bei allen dateien (nicht nur ps1 und exe im verzeichnis in den Eigenschaften die Ausführung „Zulassen“.
Bei einigen PCs wird die Benutzerliste nicht geladen. Es gibt keine Fehlermeldung. Die Liste ist einfach leer.
Auf allen PCs ist Windows 10 und Powershell 5.1 installiert.
Bei mir wurde die Benutzerliste nach einer Windows 10-Neuinstallation nicht mehr geladen. Ich habe in der PowerShell Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser gesetzt.
Quelle: https://www.howto-outlook.com/howto/powershell-scripts-faq-tips-and-tricks.htm
Hi Andi,
Cooles Tool, eine Frage, kann ich irgendwie User und Passwort fix hinterlegen?
SG
Moin Andi,
danke für das Tool, leider funktioniert es in unserer Konstellation leider nicht.
Anfänglich konnte ich mich am O365 anmelden/verbinden.
Seit dem das Multi-Faktor-Authentifizierung (MFA) aktiviert wurde, kann ich mich nicht am O365 anmelden/verbinden.
Bzw. es kommt nicht die Webseite von Microsoft, wo ich meine Daten inkl. Code eingeben kann.
Kennt jemand dieses Phänomen?
Hat jemand bitte eine Idee zur Lösung?
Danke
Franz
Hallo Andi,
danke für das Tool, leider funktioniert es in unserer Konstellation leider nicht.
Ich verbinde mich per RDP auf einen virtualisierten Windows Server 2016 Standard und führe dort die aktuelle Version des Scripts aus. Verbindung wird aufgebaut zu einem Exchange 2016. Ich kann alles machen, bis zu dem Moment wo ich in die Textfelder zum Editieren der eigentlichen Nachricht klicke – Unhandled Exception. Unabhängig davon, ob ich einen User ausgewählt habe oder nicht.
Kennt jemand dieses Verhalten? Hat jemand bitte eine Idee zur Lösung?
Hmm, wollte das Tool eben wieder mal nutzen. Lief ja bisher immer klaglos auf der Windows Server 2012 R2 und Exchange 2013.
Jetzt aber – ohne aktiv eine Änderung vorgenommen zu haben (wenn dann Microsofts Updates) – klappt die Abfrage des AAD / Exchange nicht. Es werden keine User gefunden. LAsse mir alle User anzeigen.
Hallo Andy,
ist es möglich das Tool noch so zu konfigurieren, das man auch die Weiterleitungen sieht die der Benutzer selbst eingestellt hat?
LG Martin
Hallo zusammen,
ich bekomme die Textfelder für die Nachrichten nicht angezeigt, kennt jemand dieses Phänomen und weiß Abhilfe?!
Vielen Dank
Ich hänge mich an die Frage mal dran, habe das gleiche Problem
Hallo Andi,
vielen Dank für Dein Tool. Ich habe noch ein bisschen was daran gebastelt, sodass Ich per AD Gruppe steuern kann welcher Abteilungsleiter Konfigurationen für welchen Mitarbeiter vornehmen kann, aber ohne Dein Tool wäre ich ganz sicher daran verzweifelt.
Viele Grüße
Johannes
Klasse Tool.
Ich kann leider keine Abwesenheit editieren, ob wohl GvS.Controls.HtmlTextbox.dll im Verzeichnis liegt. Es wird gar nichts angezeigt.
Gibt es da noch einen weiteren Trick?
Verwende das Tool unter Win10Pro
Hallo
super Tool, vielen Dank dafür
Ich habe nur eine Frage: In welchem Format muss man im ini File die OU angeben?
Vielen Dank
Michael
Vielen Dank für das tolle Skript. Ich war schon drauf und dran das Rad neu zu erfinden und stieß bei den Recherchen auf dieses fantastische Tool.
Da wir mit der Mitarbeiter/Vorgesetzten Hierarchie im AD arbeiten, wollten wir (eigentlich) den Vorgesetzten die Möglichkeit geben die Anforderung zu Abwesenheitsnotizen selbst einzutragen. Die Combobox also nur mit den Kontakten zu füllen, die mir als Mitarbeiter eingepflegt sind. So eine Art Self-Service
Es breitet sich immer eine gewisse Panik aus, wenn Mitarbeiter in Schlüsselpositionen ihre E-Mails unvorhergesehen nicht mehr abrufen können.
Danke nochmals und alles Gute!
Sieht erstmal gut aus. Programm startet aber leider werden nur „normale“ Benutzerpostfächer angezeigt. Wir arbeiten aber nur mit linked Mailboxen. Die fehlen in der Auflistung. Gibt es einen Trick oder Anpassung wie die linked Mailboxen angezeigt werden können?
Vielen Dank für das Tool. Allerdings ist nicht bei allen Usern die Benutzerliste gefüllt, sondern leer. Die Powershell 5.1 ist installiert. Am selben Gerät als anderer Benutzer wird die Liste auch angezeigt. An anderen Geräten mit dem vorherigen Benutzer funktioniert es ebenfalls.
Gibt es irgendeine Einstellung, die noch als Benutzer in Windows oder im Profil vorgenommen werden muss?
Prima Tool. Einen Verbesserungswusch hätte ich aber noch. Viele unserer Benutzer haben eine Regel eingetragen, die eine Abwesenheitsmail bei JEDER eingehenden Mail versendet. Es wäre schön, wenn man diese Regel im Scripts auch noch einmal einlesen/bearbeiten könnte
Hey Lars,
das geht leider nicht.
Andi
Hallo Andi,
gibt es eine Möglickeit das Tool „out of Office“ auch komplett im Vollbildmodus zu betreiben?
Gruß Markus
Hey Markus,
nein bisher nicht.
LG
Hallo Andi, vielen Dank für das tolle Tool, wir setzen es erfolgreich in unserer Behörde ein.
Zwei Vorschläge hätte ich: da wir im AD auf mehrere OUs verteilt sind, wäre es schön, wenn man in der INI-Datei mehrere OUs angeben könnte. Im Programm dann am besten mit einer Auswahl welche der konfigurierten OUs eingelesen werden soll. Das ist nämlich nur im Vertretungsfall (je OU ein Admin) nötig. Die gesamte Domäne wäre aber wieder zuviel, da noch weitere Behörden in der selben Domäne sind.
Auserdem wäre es schön, wenn man gleich ein paar vorgefertigte Texte für die Abwesenheit abspeichern könnte und bei Auswahl eines gespeicherten Textes dieser gleich in die Zwischenablage kopiert wird. So braucht man die Vorlage nur noch in die Text-Boxen kopieren und anzupassen. Zur Zeit speichern wir die Vorlage in einer Text-Datei.
Viele Grüße und weiter so.
Hallo Andi,
super Script (v2.3).
Leider kommt bei mir in Zeile 1393 folgender Fehler:
In …\Downloads\OOO_2.3\OOO_2.3.ps1:1393 Zeichen:25
+ $ExitBild.add_mouseclick{Abmelden}
+ ~
Unerwartetes Token „{“ in Ausdruck oder Anweisung.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken
Ist das nur bei meinem download so?
Sorry,
habe es auf einem Win7 (mit Powershell v3) getestet.
Auf Win10 (mit PowerShell v5) funktioniert es.
Freut mich! Viel spaß damit!
Andi
Hallo Andres, leider ist mein Post von heute Vormittag verschwunden. Ich habe das Problem, das die Abwesenheitsmeldung mit einem Zeitversatz von +2 Stunden erstellt wird(Office 365). Danke für einen Tip. Gruss René
Hallo Andres, vielen Dank für das Script. Nach Speichern/aktualisieren wird nur die Nachricht für interne Empfänger gesetzt. Als Zusatzoptionen ist die CheckBox „Auch an Absender ausserhalb der Organisation senden“ aktiviert. Zudem wird der Responder mit einem Zeitversatz von 2 Stunden eingestellt. Ich stelle im Tool als Startzeit 10:55 ein, im Autoresponder wird aber 12:55 eingetragen.
Hallo Andi,
Vielen Dank, dass Du Dein tolles Tool mit uns teilst. Nun ist es wesentlich einfacher und datenschutzkonform, eine Abwesenheitsnotiz für einen Mitarbeiter zu erstellen, der bereits abwesend ist.
Viele Grüße,
Nick
Hi Andi,
erst mal danke für das geniale Tool. Dieses erleichtert uns Admins doch das Leben wieder ein wenig mehr :)
Ich habe bei dem Tool das Phänomen das mir manchmal nach dem Starten der Editor für die Abwesenheitsnotizen nicht angezeigt wird. Der Editor wird hier dann augenscheinlich nicht eingebunden. Nach mehrmaligen starten des Tools funktioniert es dann wieder.
Vielleicht hast du ja einen Lösungsansatz für mich?
Mit freundlichem Gruß aus Rietberg
Mathias
Hi Andi,
auch unter Windows Server 2012 R2 greift der Tipp von Stefan. Nachdem ich die Dateien zugelassen haben funktioniert das Script einwandfrei.
Cooles Tool. Aber es heißt „Reply“ und nicht „Replay“ ;)
Hallo,
ein wirklich tolles Tool! Für unsere Einsatzzwecke müssten wir kleine Veränderungen an der .ps1 Datei vornehmen. Sobald ich diese dann als .exe Datei umwandele und starte, erscheint im Hintergrund die geöffnete CMD. Hast du einen Tip wie sich dies verhindern lässt? Das exportieren geschieht übrigens über das Tool PowerShellStudio.
Beste Grüße und weiter so!
Danke :)
Schau doch mal hier:
https://asichel.de/2016/08/12/powershell-to-exe-so-entstehen-meine-tools/
LG Andi
Hallo Andi,
die Version 2.0 funktioniert bei uns. Bei den Versionen danach werden keine Benutzer angezeigt. Es erscheint auch keine Fehlermeldung. Kannst du uns einen Tip geben?
Hallo Andreas,
welche PowerShell Version kommt bei dir zum Einsatz?
Andi
Hallo Andi,
wirklich ein super Tool, das wir schon seit mehreren Version gerne nutzen.
Allerdings ist mir die Tage aufgefallen, dass die Abwesenheitsnachricht nur für einen Tag aktiv ist, wenn ich keinen Zeitraum setze. Ist dies so gewollt oder kann man da noch was einstellen?
Schöne Grüße,
Peter
Hallo Peter,
danke:) Eigentlich sollte es so nicht sein. Der Abwesenheitsassistent wird ohne Zeitangabe aktiviert und bleibt solange aktiv bis der User dieses wieder entfernt.
Haben Sie eventuell ein weiteres Skript oder eine andere Applikation die den Status wieder rückgängig macht?
Hallo Andi,
wenn ich Ihre 2.0er Version nehme und die Abwesenheit ohne Zeitraum setze, so erhalte ich als Bestätigung die Meldung „Die Abwesenheistnotiz fuer das Konto ABC wurde gespeichert / aktualisiert. Es wird eine Externe Nachricht an ALLE Absender verschickt.“. Also so wie gewünscht.
Klicke ich dann auf Abfragen, erhalte ich folgende Meldung:
RunspaceId : 8b5855e3-a6ee-47c9-b816-173b967b3cf3
AutoReplyState : Enabled
EndTime : 14.01.2017 11:00:00
ExternalAudience : All
.
.
.
Ein weiteres Skript zur Verwaltung der Abwesenheitsnotizen setzen wir nicht ein. Als Workaround habe ich nun bei allen gesetzten Abwesenheitsnotizen den Zeitraum gesetzt.
Haben Sie noch eine Idee, wo ich suchen könnte?
Vielen Dank,
Peter
Hey,
die aktuelle Version zeigt anstatt der Textausgabe ein Symbol an (Firma oder Zuhause). Die Abfrage sollte bei aktivem Status das Zuhause-Symbol anzeigen.
Bei deaktiviertem Status wird das Firma-Symbol angezeigt.
Andi
Hallo,
bei dem oben gezeigten Beispiel (kein Zeitraum konfiguriert) zeigt die 2.0 EndTime : 14.01.2017 11:00:00. Bei Version 2.3 wird am 14.01.2017 um 12:02 für dieses Konto „Aktiv“ angezeigt.
Habe jetzt die 2.3er Version installiert und die Abwesenheitsbenachrichtigungen mit dieser Version neu gesetzt.Am Montag werde ich noch mal testen ob die Benachrichtigungen noch versendet werden und was Ihr Tool anzeigt.
Hallo Andi,
das Problem hat sich mittlerweile zumindest erklärt. Mir war nicht bewusst, dass Exchange pro Absender und Aktivierungszeitraum, anders als bei lokalen Regeln, nur eine Benachrichtigung versendet.
Wir müssen also mal schauen wie wir damit umgehen. Es gibt zwar Ansätze die dieses Verhalten per Skript z.B. durch zyklisches Aktivieren/Deaktivieren des OOF lösen, ob das aber wirklich gut funktioniert, müsste in unserem Fall erst noch getestet werden.
alle enpackten Dateien liegen in einem Verzeichnis. Auch die GvS.Controls.HtmlTextbox.dll.
Hast Du ein den Eigenschaften des Scripts die Checkbox auf „Zulassen“ gesetzt? (Wie im Bild oben)
Hallo, ich bekomme die Textfelder für die Abwesenheit nicht zum editieren angezeigt. Das Programm läuft auf Server 2012 R2, also mit PS4 und netframework 4.0.
Fehlt noch was?
Hey! Hast Du die GvS.Controls.HtmlTextbox.dll im Scriptverzeichnis liegen?
LG Andi
Hallo Andi,
das ist echt ein super Tool. Vielen Dank.
Was ich noch gut und sinnvoll finden würde, wenn man über das Tool auch die „Regeln für automatische Antworten“ einsehen könnte, die ein User gesetzt hat. Siehe hierzu diesen Link:
https://social.technet.microsoft.com/Forums/exchange/en-US/46471082-ccb7-4f72-864e-1193e99e364f/exchange-server-2010-sp2-out-of-office-rule-with-forwarding-via-ems-possible?forum=exchangesvradminlegacy
Diese Reglen ermöglichen es ja dem User, in den automatischen Antworten zu definieren, dass Mails an einen Kollegen oder so weitergeleitet werden.
Kann man das irgendwie abfragen oder kannst du das ggfs. mit in dein Tool integrieren?
LG;
Christian
Halllo Andi,
bei mir wird der Text neben den Radio-Buttons nicht dargestellt mit der Version 2.3. (Zugriff per RDP auf SRV2012R2 und Exchange 2013). Gleiche config Datei wie bei 2.2, wo es noch funtkioniert. klappt aber auch nicht per direkter Konsole der VM.
Guten Morgen Stefan,
benutze doch bitte die Config-Datei von der aktuelle Version. Darin ist die Spracheinstellung definiert, die zur Anzeige der korrekten Sprache führt.
Andi
Hi Andi,
Powershell ist wie bei Win7 (Pro) on board und .NET wäre 4.6.1…
Hallo,
schon klar, aber benötigt wird Version 4.0. Bitte in der PS die Abfrage „get-host“ ausführen um die aktuelle Version zu ermitteln.
Andi
Hi,
bei mir stirbt das Programm schon beim Ausführen – egal ob auf Win7 oder auf SBS11. Dachte, es interessiert dich…
Problemsignatur:
Problemereignisname: APPCRASH
Anwendungsname: OOO_2.2.exe
Anwendungsversion: 2.0.0.2
Anwendungszeitstempel: 56e010ad
Fehlermodulname: KERNELBASE.dll
Fehlermodulversion: 6.1.7601.18869
Fehlermodulzeitstempel: 556366fd
Ausnahmecode: e0434352
Ausnahmeoffset: 000000000000b3dd
Betriebsystemversion: 6.1.7601.2.1.0.305.9
Gebietsschema-ID: 3079
Hallo Gustav,
sind die Voraussetzungen zu .Net und PowerShell bei Dir installiert?
Hallo Andi,
die Krönung wäre ja, wenn man die Abwesenheitsmeldung für bestimmte Tage Mo-Fr in der Zeit von 19:00 bis 9:00 des Folgetags einstellen könnte.
Hallo,
das geht leider nicht, da die EWS eine solche Funktion so nicht unterstützen! Du könntest vermutlich mit der dem Aufgabenplaner aus Windows eine solche Anforderung realisieren.
Hallo Andi,
tooles Tool. Ein Hinweis: Bei der Info zum gesetzten Zeitraum der Abwesenheitsnotiz erscheint „Zeispanne konfiguriert“ von 05.17.2016 bis “ …und nicht 17.05.2016. Das ist sicher ein Bug, oder?
Hallo Andi,
tolles Tool, funktioniert bei uns mit Exchange 2016 einwandfrei – danke dafür.
Eine Sache fehlt und schmerzlich – eine E-Mail Weiterleitung.
Wenn also der Abwesenheitsassistent aktiv ist, möchten wir bei Bedarf eine E-Mail Weiterleitung zu einem anderen Benutzer aktivieren können.
Wenn das drin wäre, wäre es perfekt!
LG
Bruno
Hallo Bruno,
eigentlich bin ich ja gegen so eine Weiterleitung ;) Datenschutz und so …. bin aber bereits dran. Wird ca. noch 4-6 Wochen dauern.
Andi
Das stand schon in der Config so drin, habe aber auch alles rausgelöscht und nur deinen Text reinkopiert.
Leider kommt immer noch die gleiche Fehlermeldung.
Hmmm,
und wenn Du mal die Version auf 4.5 änderst. Führst Du die Datei vom Netzwerk aus, wenn ja, kopiere Sie mal an einen Lokalen Ort?!
Andi
Hi,
ich führ die Datei lokal aus.
Habe in der config Datei die Version auf 4.5 und 4.6 geändert, da ich 4.6 installiert habe (vll liegt hier der Fehler?), allerdings kommt bei beiden Werten eine Meldung das Framework nicht gefunden wurde.
Viele Grüße
Ja vermutlich,
versuch doch mal einen Windows 10 Client in einer VM ;)
Unter Windows 10 sehe ich die Textboxen nicht, was kann ich tun?
Hallo,
ist die *.dll Datei im Ausführungsverzeichnis vorhanden? Blockiert die PS? Was passiert beim öffnen der *.ps1 Datei? LG
die .dll Datei ist im Ausführungsverzeichnis vorhanden. die Powershell meldet:
Ausnahme beim Aufrufen von „LoadFile“ mit 1 Argument(en): „Es wurde versucht, eine Assembly von einer Netzwerkadresse
zu laden, was in früheren Versionen von .NET Framework zum Ausführen der Assembly als Sandkastenassembly geführt
hätte. In dieser Version von .NET Framework wird die CAS-Richtlinie standardmäßig nicht aktiviert, dieser Ladevorgang
kann daher gefährlich sein. Wenn Sie nicht beabsichtigen, durch diesen Ladevorgang eine Sandkastenassembly zu
erstellen, aktivieren Sie den loadFromRemoteSources-Schalter. Weitere Informationen finden Sie unter
„http://go.microsoft.com/fwlink/?LinkId=155569″.“
In C:\Users\***\Desktop\OOT\OOO_2.1.ps1:34 Zeichen:1
+ [Reflection.Assembly]::LoadFile(„$scriptRoot\GvS.Controls.HtmlTextbox …
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : NotSupportedException
New-Object : Der Typ [GvS.Controls.HtmlTextbox] kann nicht gefunden werden. Stellen Sie sicher, dass die Assembly, die
diesen Typ enthält, geladen wird.
In C:\Users\***\Desktop\OOT\OOO_2.1.ps1:251 Zeichen:14
+ $HTMLForm1 = New-Object GvS.Controls.HtmlTextbox
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidType: (:) [New-Object], PSArgumentException
+ FullyQualifiedErrorId : TypeNotFound,Microsoft.PowerShell.Commands.NewObjectCommand
Hey, ersetze mal dieOOO_2.1.exe.config mit dieser hier:
https://asichel.de//wp-content/uploads/2016/02/OOO_2.1.exe.config
Andi
Hatte mein obigen Beitrag auf deine erste Antwort geschrieben, aber dadurch das du wahrscheinlich den Beitrag gelöscht hast, während ich geantwortet hab. Erscheint er nun oben, kann gelöscht werden.
Mit der Config Datei kommt der gleiche Fehler.
Hi Andi,
das Programm lässt sich bei mir nicht starten, es öffnet sich kurz ein Fenster und schließt sich dann sofort wieder. Die settings.ini habe ich angepasst. Was mache ich falsch?
Hi Adrian,
hast Du .Net / WMF 4.0 installiert?
Hallo Andi,
ich finde das Tool richtig gut. Eine Frage habe ich aber, welche Rechte brauche ich für ein Postfach um den OOO Agenten zu aktivieren? Muss ich Exchange Administrator sein, oder reicht z.B. Vertreter, oder FullAccess?
Danke dir
Hristo
Hallo,
selbstverständlich muss eine Berechtigung vergeben sein. Lösen kannst Du das bspw. indem Du eine neue Rollengruppe erstellst der die Berechtigung „Mail Recipients“ zugewiesen ist. Benutzer dieser Rolle haben dann das Recht mit meinem Tool den Abwesenheitsassistenten zu ändern.
Andi
Hallo Andi,
dein Tool hat uns schon des Öfteren prima geholfen, kann man dein out of office tool auch mit office365-konten verwenden/verbinden?
Gruß
Roland
Hallo Roland,
danke :) Steht mit auf meiner To-Do-Liste für das Tool …
Andi
Hallo Andi,
super Tool wollte mir selbst so ein Programm in PS schreiben bevor ich darauf gestoßen bin.
Kann ich die PS Datei noch erweitern und zusätzliche Funktionen in die Oberfläche mit einbinden oder
sind diese in der EXE fest verankert?
Gruß Steffen
Hallo Steffen,
die *.EXE ist nicht editierbar. Allerdings kann das PS-Script gern angepasst / erweitert werden. Über den Button „Aktuelles Powershell Script“ kann der Code kopiert werden!
Welche Ideen hast du denn?
Andi
Hallo Andi,
ich hätte noch gern die Verwaltung der Umleitungen per Powershell mit dabei.
z.B. Mitarbeiter A ist nicht da, dann sollen die Mails an Mitarbeiter B weitergeleitet werden und eine lokale Kopie beim Benutzer verbleiben
Dies kann, wie ich gesehen habe, mit dem Befehl „Set-Mailbox -DeliverToMailboxAndForward“ erfolgen.
Gruß Steffen
[…] Out of Office Tool […]
Hallo Andi,
beim Aufruf erhalte ich folgende Fehlermeldung (Aufruf am Server direkt oder per Client):
New-Object : Ausnahme beim Aufrufen von „.ctor“ mit 0 Argument(en): „Das ActiveX-Steuerelement 8856f961-340a-11d0-a96b-00c04fd705a2 kann nicht
instanziert werden, da der aktuelle Thread kein Singlethread-Apartment ist.“
Bei Z:\Skripts\Gui_OutofOffice_10.0.0.3_ohne_exe\Gui_OutofOffice_1.0.0.3.ps1:636 Zeichen:24
+ $HTMLForm1 = New-Object <<<< GvS.Controls.HtmlTextbox
+ CategoryInfo : InvalidOperation: (:) [NewObject], MethodInovationException
+ FullyQualifiedErrorID : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand
Die Location-Eigenschaft wurde in diesem Objekt nicht gefunden. Stellen Sie sicher, dass sie vorhanden ist und festgelegt werden kann.
Bei Z:\Skripts\Gui_OutofOffice_10.0.0.3_ohne_exe\Gui_OutofOffice_1.0.0.3.ps1:637 Zeichen:12
+ $HTMLForm1. <<<< Location = New-Object System.Drawing.Size(10,25)
+ CategoryInfo : InvalidOperation: (Location:String) [], RuntimeException
+ FullyQualifiedErrorID : PropertyNotFound
Die Size-Eigenschaft wurde in diesem Objekt nicht gefunden. Stellen Sie sicher, dass sie vorhanden ist und festgelegt werden kann.
…
Ich habe die aktuelle Version geladen, GUI startet und ich kann auch die User abfragen, aber keine Änderungen an den Abwesenheitsnotiztexten durchführen.
Im Einsatz ist Exchange 2010 mit akt. SP.
Kannst Du mir hier evtl. weiterhelfen?
Vielen Dank
Mathias
Hi,
versuch mal folgende Updates auf deinem System zu installieren:
http://www.microsoft.com/de-de/download/details.aspx?id=30653
und
http://www.microsoft.com/de-de/download/details.aspx?id=40855
Das ist das .Net4.5 und das WMF 4.0. Ich habe selbst Windows 7 64 Bit mit diesen beiden Updates im Einsatz. Ich habe allerdings auch noch nichts gehört das es mit .Net3.5 nicht funktioniert. Getestet auch von Server 2012 / R2 und Server 2008 R2 mit Exchange 2010.
MfG
Hallo Andi,
noch ein Nachtrag:
Nach dem Anmelden erhalte ich die Meldung, dass die Anmeldung nicht erfolgreich war, kann aber die User abfragen und speichern.
Die Felder „Interne Nachricht“ und „Externe Nachricht“ werden nicht angezeigt/sind nicht bearbeitbar.
VG
Mathias
Hallo,
das ist schon merkwürdig. Die HTML-Felder sind nur verwendbar wenn die DLL-Datei im identischen Verzeichnis liegt wie das Script. Ist das der Fall?
Andi
Hi Andi,
Hi Matthias,
ich habe genau das gleiche Problem (EX2010, SP3, Update Rollup 5, Server 2008 R2). .Net 4.5 war bereits installiert. Das MSU habe ich eben nachinstalliert und starte heute Abend den Server neu und installiere dabei auch noch die offenen Updates.
Danach melde ich mich mit Feedback zurück. Aber auch bei mir treten bisher die beiden genannten Symptome (Fehlermeldung + nicht ausfüllbare Felder für interne und externe Nachrichten) auf.
Gruß
René
Hallo und danke für das Feedback,
versuchen Sie das Programm direkt auf dem Server zu öffnen, oder nutzen Sie das Programm auf einem Client?
Andi
Hallo zusammen,
nach der Installation des besagten Patches und einem Neustart des Systems funktioniert nun alles einwandfrei. Danke für den Hinweis. :)
Super, gerne :)
Hi Andi,
McAfee VirusScan Enterprise schlägt ebenfalls Alarm und vermutet den Trojaner Artemis in dem Archiv.
Gruß, Frank
Ich habe die Datei nun verändert und die *.EXE entfernt. Leider wird diese durch PowerGUI so kompiliert das es als ARTEMIS erkannt wird :( Jeder kann Sich die Datei selbst mit PowerGUI oder ähnlichem kompilieren. Danke für die Hinweise und Entschuldigung für die Umstände.
Andi
Hi Andi,
nettes Out of Office Tool, leider wird er bei McAfee als Artemis erkannt.
Hallo,
das Problem ist gestern bereits mit F-Secure aufgetreten. Mein McAfee hat nicht ausgeschlagen. Eine Antwort von F-Secure:
„es handelt sich um einen Fehlalarm der mit einem Signaturupdate behoben
wird:
[…]
Thank you for your submission.
The file you submitted is indeed clean. A database update will be released to resolve this issue.
For the meantime, you may exclude this file from Real-time Scanning.
Instructions for exclusions can be found here:
Internet Security 2013:
http://community.f-secure.com/t5/Security-for-PC/How-do-I-exclude-a-file-or/ta-p/15398
For the latest database updates please visit this page:
http://www.f-secure.com/en/web/labs_global/removal-tools/-/carousel/view/140
We apologize for any inconveniences that this may have brought you.
Should you have further questions, please do not hesitate to email us again.
[…]
Vielen Dank für den Hinweis.“
Hallo Andi,
bei VirusTotal.com schlagen aktuell 9 von 54 Scanner bei der Zip-Datei an :-(
Ich lasse mal lieber die Finger davon.
Gruß
Peter
Hallo,
das Problem in der ZIP-Datei ist die selbst kompilierte *.exe. Ich werde die Ausführbare Datei neu kompilieren und erneut überprüfen lassen. Entschuldigen Sie bitte den Verdacht auf eine Virusgefahr. Sie können Sich gerne das Script kopieren und in eine *.ps1-Datei einfügen.
Mit freundlichen Gruß
[…] Out of Office Tool […]
[…] Out of Office Tool […]
[…] Out of Office Tool […]
[…] Out of Office Tool […]