Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen (A bis Z)

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, 1409 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 ..
Ähnliche Inhalte
Entwicklung
gelöst Benötige Hilfe bei Regular Expression (6)

Frage von Thomas91 zum Thema Entwicklung ...

Exchange Server
gelöst Zweiten Exchange 2013 einrichten (4)

Frage von Judgelg zum Thema Exchange Server ...

Exchange Server
Exchange Server Hilfe (4)

Frage von Judgelg zum Thema Exchange Server ...

Batch & Shell
gelöst Powershell - Dateien aus verschiedenen Arrays - Attribute vergleichen (5)

Frage von Giffas zum Thema Batch & Shell ...

Neue Wissensbeiträge
Ubuntu

Ubuntu 17.10 steht zum Download bereit

(3)

Information von Frank zum Thema Ubuntu ...

Datenschutz

Autofahrer-Pranger - Bewertungsportal illegal

(8)

Information von BassFishFox zum Thema Datenschutz ...

Windows 10

Neues Win10 Funktionsupdate verbuggt RemoteApp

(8)

Information von thomasreischer zum Thema Windows 10 ...

Microsoft

Die neuen RSAT-Tools für Win10 1709 sind da

(2)

Information von DerWoWusste zum Thema Microsoft ...

Heiß diskutierte Inhalte
Router & Routing
Allnet - VDSL2 Modem - SFP (mini-GBIC) (20)

Frage von Dobby zum Thema Router & Routing ...

Monitoring
Netzwerk-Monitoring Software (18)

Frage von Ghost108 zum Thema Monitoring ...

Windows 10
Seekrank bei Windows 10 (17)

Frage von zauberer123 zum Thema Windows 10 ...

Windows Server
gelöst Kopiervorgang schlägt fehl, weil Datei- und Ordnername zu lang sind (14)

Frage von Schroedi zum Thema Windows Server ...