cargoluxpilot748
Goto Top

Daten aus dem AD company und Exchange SMTP Attribut in CSV speichern

Hallo zusammen,

zunächst einmal möchte ich mich bedanken, dass mir beim letzten Post so schnell geholfen wurde. Ich bräuchte allerdings wieder Eure Unterstützung. Ich habe nun ein Skript, das nach Benutzerkonten der Firma "Testfirma" und der Abteilung "XY" filtert und dort die SMTP Adressen, die mit "*test.de" enden entfernt. Das Skript funktioniert soweit auch. Nun möchte ich allerdings noch die Daten der gelöschten Mitarbeiter (bevorzugt SamAccountName) sowie die SMTP Adressen, die auf "*test.de" enden in eine CSV-Datei speichern, damit man diese in einem extra Skript als Fallback sofort wieder einspielen kann, falls das Löschen zu Problemen führen sollte.

Es wäre also super, wenn man in der CSV eine Auflistung aller Benutzeranmeldenamen und die dazugehörigen SMTP Adressen bekommt, die gelöscht worden sind.

Das Skript ist wie folgt aufgebaut:

#Abteilung, Firma und SMTP Domäne definieren
$abteilung = "XY"  
$alteFirma = "Testfirma"  
$SMTP = "*@test.de"  

#Mitarbeiter der angegebenen Abteilung u. Firma suchen sowie Export in CSV
$Mitarbeiter = Get-User -WarningAction SilentlyContinue -ResultSize unlimited | ?{$_.Department -eq $Abteilung -and $_.Company -eq $alteFirma} | select SamAccountName

##Hier soll der CSV-Export stehen Bsp.##
<#$mitarbeiter |  export-csv C:\Temp\SMTPFallback.csv –NoTypeInformation#>


#User filtern
foreach($user in $Mitarbeiter ){

#SMTP Adressen bei den ermittelten Usern entfernen
Get-Mailbox -ErrorAction SilentlyContinue $user.SamAccountName | %{$_.EmailAddresses | ?{$_ -like $SMTP -and !$_.IsPrimaryAddress}} | %{Set-Mailbox $user.SamAccountName -EmailAddresses @{Remove=$_.ProxyAddressString}}
}
Write-Host "Die SMTP Adressen der Domäne '$SMTP' wurden bei den Mitarbeitern der Abteilung $abteilung entfernt." -ForegroundColor Green | Format-Table -AutoSize  

Vielleicht hat einer von Euch eine Idee, wie das am einfachsten zu realisieren ist, sodass es immer noch übersichtlich bleibt. Das Skript soll im besten Fall auch vom Helpdesk verstanden werden und anwendbar sein.

Besten Dank im Voraus!

Content-ID: 7894315981

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

Printed on: October 11, 2024 at 02:10 o'clock

emeriks
emeriks Jul 19, 2023 updated at 08:15:57 (UTC)
Goto Top
Hi,
dafür musst Du nur den Block

%{Set-Mailbox $user.SamAccountName -EmailAddresses @{Remove=$_.ProxyAddressString}}

erweitern, sodass diese Informationen auch abgespeichert werden.
z.B. zunächst einmal nur auf Console ausgeben

%{
  Try {
    Set-Mailbox $user.SamAccountName -EmailAddresses @{Remove=$_.ProxyAddressString}
    $user.SamAccountName + "`t" + $_.ProxyAddressString  
  }
  Catch {}
}

E.
CargoluxPilot748
CargoluxPilot748 Jul 20, 2023 updated at 08:08:40 (UTC)
Goto Top
Hi Emeriks,

das hat geklappt, danke Dir! Ich konnte die Werte nun in eine Variable speichern. Jetzt habe ich nur noch das Problem, dass er mir lediglich die "length" der gespeicherten Werte in der CSV-Datei angibt.

Wenn ich sie mit "Out-File" speichere, dann funktioniert es. Allerdings hat diese dann nicht das Format, um den SamAccountName und die ProxyAddressString wieder per Import-Befehl aufzurufen, um die Einstellungen rückgängig zu machen.

So sieht es in der File aus:

DMRsmtp:1212121@test.de

Und so kann ich mir die Daten wieder importieren und rückgängig machen, wenn ich die File händisch anpasse:

"SamAccountName", "ProxyAddressString"  
"DMR",	"sda@test.de"  
"DMR",	"sda1@test.de"  
"TD_DR", "test2212@test.de"  

Im Grunde würde es reichen, wenn alle Werte wie in einer CSV mit Anführungsstrichen und Kommas geteilt sind, damit die Beziehungen verstanden werden. Gibt es da eine Möglichkeit oder ist die Lösung vielleicht doch einfacher, als ich denke?
emeriks
emeriks Jul 20, 2023 updated at 08:39:39 (UTC)
Goto Top
Da ich ja nicht weiß, wie Dein Code aktuell aussieht, kann ich nicht sagen, was Du ändern müsstest.

Wenn man angibt:
$Wort = "Hallo"  
$Wort | Out-File blablabla
dann landet in blablabla auch nur
Hallo
Wenn Du mit Out-File aber
"Hallo"
haben willst, dann musst Du das auch so ausgeben. z.B.
"""$Wort""" | Out-File blablabla  
oder
"""" + $Wort + """" | Out-File blablabla  
Es gibt auch noch andere Möglichkeiten.
CargoluxPilot748
CargoluxPilot748 Jul 20, 2023 at 08:53:42 (UTC)
Goto Top
Im Endeffekt habe ich nur Deinen Code ergänzt und die foreach Schleife in eine Variable namens $Backup gepackt.
    #User filtern
    $Backup = foreach($user in $Mitarbeiter ){
    #SMTP Adressen bei den ermittelten Usern entfernen
    Get-Mailbox -ErrorAction SilentlyContinue $user.SamAccountName | %{$_.EmailAddresses | ?{$_ -like $SMTP -and !$_.IsPrimaryAddress}} | %{Set-Mailbox $user.SamAccountName -EmailAddresses @{Remove=$_.ProxyAddressString}
    $user.SamAccountName +"`t" + $_.ProxyAddressString  
    }
 
    $Backup | Out-File  C:\Temp\SMTPFallback.csv
}

Diese beinhaltet einmal den SamAccountName und die dazugehörige SMTP-Adresse des Mitarbeiters, die entfernt wurde.

Jetzt muss nur noch das Format stimmen, damit ich die Daten wieder über import-CSV einlesen kann. Wenn die SMTPFallback.csv korrekt gepflegt ist (wie oben im zweiten Code), funktioniert es auch problemlos, die Änderung mit folgendem Skript rückgängig zu machen:

#Fallback Datei einlesen
$SMTPFallbackCSV = import-csv C:\Temp\SMTPFallback.csv

#Daten in die Umgebung zurückspielen
foreach ($user in $SMTPFallbackCSV) {

    # Firmennamen bei den ermittelten Usern ändern
    Set-Mailbox -Identity $user.SamAccountName -EmailAddresses @{Add=$user.ProxyAddressString}}
}
emeriks
emeriks Jul 20, 2023 at 09:02:30 (UTC)
Goto Top
Und was ich schon geschrieben habe bekommst Du jetzt nicht adaptiert?

Wie müsste
$user.SamAccountName +"`t" + $_.ProxyAddressString    
aussehen, damit es dem
"""$Wort"""  
oder dem
"""" + $Wort + """"  
entspräche?
CargoluxPilot748
CargoluxPilot748 Jul 20, 2023 updated at 09:20:04 (UTC)
Goto Top
Im Grunde ja so: """+$user.SamAccountName"""+ "`t" + """ + $_.ProxyAddressString+"""

Er erkennt in der Datei allerdings keine Anführungsstriche. Macht also im Grunde keinen Unterschied, ob mit oder ohne.

Glaube, das liegt auch daran, dass $Backup ja eben den SamAccountName UND die ProxyAddressString beinhaltet.

Sieht in der Out-File CSV Datei dann schön aus:

TD_DR	smtp:233223@test.de

Nur kann ich sie so nicht importieren. Dafür müsste sie das Format einer Export-CSV-Datei haben:

"SamAccountName", "ProxyAddressString"  
"TD_DR",	"233223@test.de"  

Vielleicht habe ich gerade auch einfach einen kompletten Denkfehler....
emeriks
emeriks Jul 20, 2023 at 09:21:21 (UTC)
Goto Top
"""" + $user.SamAccountName + """" + ", " + """" + $_.ProxyAddressString.Split(":")[1] + """"  
oder
"""" + $user.SamAccountName + """, """ + $_.ProxyAddressString.Split(":")[1] + """"  
oder
"""$($user.SamAccountName)"", ""$($_.ProxyAddressString.Split(":")[1])"""  

Ich habe in
$_.ProxyAddressString.Split(":")[1]  
geändert, damit in der Ausgabe das "smtp:" weggelassen wird.
CargoluxPilot748
CargoluxPilot748 Jul 20, 2023 at 09:27:01 (UTC)
Goto Top
Das scheint nur in der Konsole zu funktionieren. Mit einem Out-File in eine CSV Datei wird es nämlich so abgelegt:
"+@{SamAccountName=TD_DR}.SamAccountName+"	smtp:eewwe@test.de  

Es muss aber in der Datei passen, damit ich sie wieder ordnungsgemäß importieren kann.
CargoluxPilot748
CargoluxPilot748 Jul 20, 2023 at 09:27:55 (UTC)
Goto Top
In der Konsolen-Ausgabe sieht es bei mir auch so aus:

[PS] C:\Users\admin_Td_dr>$Backup
"TD_DR", "AA@test.de"  
emeriks
emeriks Jul 20, 2023 at 11:46:13 (UTC)
Goto Top
Keine Ahnung, was Du da machst. Ohne den aktuellen Code, welchen Du da nutzt, kann ich das nicht bewerten.

Ich habe keinen Schimmer, wie aus
"TD_DR", "AA@test.de"
auf der Console dann
"+@{SamAccountName=TD_DR}.SamAccountName+" smtp:eewwe@test.de
in der Datei werden soll.
CargoluxPilot748
CargoluxPilot748 Jul 20, 2023 at 13:04:59 (UTC)
Goto Top
Hatte mich auch gewundert. Habe dann festgestellt, dass die Datei im Hintergrund geöffnet war - sie somit nicht mehr aktualisiert werden konnte und nach jedem Ausführen auf altem Stand blieb. Mit dem aktuellen Code habe ich es nun geschafft, dass die Ausgabe wie folgt aussieht:

"DMR", "1212@test.de"  
"TD_DR", "sada@test.de"  
"TD_DR", "halllo@test.de"  

So sieht der Code aktuell aus:

    #User filtern
    $Backup = foreach($user in $Mitarbeiter ){
    
    # SMTP Adressen bei den ermittelten Usern entfernen
    Get-Mailbox -ErrorAction SilentlyContinue $user.SamAccountName | %{$_.EmailAddresses | ?{$_ -like $SMTP -and !$_.IsPrimaryAddress}} | %{Set-Mailbox $user.SamAccountName -EmailAddresses @{Remove=$_.ProxyAddressString}
    
    
    
    """$($user.SamAccountName)"", ""$($_.ProxyAddressString.Split(":")[1])"""    
    }

    $Backup | Out-File C:\Temp\SMTPFallback.txt 
 
}

Das passt soweit. Im Grunde muss jetzt nur noch "SamAccountName","ProxyAddressString" an erster Stelle in der Datei stehen, damit sich der Code problemlos in eine CSV-Datei umwandeln lässt und die Daten wieder eingelesen werden können.

Hast Du da vielleicht noch eine Idee?
emeriks
emeriks Jul 20, 2023 at 13:11:28 (UTC)
Goto Top
Du veralberst mich jetzt, oder?

Im Grunde muss jetzt nur noch "SamAccountName","ProxyAddressString" an erster Stelle in der Datei stehen
Dann lass es vorher reinschreiben.
CargoluxPilot748
CargoluxPilot748 Jul 20, 2023 at 13:13:57 (UTC)
Goto Top
Hab ich natürlich schon getestet. Nur dann wird plötzlich alles wieder in einer Zeile ausgegeben, was wiederum das falsche Format ist...

Irgendwelche Operatoren, die einen Zeilenumbruch bewirken sollen, haben mir bisher auch nicht weitergeholfen.
emeriks
Solution emeriks Jul 20, 2023 at 13:25:41 (UTC)
Goto Top
    #User filtern
    $Backup = {
"SamAccountName","ProxyAddressString"  
foreach($user in $Mitarbeiter ){
    ....

    }
    $Backup | Out-File C:\Temp\SMTPFallback.txt 
}
Oder
    #User filtern
    $Backup = @()
$Backup += """SamAccountName"", ""ProxyAddressString"""  
foreach($user in $Mitarbeiter ){
    ....

  $Backup += """$($user.SamAccountName)"", ""$($_.ProxyAddressString.Split(":")[1])"""  

}
$Backup | Out-File C:\Temp\SMTPFallback.txt 
7907292512
Solution 7907292512 Jul 20, 2023 updated at 14:04:49 (UTC)
Goto Top
Moin.
So ein String-Gebastel macht doch heute keiner mehr, schon gar nicht wenn es eh eine CSV werden soll.
Wofür ist PowerShell objektorientiert?! Also nutze man es auch ...
#Abteilung, Firma und SMTP Domäne definieren
$abteilung = "XY"    
$alteFirma = "Testfirma"    
$SMTP = "*@test.de"    

#Mitarbeiter der angegebenen Abteilung u. Firma suchen sowie Export in CSV
$users = Get-User -Filter "Department -eq '$Abteilung' -and Company -eq '$alteFirma'"  

# jeden Mitarbeiter durchlaufen
foreach($user in $users){
     # mails filtern
     $mails = Get-Mailbox -ErrorAction SilentlyContinue $user.SamAccountName | %{$_.EmailAddresses | ?{$_ -like $SMTP -and !$_.IsPrimaryAddress} | select -Expand ProxyAddressString}
     # jede mail verarbeiten
     foreach($mail in $mails){
          # mail entfernen
          Set-Mailbox $user.SamAccountName -EmailAddresses @{Remove=$mail}
          # log schreiben
          $user | select SamAccountName,@{n='Mail';e={$mail -replace '^smtp:'}} | export-csv .\cleaned_users.csv -delimiter ";" -NoType -Encoding UTF8 -Append  
     }
}
Write-Host "Die SMTP Adressen der Domäne '$SMTP' wurden bei den Mitarbeitern der Abteilung $abteilung entfernt." -ForegroundColor Green  
Gruß siddius
emeriks
emeriks Jul 20, 2023 at 14:03:59 (UTC)
Goto Top
Ich schrieb ja bereits, dass es andere Möglichkeiten gäbe.
CargoluxPilot748
CargoluxPilot748 Jul 20, 2023 at 18:40:09 (UTC)
Goto Top
Hat mir weitergeholfen. Besten Dank Euch!