fhweuroiuweopru 10 Geschrieben 5. Dezember 2011 Melden Teilen Geschrieben 5. Dezember 2011 Hallo zusammen, seit kurzem läuft bei uns der EX2010, am alten EX2003 hatte ich per Taskplaner ein VB-Skript regelmäßig gegen das AD laufen lassen, um den Status der "Abwesenheitsnotizen" (aka OOF) der Postfächer auslesen und je Treffer ein File zu schreiben, was als Dateinamen den DISPLAYNAME (="Mustermann, Max") und als Dateiinhalt den OOF-Text enthält (das ganze wird dann von unserem Ticketsystem zur Prüfung der Mitarbeiterverfügbarkeit genutzt) Nun klappt das ganze am EX2010 natürlich nicht mehr.... Ich bin jetzt schon soweit, das ich am EX2010 in der Powershell folgendes cmdlet benutze, um alle Postfächer mit OOF-Status ungleich disabled (also nur scheduled und enabled) auslesen und fünf ausgewählte Parameter zurückzugeben: Get-Mailbox | Get-MailboxAutoReplyConfiguration | Where-Object { $_.AutoReplyState -ne "disabled" } | fl identity,autoreplystate,starttime,endtime,internalmessage Ich benötige aber unbedingt statt der IDENTITY (z.B. "Mustermann") den DISPLAYNAME (z.B. "Mustermann, Max"), den kann ich mit einem anderen cmdlet auslesen: Get-Mailbox | fl Displayname Frage: Wie kriege ich das jetzt zusammen in eine Anweisung, also in eine Ausgabe? Den Parameter DISPLAYNAME einfach als 6. Parameter an das erste cmdlet anzuhängen, geht nicht, wird einfach ignoriert... Hat jemand ein gute Idee für dieses vermutlich triviale Problem? Vielen Dank und einen schönen Tag noch AdminKnecht PS: Genial wäre natürlich ein Tipp, wie ich gleich daraus das o.g. File je Abwesenden erzeugen könnte, UND als I-Tüpfelchen dabei auch noch bei den "scheduled"-OOfs prüfen kann, ob der aktuelle Zeitpunkt gerade im scheduled-Zeitraum liegt (= dann wäre der Mitarbeiter aktuell "abwesend"!) Zitieren Link zu diesem Kommentar
samsam 14 Geschrieben 5. Dezember 2011 Melden Teilen Geschrieben 5. Dezember 2011 Moin, meinst du so? Get-Mailbox -ResultSize Unlimited |Select-Object DisplayName,ServerName,PrimarySmtpAddress, @{Name=“EmailAddresses”;Expression={$_.EmailAddresses |Where-Object {$_.PrefixString -ceq “smtp”} | ForEach-Object {$_.SmtpAddress}}} Results: DisplayName ServerName PrimarySmtpAddress EmailAddresses Price, Ed Exchange1 Ed.Price@contoso.com Ed.Price@contoso.com MFG Zitieren Link zu diesem Kommentar
fhweuroiuweopru 10 Geschrieben 5. Dezember 2011 Autor Melden Teilen Geschrieben 5. Dezember 2011 erstmal danke für deine Hilfe, aber das gibt mir letztendlich eine Liste aller Displaynames mit Server + email-Adresse, mir ging es um alle Postfächer, die die Abwesenheitsnotiz aktiviert oder geplant haben (oberstes cmdlet aus meinem OP), ergänzt um die Anzeige des DISPLAYNAMES! Wenn du noch eine Idee hätetst ... :cool: Trotzdem erstmal Danke, Marcus Zitieren Link zu diesem Kommentar
mamamia 13 Geschrieben 5. Dezember 2011 Melden Teilen Geschrieben 5. Dezember 2011 (bearbeitet) Sooo, musste mir erstmal einen 2010er Server suchen :) Hier jetzt mal mein Vorschlag: Get-Mailbox | % { $displayname = $_.displayname Get-MailboxAutoReplyConfiguration $_ | ? { $_.AutoReplyState -ne "disabled" } | % { Write-Host $displayname $_ | Select identity,autoreplystate,starttime,endtime,internalmessage | Out-File -FilePath "C:\temp\$displayname.txt" } } Die Prüfung nach der Zeit gucke ich mir jetzt nochmal an und erweitere das Script noch! So, hier jetzt noch mit Zeitabfrage: Get-Mailbox | % { $displayname = $_.displayname Get-MailboxAutoReplyConfiguration $_ | ? { $_.AutoReplyState -ne "disabled" } | % { Write-Host $displayname Write-Host $_.starttime $_.endtime $now = Get-Date if (($_.starttime -lt $now) -and ($_.endtime -gt $now)) { #Bedinung erfüllt, dann ist MA abwesend } $_ | Select identity,autoreplystate,starttime,endtime,internalmessage | Out-File -FilePath "C:\temp\$displayname.txt" } } bearbeitet 5. Dezember 2011 von mamamia Zitieren Link zu diesem Kommentar
fhweuroiuweopru 10 Geschrieben 5. Dezember 2011 Autor Melden Teilen Geschrieben 5. Dezember 2011 Hier jetzt mal mein Vorschlag: So, hier jetzt noch mit Zeitabfrage: ...phantastisch, Danke dir! Habe den Code in eine .PS1-Datei kopiert, wenn ich die ausführe, kommt aber folgendes dabei heraus: Die Pipeline wird nicht ausgeführt, da bereits eine Pipeline ausgeführt wird. Pipelines können nicht gleichzeitig ausge führt werden. + CategoryInfo : OperationStopped: (Microsoft.Power...tHelperRunspace:ExecutionCmdletHelperRunspace) [], PSInvalidOperationException + FullyQualifiedErrorId : RemotePipelineExecutionFailed Die Pipeline wird nicht ausgeführt, da bereits eine Pipeline ausgeführt wird. Pipelines können nicht gleichzeitig ausge führt werden. + CategoryInfo : OperationStopped: (Microsoft.Power...tHelperRunspace:ExecutionCmdletHelperRunspace) [], PSInvalidOperationException + FullyQualifiedErrorId : RemotePipelineExecutionFailed Die Pipeline wird nicht ausgeführt, da bereits eine Pipeline ausgeführt wird. Pipelines können nicht gleichzeitig ausge führt werden. + CategoryInfo : OperationStopped: (Microsoft.Power...tHelperRunspace:ExecutionCmdletHelperRunspace) [], PSInvalidOperationException + FullyQualifiedErrorId : RemotePipelineExecutionFailed Mustermann, Max 05.12.2011 14:00:00 06.12.2011 14:00:00 Dummbadel, Didi 05.12.2011 14:00:00 06.12.2011 14:00:00 Musterfrau, Marianne 05.12.2011 14:00:00 06.12.2011 14:00:00 [PS] C:\Users\Administrator\Desktop> Die drei Dateien werden korrekt geschrieben, die übrigen abwesenden aber nicht erkannt, wenn ich einen erneuten Aufruf der PS1 mache, kommt es zu anderen Resultaten, evtl. ein Timing-Problem? Marcus Zitieren Link zu diesem Kommentar
mamamia 13 Geschrieben 5. Dezember 2011 Melden Teilen Geschrieben 5. Dezember 2011 ...phantastisch, Danke dir! Habe den Code in eine .PS1-Datei kopiert, wenn ich die ausführe, kommt aber folgendes dabei heraus: Die Pipeline wird nicht ausgeführt, da bereits eine Pipeline ausgeführt wird. Pipelines können nicht gleichzeitig ausge führt werden. + CategoryInfo : OperationStopped: (Microsoft.Power...tHelperRunspace:ExecutionCmdletHelperRunspace) [], PSInvalidOperationException + FullyQualifiedErrorId : RemotePipelineExecutionFailed Die Pipeline wird nicht ausgeführt, da bereits eine Pipeline ausgeführt wird. Pipelines können nicht gleichzeitig ausge führt werden. + CategoryInfo : OperationStopped: (Microsoft.Power...tHelperRunspace:ExecutionCmdletHelperRunspace) [], PSInvalidOperationException + FullyQualifiedErrorId : RemotePipelineExecutionFailed Die Pipeline wird nicht ausgeführt, da bereits eine Pipeline ausgeführt wird. Pipelines können nicht gleichzeitig ausge führt werden. + CategoryInfo : OperationStopped: (Microsoft.Power...tHelperRunspace:ExecutionCmdletHelperRunspace) [], PSInvalidOperationException + FullyQualifiedErrorId : RemotePipelineExecutionFailed Mustermann, Max 05.12.2011 14:00:00 06.12.2011 14:00:00 Dummbadel, Didi 05.12.2011 14:00:00 06.12.2011 14:00:00 Musterfrau, Marianne 05.12.2011 14:00:00 06.12.2011 14:00:00 [PS] C:\Users\Administrator\Desktop> Die drei Dateien werden korrekt geschrieben, die übrigen abwesenden aber nicht erkannt, wenn ich einen erneuten Aufruf der PS1 mache, kommt es zu anderen Resultaten, evtl. ein Timing-Problem? Marcus Okay, Grund gefunden: Exchange Management Shell Error: Pipelines Cannot be Executed Concurrently Ich denke das umschreiben des Scriptes bekommst du hin. Musst ja nur Zwischenvariablen einfügen. Grüße, Markus (mit k) :) Zitieren Link zu diesem Kommentar
fhweuroiuweopru 10 Geschrieben 5. Dezember 2011 Autor Melden Teilen Geschrieben 5. Dezember 2011 Okay, Grund gefunden: .....Ich denke das umschreiben des Scriptes bekommst du hin. Musst ja nur Zwischenvariablen einfügen. Grüße, Markus (mit k) :) Spitze, habe ich hinbekommen, das sieht prima aus! Auf den Code wäre ich im Leben nicht gekommen, aber OK, sind halt meine ersten Schritte in der Powershell! Du hast mir sehr damit geholfen :D, nochmals vielen Dank und einen schönen Feierabend! Marcus Zitieren Link zu diesem Kommentar
mamamia 13 Geschrieben 5. Dezember 2011 Melden Teilen Geschrieben 5. Dezember 2011 Kein Thema. Du kannst ja deine fertige Version hier noch posten, damit es vollständig ist. Zitieren Link zu diesem Kommentar
fhweuroiuweopru 10 Geschrieben 6. Dezember 2011 Autor Melden Teilen Geschrieben 6. Dezember 2011 Kein Thema.Du kannst ja deine fertige Version hier noch posten, damit es vollständig ist. Hallo Markus, ja, gerne, ich musste dein Skript in der IF-Abfrage etwas abändern, da der THEN-Teil bis auf den Kommentar quasi -leer- war und so das folgende SELECT-Statement immer ausgeführt wurde ;) jetzt sieht das Ganze so aus: $Postfach = Get-Mailbox $Postfach | % { $displayname = $_.displayname $now=Get-Date Get-MailboxAutoReplyConfiguration $_ | ? { ($_.AutoReplyState -ne "disabled") -and ($_.starttime -lt $now) -and ($_.endtime -gt $now) } | % { $OOFText=$_.internalmessage if ($_.AutoReplyState -eq "enabled") # Status=enabled, also nur auf 'abwesend' ohne genauere Zeitangabe { Write-Host $displayname " ===> aktuell abwesend" #Konsolenausgabe zur Kontrolle $OOFText | Out-File -FilePath "C:\temp\$displayname.txt" -encoding "default" } else { # Status=scheduled, also mit von-bis-Zeit vorgeplant Write-Host $displayname "geplant von " $_.starttime " bis " $_.endtime #Konsolenausgabe zur Kontrolle "abwesend von:" | Out-File -FilePath "C:\temp\$displayname.txt" -encoding "default" $_ | Select starttime,endtime | Out-File -FilePath "C:\temp\$displayname.txt" -encoding "default" -append $OOFText | Out-File -FilePath "C:\temp\$displayname.txt" -encoding "default" -append } } } vermutlich geht es kompakter/eleganter, aber der Zweck heiligt die Mittel :p Ich lasse also abhängig davon, ob die Abwesenheit mit von-bis-Zeit vorgeplant wurde (das kann Outlook2010 ja), oder ob nur auf abwesend gestellt wurde (kann Outlook ab 2003) einen unterschiedlichen Text in die Mitarbeiterdatei ausgeben.. Das einzige, was mich noch stört, sind die teilweise als HTML formatierten Abwesenheitsnachrichten, deren Anzeige in einer Textbox im Ticketsystem sieht dann doch unschön aus: <html><head><meta name="Generator" content="Microsoft Exchange Server"> <!-- converted from text --> <style><!-- .EmailQuote { margin-left: 1pt; padding-left: 4pt; border-left: #800000 2px solid; } --></style></head> <body> <font size="2"><span style="font-size:10pt;"><div class="PlainText">Ich bin am 09.12.2011 wieder zu erreichen!</div></span></font> </body> </html> es müsste irgendeine Möglichkeit geben, das wieder in TXT zu wandeln oder alles zwischen den spitzen Klammern durch Leerstring zu ersetzen... Aber erstmal besten Dank für dein Hilfe, werde mich jetzt mal mehr in die Powershell einarbeiten :cool: Marcus Zitieren Link zu diesem Kommentar
mamamia 13 Geschrieben 6. Dezember 2011 Melden Teilen Geschrieben 6. Dezember 2011 Hallo Markus, es müsste irgendeine Möglichkeit geben, das wieder in TXT zu wandeln oder alles zwischen den spitzen Klammern durch Leerstring zu ersetzen... Es gibt nichts, was es nicht gibt ;) winstonfassett.com/blog | HTML to Text conversion in PowerShell Gute Arbeit Marcus, iss denke ich viel bei rum gekommen. Markus Zitieren Link zu diesem Kommentar
NorbertFe 2.034 Geschrieben 6. Dezember 2011 Melden Teilen Geschrieben 6. Dezember 2011 Eventuell in dem Zusammenhang auch interessant: Glen's Exchange Dev Blog: Creating an Out of Office Board using Remote Powershell, Mailtips and the EWS Managed API Bye Norbert Zitieren Link zu diesem Kommentar
fhweuroiuweopru 10 Geschrieben 6. Dezember 2011 Autor Melden Teilen Geschrieben 6. Dezember 2011 Es gibt nichts, was es nicht gibt ;) :D Super, den Code-Teil habe ich mir noch dazugebaut, jetzt sind die Texte zumindest einigermaßen leserlich! Spitze, danke nochmal! Marcus Zitieren Link zu diesem Kommentar
fhweuroiuweopru 10 Geschrieben 6. Dezember 2011 Autor Melden Teilen Geschrieben 6. Dezember 2011 Eventuell in dem Zusammenhang auch interessant: Danke, Norbert, das schaue ich mir auch noch mal in Ruhe an, erstmal habe ich ja das, was ich wollte, ist schon viel mehr, als ich zu hoffen gewagt habe! ;) Prima Community hier .... :cool: Marcus Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.