binside
Goto Top

PowerShell - Existiert die Email-Adresse bereits?

Ich habe ein lauffähiges Script, dass einen neuen Exchange und AD-User erstellt und ihm 2 oder 3 (je nachdem ob Praktikant oder Mitarbeiter) Email-Adressen automatisch anlegt.

Das ganze habe ich in etwa so angelegt:

 
$Domaene = '@bspdomain.de'  
$Vorname = read-host '  
	Vorname eingeben!
	Eingabe  '  
$Nachname = read-host '  
	Nachname eingeben!
	Eingabe  '  

$Name = $Vorname + ' ' + $Nachname	  
$Alias = $Nachname.tolower()
$Punktname = $Vorname.tolower() + '.' + $Alias  
$Loginname = $Vorname.tolower() + $Alias

$Mailbox = get-mailbox -identity $Name
$Mailbox.emailaddresses.add("smtp:$Punktname$Domaene")  
$Mailbox.emailaddresses.add("smtp:$Loginname$Domaene")  
Set-Mailbox -Instance $Mailbox

Außerdem bekommen alle Mitarbeiter, die eine neue Mailbox bekommen automatisch die E-Mail-Adresse "$Nachname$Domaene"
Das ganze funktionierte Recht gut, bis jetzt ein neuer Mitarbeiter bei uns anfing, dessen Nachname und erster Buchstabe des Vornamens denen eines anderen Mitarbeiters gleichen.
Damit würden beide identische Loginnamen und Nachnamen-Adressen bekommen, ergo das Script würde Fehler werfen. Nach Firmensystem soll der neue Mitarbeiter dann die Adressen "'$Loginname'2'$Domaene'" und "'Nachname'2'$Domaene'" bekommen.
Zum auslesen aller E-Mail-Adressen habe ich

get-recipient -filter "Emailaddresses -like '*$Domaene' -and recipienttype -eq 'UserMailbox'" | select "emailaddresses"  

genommen, jedoch scheitere ich an dem Vergleich. Das ändern der E-Mails sollte dann eigentlich kein Problem sein, der Loginname selbst ist auch noch so ne Sache... aber das könnte theoretisch analog abgehandelt werden.
Hat jemand eine Idee für den Vergleich?

MfG /B_out

Content-ID: 149271

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

Ausgedruckt am: 25.11.2024 um 22:11 Uhr

filippg
filippg 18.08.2010 um 21:02:25 Uhr
Goto Top
Hallo,

mal ganz blöd gefragt: Warum lässt du das nicht über E-mail Address Policies (EAP) erledigen? Die sind eigentlich dafür da.

Prüfen auf Existenz: dein get-recipient-Ansatz klingt vernünftig (auch wenn ich mir nicht sicher bin, ob EMail-aktivierte öffentliche Ordner damit gefunden werden). Ich würde im Filter gleich die ganze Adresse angeben, und dann abfragen, ob ein Recipient gefunden wurde. Grob gesagt: $exist = (get-recipient -filter "Emailaddresses -like '*$Loginname$Domaene'").count

Gruß

Filipp
5t8d1e
5t8d1e 19.08.2010 um 09:12:04 Uhr
Goto Top
Hallo,
ungetestet da gerade kein Exchange server bei der Hand.
Hatte vor kurzem ein Skript gebastelt mit 500 Vornamen und 100 Nachnamen, welches mir zufallsbasiert Accounts und Postfächer angelegt hatte. Hatte daher auch solch ähnliche Probleme. Ich habe mit folgenden Codeschnipsel das ganze abgefangen.

[array]$mailbox = $Mailbox = get-mailbox -identity $Name 
IF ($Mailbox.count -ge 1) { $counter = $Mailbox.Count + 1} 

So nun kannst du $counter dazu benutzen um die Mailaddresse zu erweitern.

Hoffe es war verständlich

Torsten
Binside
Binside 19.08.2010 um 09:58:11 Uhr
Goto Top
Hallo filippg,

ich musste gerade lange über deine erste Zeile nachdenken. Die bezieht sich sicher auf meine Aussage, dass ich die E-Mail-Adressen per Shell hinzufüge und nicht per EAP richtig? Mit der Prüfung obs die Mail-Addy schon gibt, hat das nichts zu tun nein? Weil ich im EAP keine solche Funktion gefunden habe einzustellen, was passiert, wenn es die Mail-Adresse schon gibt.

Zu deiner Frage, warum wir die Adressen nicht über die EAP erstellen lassen: Wir unterscheiden in unserer Firma zwischen Mitarbeitern und Praktikanten, wobei die Praktikanten nur 2 Mail-Adressen bekommen und Mitarbeiter 3. Über die EAP könnte ich nun "State or Province, Department, Company oder einen der 15 Custom-Attribute als Unterscheidungsmerkmal nutzen. Da nur ein Custom-Attribut in Frage kommt, in dem dann Mitarbeiter oder Praktikant stehen müsste das während der Erstellung der neuen Mailbox (und damit des neuen Users) geschehen. Da ich aber in der Shell einfach eine Variable $MALevel deklarieren kann und die ganz zu Anfang des Scriptes per Switch-Anweisung abfrage kann ich alle Exchange- und Active-Directory-Einstellungen für Mitarbeiter und Praktikanten in einem Script abarbeiten ohne extra auf Custom-Attribute ausweichen zu können. Und die reine Erstellung der E-Mail-Adressen ist nur:

$Mailbox = get-mailbox -identity $Name
if ($MALevel -eq 'Mitarbeiter')  
	{$Mailbox.emailaddresses.add("smtp:$Punktname$Domaene")}  
else {}
$Mailbox.emailaddresses.add("smtp:$Loginname$Domaene")  
Set-Mailbox -Instance $Mailbox

Ich habs im Code oben nur vereinfacht um meine Frage so klar wie möglich zu halten. Bei der Erstellung der Mailbox wird übrigens die Mail-Adresse alias(=Nachname)@domain.de standardmäßig gesetzt, deshalb kommt sie in dem Script erst garnicht vor.

E-Mail-aktivierte öffentliche Ordner sind bei uns nicht in Gebrauch. der Codeschnipsel klingt vielversprechend, hat aber im ersten schnellen Test kein Ergebnis gebracht. Ich experimentier noch ein wenig weiter. Danke erstmal für deine Mühe.

MfG /B_out
Binside
Binside 19.08.2010 um 10:54:07 Uhr
Goto Top
Hallo Torsten,

vielen Dank, das hat schon Mal super geklappt. Nur für mein Verständnis, Du speicherst unter $Mailbox die Mailbox des $Name. $Name ist bei mir Vorname + Leerzeichen + Nachname, was laut "get-help get-mailbox -detailed" zur Identität nicht reicht. Allerdings könnte ich dort den Alias nehmen.
D.H.

Namen eingeben lassen
Alias aus namen erstellen
Mailbox mit dem Alias suchen
wenn mailbox mit alias gefunden wurde, emailadresse und loginname dementsprechend ändern
mailbox erstellen
emailadressen hinzufügen.

vielen Dank, ich werd das gleich mal ausprobieren.
5t8d1e
5t8d1e 19.08.2010 um 11:37:51 Uhr
Goto Top
Ahoi,

also PoSh ist ja ein ganz cleveres Konstrukt. Wenn get-mailbox nur ein Objekt findet bekommst du auch nur ein Objekt vom Typ Mailbox zurück. Das Problem ist sowas läßt sich nicht zählen.

Was ich mache, ist mit [array]$mailbox der PoSh mitzuteilen das $mailbox ein Array ist. In einem Array lassen sich nun die einzelnen Objekte zählen.

Torsten
Binside
Binside 19.08.2010 um 11:42:52 Uhr
Goto Top
Hallo,

ok so weit hab ich das verstanden. Was mich jetzt noch interessieren würde bei [array]$mailbox = $Mailbox schreibst du mailbox einmal groß und einmal klein. Ist das gewollt, vertippt oder unerheblich? Nachdem was ich bisher getestet habe damit scheint es unerheblich zu sein.

MfG /B_out
5t8d1e
5t8d1e 19.08.2010 um 12:02:00 Uhr
Goto Top
ahoi

ja ich bin tippfaul und ist nicht gewollt. in der PoSh ist die Groß/kleinschreibung bei Variablenname unerheblich. Leider steht auch kein Lektor hinter mir, dass halt sowas immer wieder vorkommt face-smile


grüße torsten
Binside
Binside 20.08.2010 um 08:53:09 Uhr
Goto Top
Ok ich habs jetzt hinbekommen. War ein bisschen frickelarbeit und geteste woran Exchange die Standardmail festmacht (so wies aussieht nämlich am Alias). Wenn Bedarf an meiner Lösung besteht, poste ich sie hier natürlich gerne, ansonsten vielen Dank an Torsten und auch an filippg.

Kleines Manko an der Lösung:

Wenn er nach einer Mailbox fahndet, die es noch nicht gibt (was ja kein Problem ist, weil er sie danach ja neu anlegt) dann wirft er natürlich erstmal ne Fehlermeldung. Das tut zwar dem Script nicht weh, verunsichert aber eventuelle andere Nutzer des Scriptes.

MfG /B_out
5t8d1e
5t8d1e 24.08.2010 um 10:44:06 Uhr
Goto Top
Ahoi binside,

jep schicke mal das Skript, ich denke das abfangen der Fehlermeldung sollte möglich sein.

Torsten
Binside
Binside 24.08.2010 um 11:29:02 Uhr
Goto Top
#Änderungen bei gleichem Login/Nachnamen
#Snippet aus dem ADExchangeUserScript.ps1

#Vorname
	$Vorname = read-host '  
	Vorname eingeben!
	
	Eingabe  '  
	cls
#Nachname
	$Nachname = read-host '  
	Nachname eingeben!
	
	Eingabe  '  

#Variablendeklaration
	$Bspdomain = "bsp.domain.de"  
	$Domain = "@domain.de"  
	$Name = $Vorname + ' ' + $Nachname  
	$Firstname = $Vorname
	$Lastname = $Nachname
	$Vorname = $Vorname.replace("ä",'ae').replace("ö",'oe').replace("ü",'ue').replace("Ä",'Ae').replace("Ö",'Oe').replace("Ü",'Ue').replace("ß",'ss')  
	$Nachname = $Nachname.replace("ä",'ae').replace("ö",'oe').replace("ü",'ue').replace("Ä",'Ae').replace("Ö",'Oe').replace("Ü",'Ue').replace("ß",'ss')  
	$Alias = $Nachname.tolower()
	$Punktname = $Vorname.tolower() + '.' + $Alias  
	$Loginname = $Vorname.tolower() + $Alias
	$UPN = $Loginname + '@' + $Bspdomain  
	$EMailpoint = $Punktname + $Domain
	$EMaillogin = $Loginname + $Domain
	$EMaildefault = $Alias + $Domain

#Überprüfen ob es Name bzw. Loginname in der Form schon gibt:
	[array]$EMailAddy = $EMailAddy = get-mailbox -identity "$EMaildefault"  
	[array]$EmailAddy2 = $EMailAddy2 = get-mailbox -identity "$EMaillogin"  
	IF($EMailAddy2.Count -ge 1)
		{
		$Counter = $EmailAddy2.Count + 1
		$Loginname = $Loginname + $Counter
		$UPN = $Loginname + '@' $Bspdomain  
		$EMaildefault = $Nachname.tolower() + $Counter + $Domain
		$Emaillogin = $Loginname + $Domain
		}
	ELSEIF($EMailAddy.Count -ge 1)
		{
		$Counter = $EMailaddy.Couint + 1
		$EMaildefault = $Nachname.tolower() + $Counter + $Domain
		$EMaillogin = $Loginname + $Domain
		}

Interessant ist es eigentlich erst ab Zeile 33. Das davor ist zum besseren Verständnis. Zumindest hoffe ich, dass es dazu beiträgt.^^

MfG /B_out
5t8d1e
5t8d1e 27.08.2010 um 13:11:46 Uhr
Goto Top
Ahoi,

hier eine Änderung, mit den Parameter - Filter für das cmdlet get-mailbox kommt nun keine Fehlermeldung mehr, wenn die Mailbox nicht vorhanden ist.

hoffe das Skript ist soweit verständlich, ansonsten versuche ich es gern zu erklären
Clear-Host
$vorname = Read-Host "Vorname eingeben `t"  
$nachname = Read-Host "Nachname eingeben`t"  

#Umlaute entfernen
$Vorname = $Vorname.replace("ä",'ae').replace("ö",'oe').replace("ü",'ue').replace("Ä",'Ae').replace("Ö",'Oe').replace("Ü",'Ue').replace("ß",'ss')  
$Nachname = $Nachname.replace("ä",'ae').replace("ö",'oe').replace("ü",'ue').replace("Ä",'Ae').replace("Ö",'Oe').replace("Ü",'Ue').replace("ß",'ss')  
$Alias = $Nachname.tolower()
$BspDomain = "bsp.domain.intern"  
$Domain = "@fab.intern"  
$Punktname = $Vorname.tolower() + '.' + $Alias  
$Loginname = $Vorname.tolower() + $Alias
$UPN = $Loginname + '@' + $Bspdomain  
$EMailpoint = $Punktname + $Domain
$EMaillogin = $Loginname + $Domain
$EMaildefault = $Alias + $Domain

[string]$filter = $alias + '*'  
[array]$count =  Get-Mailbox -Filter {alias -like $filter}
if ( $count.count -lt 1) {}	else { $counter = $count.count + 1 }

Write-Host  `n"es wird eine Mailbox mit folgenden Werten angelegt"`n  
write-host "Vorname: `t" $Vorname `n"Nachname: `t" $Nachname `n"Alias: `t`t" $Alias  
Write-Host "Domain: `t" $Domain `n"Punktname: `t" $Punktname `n"Loginname: `t" $Loginname$counter  
write-host "UPN:`t`t" $UPN `n"Emailpoint: `t" $EMailpoint `n"EMaildefault: `t" $Emaildefault `n  


#hier jetzt die new-mailbox anweisung ......


grüße
Torsten
Binside
Binside 27.08.2010 um 13:40:00 Uhr
Goto Top
Ok soweit ich das verfolgen kann, erstellst du einen filter, in den alle mailboxes gesammelt werden, die den nachnamen des neuen users haben. und setzt dazu n counter auf den wert, wieviele user mit dem nachnamen schon existieren.
wenn der counter kleiner als 1 ist, d.h. wenn es keine weiteren mailboxen gibt, legt er den user ganz normal an,
ansonsten wird aus count eben count + 1 (einer mehr als es user mit dem nachnamen gibt) und das wird dann da eingesetzt.

dazu habe ich folgende fragen:

warum $alias + '*'? er filtert dann alles außer den nachnamen mit irgendwas dahinter? also was passiert, wenn prahlhans bei uns arbeitet und prahl fängt bei uns an? kriegt der dann den counter hinter $loginname und $emaillogin?

das gleiche müsste ich nun noch angepasst dazu für den gleichen login august müller = amüller und anton müller = amüller tun, richtig?


den rest habe ich denke ich verstanden. ach ist clear-host = cls? das hab ich glatt ausser cmd übernommen

danke dir

MfG /B_out
5t8d1e
5t8d1e 27.08.2010 um 16:35:07 Uhr
Goto Top
ahoi

jep alles richtig verstanden. ausser das ich die mailboxen nach $alias plus wildcard filtere nicht nach den nachnamen (auch wenn es deiner namenskonvention entspricht).

damn jetzt seh ich es auch, ja meister prahl würde auch ein counter bekommen. Vielleicht fällt mir mal was dazu ein.

wenn du nen august müller hast und ein anton müller soll nachgepflegt werden, dann bekommt der anton auch nen counter

cls = clear = clear-host, naja wenn die PoSh was kennt ,dann sind das aliase.
und in skripten die man weiterreicht ist es halt besser die befehle auszuschreiben.

happy WE
Torsten
5t8d1e
5t8d1e 27.08.2010 um 20:06:16 Uhr
Goto Top
abend

kurz und knapp
Clear-Host
$Vorname = Read-Host "Vorname eingeben `t"  
$Nachname = Read-Host "Nachname eingeben`t"  

#Umlaute entfernen
$Vorname = $Vorname.replace("ä",'ae').replace("ö",'oe').replace("ü",'ue').replace("Ä",'Ae').replace("Ö",'Oe').replace("Ü",'Ue').replace("ß",'ss')  
$Nachname = $Nachname.replace("ä",'ae').replace("ö",'oe').replace("ü",'ue').replace("Ä",'Ae').replace("Ö",'Oe').replace("Ü",'Ue').replace("ß",'ss')  
$Alias = $Nachname.tolower()
$BspDomain = "bsp.domain.intern"  
$Domain = "@fab.intern"  
$Punktname = $Vorname.tolower() + '.' + $Alias  
$Loginname = $Vorname.tolower() + $Alias
$UPN = $Loginname + '@' + $Bspdomain  
$EMailpoint = $Punktname + $Domain
$EMaillogin = $Loginname + $Domain
$EMaildefault = $Alias + $Domain

# alle Mailboxen die $Alias enthalten und optional eine Nummer haben (max 2stellig)
[array]$count =  Get-Mailbox | where {$_.alias -match "\b$alias\d{0,2}\b" }  
Write-Host `n"Folgende Mailboxen enthalten den Alias $Alias" `n  
$count
if ( $count.count -lt 1) {}	else { $counter = $count.count + 1 }
Write-Host `n"es wird eine Mailbox mit folgenden Werten angelegt"`n  
write-host "Vorname: `t" $Vorname  
Write-Host "Nachname: `t" $Nachname  
Write-Host "Alias: `t`t" $Alias  
Write-Host "Domain: `t" $Domain   
Write-Host "Punktname: `t" $Punktname   
Write-Host "Loginname: `t" $Loginname$counter  
write-host "UPN:`t`t" $UPN   
Write-Host "Emailpoint: `t" $EMailpoint   
Write-Host "EMaildefault: `t" $Emaildefault   

#hier jetzt die new-mailbox anweisung ......

jetzt sollte es passen face-smile

grüße
torsten
Binside
Binside 03.08.2011 um 12:02:57 Uhr
Goto Top
Hallo 5t8d1e,

leider funktioniert es nicht so, wie du dir das vorgestellt hast. Das Ganze ist zwar vollkommen logisch, aber die

[array]$count =  Get-Mailbox | where {$_.alias -match "\b$alias\d{0,2}\b" }   

Anweisung gibt schlicht garnichts zurück. Die Variable ist leer. Auch wenn ich nicht zähle sondern mir die Mailbox direkt ausgeben lassen will, kommt nichts dabei heraus. Ich weiß lange her, aber evtl kannst du dir nochmal ansehen, obs bei dir geht.


EDIT:
Ändere ich den Code soweit ab dass nur

[array]$count =  Get-Mailbox | where {$_.alias -match "$alias" }   

stehenbleibt, gibt er die Mailboxen zurück. Inzwischen wollen wir auch keine Zahlen mehr anhängen sondern den Alias manuell ändern lassen. Vielen Dank dir nochmal für deine Mühen.

grüße /B_out