Jump to content

Exchange 2010 - PS-Skript für Liste aller abwesenden Mitarbeiter inkl. Displayname


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

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"!)

Link zu diesem Kommentar

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

Link zu diesem Kommentar

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

Link zu diesem Kommentar

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 von mamamia
Link zu diesem Kommentar

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

Link zu diesem Kommentar
...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) :)

Link zu diesem Kommentar
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

Link zu diesem Kommentar
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

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...