Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Benötige Hilfe in der Exchange Shell: Zwei Arrays und mit dem ersten prüfen, ob es im zweiten vorhanden ist

Frage Microsoft Exchange Server

Mitglied: Haru777999

Haru777999 (Level 1) - Jetzt verbinden

03.12.2014, aktualisiert 05.12.2014, 1327 Aufrufe, 11 Kommentare

Hallo zusammen

Also, ich lege zwei Arrays in der Exchange Shell wie folgt an (MS Exchange Server 2010):
01.
[array]$accdoms = @(Get-AcceptedDomain | select DomainName | sort DomainName | ft -HideTableHeaders) 
02.
[array]$smtpadr = @(Get-Mailbox | select PrimarySMTPAddress | sort PrimarySMTPAddress | ft -HideTableHeaders)
Das erste Array $accdoms sieht gekürzt so aus und enthält alle accepted Mail-Domains:
01.
abc.ch 
02.
def.ch 
03.
uvw-xyz.ch
Das zweite Array $smtpadr sieht gekürzt so aus und enthält alle Mail Adressen (PrimarySMTPAddress):
01.
uhu@abc.ch 
02.
eule@abc.ch 
03.
audi@def.ch 
04.
fiat@def.ch 
05.
opel@def.ch 
06.
saab@def.ch 
07.
mars@uvw-xyz.ch 
08.
merkur@uvw-xyz.ch
Jetzt möchte ich mit dem ersten Element aus dem ersten Array (quasi $accdoms[0]) prüfen, ob es Mail-Adressen mit dieser Domain (z.B. def.ch) im zweiten Array gibt.
Diese Mail-Adressen sollen grad in ein File geschrieben werden, welches def.ch.txt heissen soll. Je Domain ein File mit dem Domainnamen.txt.
Dabei sollen nur die Mail-Adressen vom Typ "User Mailbox" verarbeitet werden. Leider ist die "DistributionSearchMailbox" auch im zweiten Array drin.
Alles klar?

Was ich u.v.a. versucht habe:
01.
ForEach ($dom in $accdoms) { Get-Mailbox | Where {$_.PrimarySMTPAddress -match "$dom"} | select Name, PrimarySMTPAddress | ft -HideTableHeaders }
Vielen Dank im Voraus!

Grüsse
Haru
Mitglied: ITvortex
03.12.2014 um 17:00 Uhr
Hallo,

soweit so gut, und wieso dann in der ForEach Get-Mailbox?
Du willst das erste Element, wie du schon richtig gesagt hast $accdoms[0], mit jedem Element, $smtpadr[i], vergleichen?
Davon lese ich hier allerdings nicht. Falls ich was übersehen habe ist schon ein langer Tag

Liebe Grüße
ITvortex
Bitte warten ..
Mitglied: colinardo
03.12.2014, aktualisiert 04.12.2014
Hallo Haru,
kein Problem:
01.
$accdoms = Get-AcceptedDomain | select -Expand DomainName | select -Expand Address 
02.
$smtpadr = Get-Mailbox | ?{$_.PrimarySmtpAddress -notmatch '[\{\}]'} | select PrimarySmtpAddress 
03.
$accdoms | %{$dom = $_; $smtpadr | ?{$_.PrimarySmtpAddress.Domain -eq $dom} | %{$_.PrimarySmtpAddress.toString()} | set-content "$dom.txt"}
andere Methode
01.
$accdoms = Get-AcceptedDomain | select -Expand DomainName | select -Expand Address 
02.
$groups = Get-Mailbox | ?{$_.PrimarySmtpAddress -notmatch '[\{\}]'} | select -ExpandProperty PrimarySmtpAddress | group Domain 
03.
$groups | ?{$accdoms -contains $_.Name} | %{$_.Group | set-content "$($_.Name).txt"} 
Grüße Uwe

p.s. was mir bei deinem Codestil aufgefallen ist, ist das Speichern von Daten als pure Strings mit den Format-CMDLEts(format-table, etc.) in den Variablen. Dies bitte in Zukunft unbedingt vermeiden! Normalerweise verwendet man die Format-CMDLets wirklich nur zur Ausgabe in Dateien oder ähnlichem, nicht zum vergleichen etc. Man behält die Daten normalerweise so lange wie möglich als Objekte (ganz wichtige Powershell-Regel ).

-edit- 04.12.2014 18:21 - Code aktualisiert.
Bitte warten ..
Mitglied: Haru777999
04.12.2014, aktualisiert um 09:31 Uhr
Hallo ITvortex

Ja genau, Du hast es richtig verstanden.
Weiter so.
Das foreach kommt halt von der Programmierung mit anderen Sprachen.
Tue mich als Beginner seeeehr schwer mit der PS.

Danke und Gruss
Haru
Bitte warten ..
Mitglied: Haru777999
04.12.2014, aktualisiert um 09:59 Uhr
Hallo Uwe

Besten Dank für Deine Antwort.

Dein 1. Ansatz:
Bemerkungen dazu: Im Array $accdoms habe ich mehrere Zeilen pro Domain. Im Array $smtpadr gibt es keine @. In Zeile 3 ist ein ; (%{$dom = $_;$smtpadr). Geht das? Muss es nicht ein . sein?
Die Meldung von PS beim Ausführen der 3. Zeile lautet:
01.
Method invocation failed because [Microsoft.Exchange.Data.SmtpAddress] doesn't contain a method named 'Split'. 
02.
At line:1 char:45 
03.
+ $accdoms | %{$dom = $_;$smtpadr | ?{$_.Split <<<< ("@")[1] -eq $dom} | out-file "$dom.txt"} 
04.
    + CategoryInfo          : InvalidOperation: (Split:String) [], RuntimeException 
05.
    + FullyQualifiedErrorId : MethodNotFound
Es wird ein einziges leeres File erstellt mit dem Namen abc.local.txt.

Dein 2. Ansatz:
Läuft nur ganz kurz und schreibt leider nichts.

Hier noch meine PS Version:
01.
[PS] C:\temp>$PSVersionTable 
02.
CLRVersion                     2.0.50727.5485 
03.
BuildVersion                   6.1.7601.17514 
04.
PSVersion                      2.0 
05.
WSManStackVersion              2.0 
06.
PSCompatibleVersions           {1.0, 2.0} 
07.
SerializationVersion           1.1.0.1 
08.
PSRemotingProtocolVersion      2.1
Wie weiter?
Grüsse
Haru
Bitte warten ..
Mitglied: colinardo
04.12.2014, aktualisiert um 18:28 Uhr
Hallo Haru,
liegt an deiner verwendeten alten PS Version Version 3.0 sollte es inzwischen schon sein ... , ist für mich als alten PS Hasen halt schon selbstverständlich, denke ich leider nicht immer dran
Das hier sollte auch mit PS 2.0 laufen:
01.
$accdoms = Get-AcceptedDomain | select -ExpandProperty DomainName 
02.
$smtpadr = Get-Mailbox -ResultSize unlimited | ?{$_.PrimarySmtpAddress -notmatch '[\{\}]'} | select -ExpandProperty PrimarySmtpAddress 
03.
$accdoms | %{$dom = $_;$smtpadr | ?{$_.toString().Split("@")[1] -eq $dom} | set-content "$dom.txt"}
In Zeile 3 ist ein ; (%{$dom = $_;$smtpadr). Geht das? Muss es nicht ein . sein?
Nein, das ist schon richtig so das Semikolon trennt einfach die Zeile von einer neuen ohne einen Zeilenumbruch zu machen.

Alles wird gut.
Grüße Uwe
Bitte warten ..
Mitglied: Haru777999
04.12.2014 um 16:32 Uhr
Hey Uwe,
IMHO habe ich für das $smtpaddr in Zeile 02. "-ExpandProperty" weggenommen. So kommt nur noch die PrimarySMTPAddress und die hat ja @.
Vorher kamen die Spalten "Length, Local, Domain und IsValidAddress", aber ohne @.

Resultat: Die Files werden alle geschrieben, sind aber noch leer.
Scheint ein grosser Unterschied in den PS Versionen zu sein, aber ich darf in dieser Firma gar nichts updaten, schon gar nicht auf die Schnelle.

Wie weiter? Danke im Voraus.
Grüsse
Haru
Bitte warten ..
Mitglied: colinardo
LÖSUNG 04.12.2014, aktualisiert 05.12.2014
Ahh jetzt ich seh das Problem bei euch ... die kleinen Unterschiede zwischen den PS-Versionen nerven manchmal echt, sorry für die Umstände Asche auf mein Haupt)
01.
$accdoms = Get-AcceptedDomain | select -Expand DomainName | select -Expand Address 
02.
$smtpadr = Get-Mailbox | ?{$_.PrimarySmtpAddress -notmatch '[\{\}]'} | select PrimarySmtpAddress 
03.
$accdoms | %{$dom = $_; $smtpadr | ?{$_.PrimarySmtpAddress.Domain -eq $dom} | %{$_.PrimarySmtpAddress.toString()} | set-content "$dom.txt"}
und für die andere Variante siehts dann so aus:
01.
$accdoms = Get-AcceptedDomain | select -Expand DomainName | select -Expand Address 
02.
$groups = Get-Mailbox | ?{$_.PrimarySmtpAddress -notmatch '[\{\}]'} | select -ExpandProperty PrimarySmtpAddress | group Domain 
03.
$groups | ?{$accdoms -contains $_.Name} | %{set-content "$($_.Name).txt" -Value $_.Group} 
Grüße Uwe
Bitte warten ..
Mitglied: Haru777999
05.12.2014 um 09:01 Uhr
Hey Uwe
Herzlichen Dank! Beide Varianten tun perfekt!
Man liest sich.
Grüsse
Haru
Bitte warten ..
Mitglied: Haru777999
17.12.2014, aktualisiert um 15:20 Uhr
Hey Uwe

Ich möchte PS gerne auch ein bisschen beherrschen, aber keine Chance.
Verbrate aber leider nur seeeehr viel Zeit. Mit keiner anderen Programmiersprache habe ich mich so schwer getan.
Nun, in der 6. Zeile (3. Zeile in Deiner Variante) möchte ich dem Value $_.Group (ist die PrimarySMTPAddress) noch ein Gleichheitszeichen vorsetzen, in etwa so: =uhu@abc.ch
01.
$mailhost = gc env:computername; 
02.
$equsign = "=" 
03.
if ($mailhost -ieq "MAIL01") { 
04.
	$accdoms = Get-AcceptedDomain | select -Expand DomainName | select -Expand Address; 
05.
	$mgroups = Get-Mailbox | ?{$_.RecipientTypeDetails -ieq "UserMailbox" -and $_.IsMailboxEnabled -ieq "True"} | select -ExpandProperty PrimarySmtpAddress | sort $_.PrimarySMTPAddress | group Domain | sort Name; 
06.
    $mgroups | ?{$accdoms -contains $_.Name} | %{set-content "C:\Temp\zepo\$($_.Name).txt" -Value $eqsign + $_.Group}; 
07.
}
In den Textfiles steht jetzt nur eine Zeile: + Microsoft.PowerShell.Commands.GroupInfo.Group

Geht einfach nicht. Kann gar nichts dort dazwischen setzen, auch nicht "-Value + "=" + $_.Group" oder -Value =$_.Group.
Nochmals vielen Dank.
Haru
Bitte warten ..
Mitglied: colinardo
LÖSUNG 17.12.2014, aktualisiert um 15:58 Uhr
Hallo Haru,
du musst dich bei sowas schrittweise auf der Shell herantasten und dir den Inhalt von $_.Group anzeigen lassen, dann siehst du das es ein Array aus Objekten ist welches natürlich auch als solches behandelt werden will.
So wie deine Beschreibung klingt möchtest du vor jede E-Mail-Adresse ein Gleichheitszeichen setzen. In diesem Fall machst du das so:
$mgroups | ?{$accdoms -contains $_.Name} | %{set-content "C:\Temp\zepo\$($_.Name).txt" -Value ($_.Group | %{"=$_"})}
Du musst also das Array erst auflösen bzw. über jeden Wert mit einer For-Each-Schleife itterieren %{} und entsprechend mit dem Gleichheitszeichen ausgeben ($_.Group | %{"=$_"})
Das $_ repräsentiert dabei bei jedem Schleifendurchlauf den Wert der aktuellen Zeile des Arrays. Das ganze wird in den normalen Klammern erst aufgelöst, und dann an den -Value Parameter übergeben.

Grüße Uwe
Bitte warten ..
Mitglied: Haru777999
17.12.2014, aktualisiert um 16:13 Uhr
Uwe, vielen Dank, es tut!
Ist ja noch kryptischer als Perl...
Grüsse
Haru
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Exchange Server
"Namen prüfen" unter Exchange 2010 (4)

Frage von MiSt zum Thema Exchange Server ...

Windows Server
Exchange SBS 2011 Mails auf Empfang bzw Zustellung prüfen (8)

Frage von Akcent zum Thema Windows Server ...

Festplatten, SSD, Raid
Performancesteigerung des RAID Arrays möglich? (13)

Frage von takvorian zum Thema Festplatten, SSD, Raid ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (19)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...