Jump to content
Sign in to follow this  
fhweuroiuweopru

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

Recommended Posts

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Edited by mamamia

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
...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) :)

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte überlege Dir, ob es nicht sinnvoller ist ein neues Thema zu erstellen.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

Werbepartner:



×
×
  • Create New...