Migrate Contacts across Organization

Heute habe ich in einer Testumgebung Migrationen getestet.

Die Testumgebung bestand aus zwei Forests. Verbunden mit transitiven, bidirektionalen Forest-Trusts.
Ich hab dann munter mit ADMT 3.2 migriert: Benutzer, Gruppen PCs und mit Exchange Bordmitteln auch die Postfächer.
Dann wollte ich die Kontakte migrieren und habe nichts gefunden. Nur extrem komplizierte Installationsanleitungen oder teure Software.

Meine Kontakte wurde hauptsächlich wegen eMail verwendet.

Ich hab dann mein Lieblingstool gestartet: Powershell.exe 🙂

$C = Get-ADObject -LDAPFilter "(objectClass=contact)" -Server dc-2.powershell_pub.lan

$C | foreach {
New-MailContact -Name $_.Name -ExternalEmailAddress ($_.targetAddress.Split(':'))[1] -OrganizationalUnit "OU=Contact,DC=powershell_pub,DC=local"
}

Wenn man noch andere Infos migrieren will,  braucht man nur die entsprechenden Infos per Variable in die entsprechenden Parameter „einfüllen“

 

eMail-Adressen exportieren

Zur Spam-Bekämpfung ist es von großem Vorteil, wenn die erste Instanz der MailRoute alle gültigen eMailadressen kennt.

Bei mir ist das ein PostFix welches auf einem Ubuntu-Server läuft.

Folgendes Script wird nun zyklisch per Task-Scheduler auf dem Exchange-Server aufgerufen. Es erstellt ein Text-File und legt dies in „wwwroot“ ab.

Auf dem Linux-Server läuft ein Cron-Job der das File vom Exchange läd, mit dem vorhergehenden vergleicht und PostFix, wenn nötig, durchstartet.

#--------------------------------------------------------------------------------------------------
#
# Skript zum exportieren der aktuell gültigen eMail-Adressen für die SMTP1 (vormals SV10)
# Autor Robert R. 25.01.2012
#--------------------------------------------------------------------------------------------------
# Historie:
# 11.12.2012	Robert R. Accepted-Domains und CustomAttribute6 zum Filtern verwenden
#
#--------------------------------------------------------------------------------------------------
# Variablen und Parameter
#--------------------------------------------------------------------------------------------------

param
	(
	[string]$MailTo = "admin@powershell.local",
	[string]$MailFrom = "admin@powershell.local",
	[string]$File = "C:\inetpub\wwwroot\email.txt",
	[switch]$Sendmail,
	[switch]$Debug,
	[switch]$NoOut
	)

#$NoMailGroup = "MAIL_ALL_NoExternalMails"
$NoMailToAlias = "team-group","root","extest_7133eae530fc4"
$UnwantedDomains = "powershell.local"

#--------------------------------------------------------------------------------------------------
# Module und Pugins
#--------------------------------------------------------------------------------------------------

	$a = (Get-PSSnapin | where {$_.Name -ilike "Microsoft.Exchange.Management.*"} | measure).Count
if ( $a -eq 0 )
	{
	if ( $Debug ) {write-host "Exchange-Plugin loading..."}
	Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010
	}
Import-Module activedirectory

#--------------------------------------------------------------------------------------------------

Set-ADServerSettings -ViewEntireForest $true

# Akzeptierte Domänen in Array kopieren
if ( $DEBUG ) { write-host "Get Accepted Domains" }
$DOMAINs = @()
Get-AcceptedDomain | select DomainName | foreach { $DOMAINs += $_.DomainName.SmtpDomain.tostring() }

# Alle Recipients einsammeln 
if ( $DEBUG ) { write-host "Get Recipients" }
$RCPs = Get-Recipient -resultsize unlimited | select Alias, RecipientTypeDetails, EmailAddresses, GUID, CustomAttribute6

# GUID der Mitglieder aus der Gruppe <$NoMailGroup> in ein Array speichern um diese später zu filtern
#if ( $DEBUG ) { write-host "Get NoMailGroup" }
#$NoMail = @()
#Get-ADGroupMember $NoMailGroup -Recursive | foreach { $NoMail += $_.objectGUID.tostring() }

# Filter-Array umwandeln in Kleinbuchstaben. $attachment wird als temp-Variable verwendet
$attachment = @()
$NoMailToAlias | foreach { $attachment += $_.tolower() }
$NoMailToAlias = $attachment

# Alle eMailadressen werden in dem Array $attachment gespeichert
if ( $DEBUG ) { write-host "Filter List of Recipients" }
$attachment = @()
foreach ( $RCP in $RCPs )
	{
#	Ausfiltern von eMailadressen die nicht extern errichbar sein sollen
	if ( $RCP.RecipientTypeDetails.tostring().tolower() -eq "discoverymailbox" )	{ continue }
	if ( $NoMailToAlias -contains $RCP.Alias.tolower() )							{ continue }
	if ( $RCP.Alias -like "publicfolder*" )											{ continue }
	if ( $RCP.Alias -like "acl_mbx_*" )												{ continue }
#	if ( $NoMail -contains $RCP.GUID )												{ continue }
#	if ( $RCP.Alias.tolower() -eq "MAIL_ALL_NoExternalMails" )						{ continue }
#	if ( $RCP.CustomAttribute6 -ne "" )												{ continue }
	
	
	# eMailadressen des Emängers in die Liste schreiben
	foreach ( $email in $RCP.EmailAddresses )
		{
		$emaildomain = $email.ProxyAddressString.tolower().split("@")[1]
		if ( $email.Prefix -ilike "SMTP" -and $DOMAINs -contains $emaildomain -and
			-not ($UnwantedDomains -contains $emaildomain) )
			{
			if ( $DEBUG ) { Write-Host -NoNewline "." }
			$attachment += $email.SmtpAddress.tolower() + "`tx"
			#$attachment += $email.ProxyAddressString
			}
		elseif ( $DEBUG -and $email.Prefix -ilike "SMTP" ) { Write-Host -NoNewline "!" }
		}
	}

Write-Host ""

if ( -not $Debug )
	{
	remove-item $File
	$attachment | Sort-Object | out-file $File -Encoding ASCII
	}
	

if ( $Sendmail -and -not $Debug)
	{
	Send-MailMessage -To $MailTo -From $MailFrom -subject "email-smtp-adressen" -Body "das sind die emails smtp-adressen" -SmtpServer mailcas-c -Attachments $File
	}
elseif ( -not $NoOut )
	{
	$attachment | Sort-Object
	}

 

GPOs exportieren

Um eine Dokumentation zu erstellen ist es u.U. hilfreich HTML-Reports von GPOs zu erstellen

param
	(
	[string]$Path=$env:tmp
	)

$GPOs = Get-GPO -all
foreach ( $GPO in $GPOs )
	{
	$File = Join-Path -path $Path -ChildPath $(($GPO.DisplayName -replace ("[\W]","")) + ".htm")
	Get-GPOReport -Id $GPO.id -ReportType html -Path $File
	$File = Join-Path -path $Path -ChildPath $(($GPO.DisplayName -replace ("[\W]","")) + ".xml")
	Get-GPOReport -Id $GPO.id -ReportType xml -Path $File
	}

Der Parameter Path wird standardmäßig auf das TMP-Verzeichnis gelegt. Sie können aber jeden beliebigen Pfad dort angeben

Aufruf:
export-gpo.ps1 [-path <Pfad>]

Im Pfad bzw TMP-Verzeichnis werden dann pro GPO eine HTML- und eine XML-Datei erstellt.

120m – Walchensee Galerie

 

 

120-1   120-2

rt-120

Wie man auf den Bildern sehen kann, war ich mit meinem Buddy auf 120m im Walchensee am Tauchplatz Galerie.

Man kann auch sehen, dass wir bei ca. 92m etwas verweilt sind um das Autowrack anzuschauen 🙂

Im 100m Bereich waren wir schon mehrmals aber dies war das zweite mal, dass ich mich zu dieser Tiefe vorgewagt habe.

Wir sind beide langjährige technische Taucher (IANTD Trimix OC und CC) und sind Sommer wie Winter jedes Wochenende beim Tauchen.

Ausgerüstet waren wir jeweils mit 4 Stages (80cft 200Bar) und natürlich einem Rebreather.
Beide verwenden wir ein JJ-CCR auf dem jeder von und mehr als 200 Tauchstunden vorweisen kann.

Impressum

Die Informationen auf dieser Website verstehen sich als „Aussagen an sich“ ohne implizite Garantien jedweder Art. Die bereitgestellten Informationen auf dieser Website wurden sorgfältig geprüft und werden regelmäßig aktualisiert. Jedoch kann keine Garantie dafür übernommen werden, dass alle Angaben zu jeder Zeit vollständig, richtig und in letzter Aktualität dargestellt sind. Dies gilt insbesondere für alle Links zu anderen Websites, auf die direkt oder indirekt verwiesen wird. Alle Angaben können ohne vorherige Ankündigung ergänzt, entfernt oder geändert werden. Außerdem liegt es nicht in unserer Verantwortung, Vorsichtsmaßnahmen zu ergreifen gegen destruktive Programme oder Programmteile wie Viren, Würmer, Trojanische Pferde o.ä., die auf fremden Webservern liegen, die aber möglicherweise durch Links von unserer Website aus erreicht werden. Hiermit distanzieren wir uns ausdrücklich von den Inhalten aller verlinkten Seiten auf unserer Homepage und machen uns diese Inhalte nicht zu eigen. Diese Erklärung gilt für alle angebrachten Links. Die Inhalte und / oder Programme dieser Website sind durch uns urheberrechtlich geschützt. Alle Rechte vorbehalten. Teile dieser Website können Bilder, Texte oder Sounds beinhalten, die dem Urheberrecht Dritter unterliegen. Die Urheberrechtshinweise sind in diesen Fällen an entsprechenden Stellen vermerkt. Informationen auf dieser Website, einschließlich Texten, Bildern und Sound, dürfen nicht, sofern nicht ausdrücklich anders bestimmt, vervielfältigt, transferiert, vertrieben oder gespeichert werden ohne schriftliche Genehmigung des Herausgebers. Modifikationen des Inhalts dieser Website sind ausdrücklich untersagt. Wenn Sie mittels E-Mail oder Formular Kontakt mit uns aufnehmen möchten, sollten Sie wissen, dass wir Ihre persönlichen Daten (Name, Adresse), die Sie uns übermitteln, elektronisch speichern. Wir werden Ihre Daten jedoch nicht an Dritte übergeben. Eine übermittlung an Dritte erfolgt nur mit Ihrer ausdrücklichen Einwilligung, insbesondere soweit die übermittlung zur Erbringung von Ihnen in Anspruch genommener Dienste erforderlich ist oder soweit sonst gesetzlich zulässig. Mit der Nutzung dieser Website und der Abgabe Ihrer persönlichen Daten per E-Mail oder Formular geben Sie Ihre Einwilligung zu der hier beschriebenen Erhebung Ihrer persönlichen Daten. Sie können diese Einwilligung jederzeit widerrufen und die Löschung Ihrer Daten verlangen.

Fragen, Meinungen, Anregungen und Kritik bitte an den Webmaster

 

Die Zusendung von „Spam“ jeglicher Art (z.B. Werbung) ist untersagt! You must not send any kind of „spam“ (e.g. advertising).

…über mich

Hallo,

ich bin Robert und werde hier hauptsächlich PowerShell-Scripte veröffentlichen.

Ich habe mich schon mit ein paar Programmiersprachen und Script-Sprachen gequält.
Seit ein paar Jahren (so schnell vergeht die Zeit) übe ich mich in PowerShell. Tatsächlich empfinde ich PowerShell gegenüber allen anderen, von mir verwendeten Sprachen, als echten Fortschritt.

Als Hobby tauche ich gerne mit meinem Rebreather. Das tue ich fast jedes Wochenende und natürlich im Urlaub. Somit kommt evtl. auch mal ein Artikel über Tauchen 🙂

Wenn jemand meine Scripte brauchen kann, freue ich mich.

Alles was ich hier schreibe spiegelt meine persönliche Meinung oder Erfahrung. Es gibt natürlich keine Garantie, dass alle Scripte fehlerfrei sind und in jeder Umgebung laufen. Jedes der hier veröffentlichten Scripte hat jedoch irgendwo schon seine Dienste geleistet oder tut es immer noch.
Wenn jemand einen Fehler findet, würde ich mich über einen kleinen Hinweis freuen

Viele Grüße

Robert