Top-Themen

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, 1418 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
Sicherheit
Benötige Hilfe bei einer Definition
Frage von D1Ck3nSicherheit1 Kommentar

Hallo Leute, ich versuche momentan einen vorgegebenen Katalog mit Fragen zu der Informations-Sicherheit verständlich in einer Dokumentation festzuhalten, aber ...

Server-Hardware
Benötige Hilfe für Serverauswahl
gelöst Frage von Tim.KramerServer-Hardware14 Kommentare

Hallo zusammen, ich brauche eure Hilfe. Seit kurzer Zeit arbeite ich für eine neue Firma und dort existiert so ...

Entwicklung
Benötige Hilfe bei Regular Expression
gelöst Frage von Thomas91Entwicklung6 Kommentare

Hallo, ich benötige hilfe bei einem Regularen Ausdruck: dieser sollte wenn möglich ohne /ig auf zwei Zeilen einen treffer ...

Microsoft Office
Prüfen ob string im Tabellenblatt vorhanden
gelöst Frage von thomas1972Microsoft Office3 Kommentare

Hallo, ich lasse mit einem Script Teile eines Tabellenblattes suchen/ersetzen) Nur kommt es vor, dass gewisse Zeichen nicht vorhanden ...

Neue Wissensbeiträge
Internet

USA: Die FCC schaff die Netzneutralität ab

Information von Frank vor 14 StundenInternet2 Kommentare

Jetzt beschädigt US-Präsident Donald Trump auch noch das Internet. Der neu eingesetzte FCC-Chef Ajit Pai ist bekannter Gegner einer ...

DSL, VDSL

ALL-BM200VDSL2V - Neues VDSL-Modem mit Vectoring von Allnet

Information von Lochkartenstanzer vor 17 StundenDSL, VDSL1 Kommentar

Moin, Falls jemand eine Alternative zu dem draytek sucht: Gruß lks

Windows 10

Microsoft bestätigt DMA-Policy-Problem in Win10 v1709

Information von DerWoWusste vor 17 StundenWindows 10

Wer sein Gerät mit der DMA-Policy absichert, bekommt evtl. Hardwareprobleme in v1709 von Win10. Warum? Weil v1709 endlich "richtig" ...

Verschlüsselung & Zertifikate

Die Hölle friert ein weiteres Stück zu: Microsoft integriert OpenSSH in Windows

Information von ticuta1 vor 21 StundenVerschlüsselung & Zertifikate

Interessant Die Hölle friert ein weiteres Stück zu: Microsoft integriert OpenSSH in Windows SSH-Kommando in CMD.exe und PowerShell

Heiß diskutierte Inhalte
Netzwerkmanagement
Mehrere Netzwerkadapter in einem PC zu einem Switch zusammenfügen
Frage von prodriveNetzwerkmanagement21 Kommentare

Hallo zusammen Vorweg, ich konnte schon einige IT-Probleme mit Hilfe dieses Forums lösen. Wirklich klasse hier! Doch für das ...

Hardware
Links klick bei Maus funktioniert nicht
gelöst Frage von Pablu23Hardware16 Kommentare

Hallo erstmal. Ich habe ein Problem mit meiner relativ alten maus jedoch denke ich nicht das es an der ...

Windows Server
Anmeldung direkt am DC nicht möglich
Frage von ThomasGrWindows Server16 Kommentare

Hallo, ich habe bei unserem Server 2016 Standard ein Problem. Keine Ahnung wie das auf einmal passiert ist. Ich ...

TK-Netze & Geräte
VPN-fähige IP-Telefone
Frage von the-buccaneerTK-Netze & Geräte14 Kommentare

Hi! Weiss noch jemand ein VPN-fähiges IP-Telefon mit dem man z.B. einen Heimarbeitsplatz gesichert anbinden könnte? Habe nur einen ...