Archiv der Kategorie: Active Directory

Lizenzen allen Mitgliedern einer Gruppe entziehen

Nachdem die „alten“ Lizenzen für österreichs SchülerInnen per 1. Juni entfernt werden sollen, damit die „neuen“ A3-Schülerlizenzen zugewiesen werden können, ist dies ein guter Grund, dies per Powershell zu erledigen.

Eine denkbare Vorgangsweise:
1.) Eine Sicherheitsgruppe erstellen (in meinem Fall „A3_schuelerlizenz“
2.) In Office 365 -> Azure Active Directory Admin Center die Lizenz „Microsoft 365 A3 for students use benefit“ der Sicherheitsgruppe „A3_schuelerlizenz“ zuweisen
3.) die bestehende Lizenz „Office 365 A1 Plus für Schüler und Studenten“ per Powershell den Mitgliedern der Sicherheitsgruppe „A3_schuelerlizenz“ entziehen
Fertig!

Zugehörige Maßnahmen im Powershell

evtl zuvor nötige Maßnahme: Installation der PS-Module:

Install-Module -Name AzureAD

Connect-AzureAD
Install-Module MSOnline

PS C:\Users\administrator.HAKNEUSIEDL\Documents> Connect-MsolService
PS C:\Users\administrator.HAKNEUSIEDL\Documents> Get-MsolAccountSku

AccountSkuId ActiveUnits WarningUnits ConsumedUnits
———— ———– ———— ————-
akwiat:M365EDU_A3_STUUSEBNFT 2280 0 0
akwiat:STANDARDWOFFPACK_IW_FACULTY 500000 0 26
akwiat:STANDARDWOFFPACK_IW_STUDENT 1000000 0 562
akwiat:FLOW_FREE 10000 0 55
akwiat:M365EDU_A3_FACULTY 57 0 52
akwiat:STANDARDWOFFPACK_FACULTY 5000 0 0
PS C:\Users\administrator.HAKNEUSIEDL\Documents> get-msolGroup -SearchString "a3_schuelerlizenz"

ObjectId DisplayName GroupType Description
-------- ----------- --------- -----------
227b5ba5-b797-4a8c-a223-9f6ec92430b5 A3_Schuelerlizenz Security
PS C:\Users\administrator.HAKNEUSIEDL\Documents> Get-MsolGroupMember -GroupObjectId 227b5ba5-b797-4a8c-a223-9f6ec92430b5 | Set-MsolUserLicense -RemoveLicenses akwiat:STANDARDWOFFPACK_IW_STUDENT
PS C:\Users\administrator.HAKNEUSIEDL\Documents>

Sicherheitsgruppen in AD als Mailverteiler in Office 365 nutzen

Nachdem man (bei vernünftiger Strukturierung) alle User innerhalb des Active Directory in einer (oder mehrerer) Sicherheitsgruppen hat, ist der Wunsch naheliegend, diese Gruppen als Mailverteiler zu nutzen.
Diese Gruppen nennen sich dann in Office 365 „E-Mail-aktivierte Sicherheit‎-Gruppe“.

Der Vorteil:
Die Erweiterung dieser Mailverteiler erfolgt ausschließlich „On Premises“, weitere Konfigurationen in der Cloud sind nicht nötig, dh, ein User, der der Sicherheitsgruppe im AD hinzugefügt wird, ist automatisch nach der nächsten Synchronisation Empfänger der Mail-Verteilerliste.

ACHTUNG:
Es werden zur Mails an USER zugestellt, die direkt Mitglied dieser E-Mail-aktivierten Sicherheitsgruppe sind!!!

Mitglieder ein (E-Mail-aktivierten) Sicherheitsgruppe, die ihrerseits Mitglied einer E-Mail-aktivierten Sicherheitsgruppe ist, bekommen kein Mail!!!

Beispiel:
Es gibt 3 EASG (E-Mail-aktivierten Sicherheitsgruppe):

buchhaltung@corona.at
[Members: Hanna, Marie (User)]

consulting@corona.at
[Members: Franz, Werner (User)]

AlleMitarbeiterInnen@corona.at
[Members:
buchhaltung (group)
consulting (group)
Chef (User)
Prokurist (User) ]

—>>>

Ein Mail an „AlleMitarbeiterInnen@corona.at“ erreicht NUR folgende User:
Chef, Prokurist

Die Mitglieder der anderen Gruppen erhalten KEIN MAIL – es wird auch keine Fehlermeldung ausgegeben seitens EXCHANGE!!!!

 

Die Vorgangsweise:
Es gibt in der GUI keine Möglichkeit, einer Sicherheitsgruppe eine Mailadresse zuzuweisen, daher muss man hier einen Umweg beschreiten.
Ich versuche, dies hier möglichst klar und dennoch kurz auf den Punkt zu bringen.

1.) Erweiterte Features aktivieren:

erweiterteFeatures

 

 

 

 

 

2.) Attribute anzeigen lassen:

Attribute

 

 

 

 

 

 

 

 

3.) folgende Attribute ändern:
Anmerkung:
Hier werden nur jene Attribute angeführt, die für die Mailverteilerliste relevant sind! Alle anderen (wie zb distinguishedName, GroupType, member, etc) werden hier NICHT besprochen, da sie durch Anlegen der Gruppe bereits vorhanden sind!!!

NAME WERT (immer einzeilig!) BESCHREIBUNG Pflichtfeld
oder
Optional
 authOrig
[siehe Anmerkungen unten]
 CN=Rudi.Ruessel,OU=CHEF,
OU=Benutzer,
DC=Corona,DC=local
 User (einer oder mehrere), die berechtigt sind, an den Mailverteiler Nachrichten zu senden
Anm: alle anderen können dann nichts mehr versenden
optional
 description Schefs Beschreibung der Gruppe optional
 DisplayName Schefs Anzeigename otional
 mail  Vorgesetzte@Corona.at  Adresse des Verteilers Pflicht
 mailnickname Schefs Kurzname für das Adressbuch optional
 managedBy  CN=Rudi.Ruessel,OU=CHEF,
OU=Benutzer,
DC=Corona,DC=local
 Besitzer der
Gruppe
optional
 msExchHideFromAddressLists  True / False / Nicht gesetzt  Ob die Verteilerliste im Addressbuch angezeigt wird optional
 proxyAddresses  SMTP:Vorgesetzte@Corona.at
smtp:vorgesetzte@Virus.com
smtp:vorgesetzte@StayAtHome
smpt:chef@corona.atWICHTIG:
es muss unbedingt auchsmtp:schueler@
Corona.onmicrosoft.com

enthalten sein

 Liste der zusätzlichen Mailadressen für diese Liste;[Anm.: in meinen Tests musste hier in jedem Fall etwas eingetragen sein – dh, zumindest die Mailadresse mit großem
SMTP:
davor
]
Pflicht

Nachdem diese Werte befüllt wurden (zumindest die Pflichtfelder), wechselt die Gruppe in Office365 nach der nächsten Synchronisation automatisch in den Zustand „E-Mail-aktivierte Sicherheit‎-Gruppe“.

Meine Tests ergaben, dass es mitunter mehrere Stunden dauern kann, bis sich auf alle Ebenen in der Cloud durchgesprochen hat, wenn man Members diesen Gruppen hinzufügt oder entfernt.
Dies geschieht dann aber in allen Apps, dh, auch Teams, die darauf aufbauen, bekommen die Meldung
„x.y wurde der Gruppe hinzugefügt bzw. entfernt“.

Anmerkung zu AuthOrig:

Beim Versuch, dieses Feld zu befüllen, erscheint folgende Meldung:

AuthOrig

 

 

 

 

 

 

 

 

„ADSIEdit: Es wurde kein Editor zum Verarbeiten dieses Attributtyps registriert“

Lösung:
per Script dieses Feld befüllen, danach lässt es sich nach Belieben – so wie alle anderen Felder – unter den Attributen ändern.

Folgendes Script kann als Vorlage verwendet werden – Änderungen müssen davor allerdings gemacht werden (wie angegeben als Kommentar)

'On Error Resume Next
Const ADS_SCOPE_SUBTREE = 2
Const ADS_PROPERTY_APPEND = 3

Set objConnection = CreateObject("ADODB.Connection")
Set objCommand =   CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE 

'###########################################################################
'folgendes an die eigene Infrastruktur anpassen!
'ACHTUNG: es wird das Attribut AuthORIG in ALLEN Gruppen dieser OU befüllt - 
'Änderungen können danach manuell im AD erfolgen....
'ACHTUNG: das MUSS in einer Zeile stehen!
'###########################################################################
objCommand.CommandText = "SELECT userPrincipalName, name, distinguishedName FROM 'LDAP://OU=Testgruppe,OU=Benutzer,DC=Corona,DC=local' WHERE objectCategory='group'"

'###########################################################################
'Ende der nötigen Änderungen
'###########################################################################

Set objRecordSet = objCommand.Execute

objRecordSet.MoveFirst

Do Until objRecordSet.EOF

    Wscript.Echo objRecordSet.Fields("distinguishedName").Value

            Set objUser = GetObject("LDAP://" & objRecordSet.Fields("distinguishedName").Value)

'###########################################################################
' hier den künftigen Besitzer eintragen - oder "irgendwas" und danach im AD ändern
'###########################################################################

neuerBesitzer = "CN=chef,OU=Vorgesetzte,DC=Corona,DC=local"

'###########################################################################
' Ende der nötigen Änderungen
'###########################################################################
objUser.Put "authorig", NeuerBesitzer

 objUser.SetInfo 

    objRecordSet.MoveNext

Loop

Script, um für alle User einer OU den Haken „Kennwort läuft nie ab“ zu setzen

Auch wenn es ein Sicherheitsrisiko darstellt, ist es doch in manchen Umgebungen auf Grund der dort vorhandenen User nötig, Useraccounts so zu konfigurieren, dass das Passwort nie abläuft.

Neben der Möglichkeit, dies über Gruppenrichtlinien abzuarbeiten kann dies natürlich auch per Script geschehen…

Anbei ein VBScript, das die gewünschten Änderungen vornimmt.

Vorgangsweise:
Script als „PasswordNeverExpires.vbs“ auf einem beliebigen Client speichern, Zeile 12 an die gewünschte OU an passen und laufen lassen.
Hinweis: es wird ein Logfile erstellt, das Auskunft über die Änderungen gibt.

'###########################################################################
'# Usage:
'#  als    PasswordNeverExpires.vbs      an beliebiger Stelle auf einem Client speichern
'#
'# Variablen, die geändert werden MÜSSEN
'# ACHTUNG: strOU ist in 'verkehrter' Reihenfolge, dh:
'# strOU = "OU=1A,OU=Schueler,OU=benutzer," steht für alle User,
'# die in der OU=1A sind, die wiederum in der OU=Schueler sind, und diese dann in der OU Benutzer liegt
'# also:
'#
'# Benutzer
'# |__ Schueler
'#    |___ 1A
'#
'# Hier findest Du zusätzliche Infos zu LDAP-Attributen:
'# http://www.computerperformance.co.uk/Logon/LDAP_attributes_active_directory.htm
  
strOU = "OU=1A,OU=Schueler,OU=Benutzer,"   'ACHTUNG auf den Beistrich!!
 
  
'# Ab hier nur mehr für Auskenner veränderbar...
'############################################################################
on error resume next
Dim rootDSE, domainObject
Set rootDSE = GetObject("LDAP://RootDSE")
domainContainer = rootDSE.Get("defaultNamingContext")
Set domainObject = GetObject("LDAP://" & strOU & domainContainer)
  
Set fs = CreateObject ("Scripting.FileSystemObject")
Set outFile = fs.CreateTextFile (".\logfile_ADKonten.txt")
  
exportUsers(domainObject)
  
Set oDomain = Nothing
  
Sub ExportUsers(oObject)
on error resume next
   Dim oUser
   For Each oUser in oObject
      Select Case oUser.Class
         Case "user"
  
            call changeIT(oUser.distinguishedName)
  
         Case "organizationalUnit" , "container"
  
            ExportUsers(oUser)
      End select
   Next
End Sub
  
  

 
sub changeIT(myUser)
'On Error Resume Next
Const ADS_UF_DONT_EXPIRE_PASSWD = &h10000
Set objUser = GetObject("LDAP://" & myuser)

intUserAccountControl = objUser.Get("userAccountControl")
 

        ' Check if "Password Never Expires" already set.
        If Not objUser.userAccountControl AND ADS_UF_DONT_EXPIRE_PASSWD Then
            ' Set bit for "Password Never Expires".
			objUser.Put "userAccountControl", _
			objUser.userAccountControl XOR ADS_UF_DONT_EXPIRE_PASSWD
			
            objUser.SetInfo    
            outfile.WriteLine  myUser & " wurde erfolgreich geaendert!"
        End If
 
end Sub
WScript.Quit

geplanter Task per Gruppenrichtlinie läuft auf Windows 10 nicht

Problem:
Ein Task, der auf älteren Windows-Versionen per Gruppenrichtlinie angelegt wurde, wird auf Windows 10 Clients nicht mehr angelegt.

Fehlermeldung in der Ereignisanzeige des Clients [ANWENDUNG]:
Das Computer „**TASKNAME**“-Einstellungselement im Gruppenrichtlinienobjekt „GRUPPENRICHTLINIENNAME {39E64460-2198-40DC-9EE1-6EBDAC1D7E40}“ wurde aufgrund eines Fehlers nicht angewendet. Fehlercode: „0x80090005 Ungültige Daten“ Dieser Fehler wurde unterdrückt

Ursache:
Windows 10 geht mit Benutzerrechten anders um als ältere Betriebssysteme – wer Näheres wissen möchte, sollte via Google eine Recherche starten

Lösung:
1.) Gruppenrichtlinie für den geplanten Task wie gewohnt erstellen, Feld „%LogonDomain%\%LogonUser%“ unverändert lassen (auch nicht anklicken!), geplanten Task nach Abschluss aller Konfigurationen auf den anderen Registern wie hier dargestellt speichern!

GPO_Anlegen_geplanterTask

2.) Die Gruppenrichtlinie im SYSVOL suchen:
Beispiel:
\\dc2\SYSVOL\contoso.com\Policies\{87EF1792-C05E-458B-A0FF-97D92210FBE3}\Machine\Preferences\ScheduledTasks

3.) die Datei „ScheduledTasks.xml“ mit einem Editor öffnen und folgende Einträge ändern:

runAs = „%LogonDomain%\%LogonUser%“ –> runAs=“S-1-5-18″

<UserId>“%LogonDomain%\%LogonUser%“</UserId> –> <UserId>S-1-5-18</UserId>

Erklärung:
Jeder Standardbenutzer hat eine eigene SID, jene von „NT Autorität\System“ ist eben S-1-5-18.
Dieses Systemkonto verfügt über höchste Rechte, die evtl für das Ausführen des Tasks benötigt werden und hat natürlich kein Passwort.

Eine Auflistung aller anderen „Well known SID“ gibts zb hier

ERGEBNIS:
In der Gruppenrichtlinienverwaltung erscheint nun in der Anzeige bei Benutzer-ID leider „S-1-5-18“, am Windows 10 – Client wird der Task jedoch mit dem Systemaccount eingetragen.

GPO_Anlegen_geplanterTask_Client

Rollout .net Framework 4.7.1 für DigiCheck mit ADMINOMAT

Das für den DigiCheck nötige Programm setzt das .net Framework 4.7.1 voraus, das sich mittels unserer Software ADMINOMAT sehr einfach ausrollen lässt.

Zur Vorgangsweise:

0.) Den Offline-Installer herunterladen  und auf einem Netzwerkshare hinterlegen
1.) ADMINOMAT hier  downloaden
2.) PSEXEC downloaden und in den selben Ordner entpacken, in dem ADMINOMAT gespeichert wurde
3.) ADMINOMAT starten (auf einem beliebigen Rechner im Active Directory mit Domänen-Administratoren-Rechten) 4.) (sehr) kurz warten, bis das Active Directory bzw. der DHCP-Server eingelesen wurde
5.) OU in der Struktur links auswählen -> PSEXEC –>

/V /C „\\server\Share\NDP471-KB4033342-x86-x64-AllOS-ENU.exe“ /q /norestart

[Anm.: der Flag ‚/norestart‘ sollte natürlich weggelassen werden, wenn auf den Clients niemand arbeitet.]

5.) einen Kaffee trinken gehen –> fertig!

Anschließend die lt. Anleitung generierte ITS.Performer(xxx).exe auf ein Sharekopieren und per GPO auf die Clients verteilen.

Mit ADMINOMAT ein GPUPDATE initiieren und fertig wären wir auch schon.

Per Powershell Mails aus Exchange-Boxen entfernen

Es kann vorkommen, dass (zB durch SPAM) Mailboxen auf einem Exchange-Server so übervoll werden, dass ein manuelles löschen nicht mehr durchführbar ist.

In diesem Fall funktioniert folgende Vorgangsweise auf einem Exchange-Server 2007:

  1. Rechte auf den Mailboxen dem Administrator erteilen:Get-Mailbox -ResultSize unlimited | Add-MailboxPermission -User ADMINISTRATOR -AccessRights FullAccess -InheritanceType all
  2. Mails mit dem unerwünschten Inhalt löschen:Get-Mailbox BetroffeneMailbox | Export-Mailbox -ContentKeywords „Diagnosetext“ -DeleteContent

Hinweis:
Es werden die betroffenen Mails sofort gelöscht und nicht in einen Ordner oder in eine andere Mailbox verschoben!

 

KMS für Office 2016

Die Konfiguration des KMS für die Lizenzierung von Office 2016 unterscheidet sich durch nichts von der bereits erfolgten Anleitung für Office 2013.

Bevor sich die Aktivierung starten lässt, ist (zumindest für Server2008R2) ein Update zu installieren, das einen Reboot erfordert (

Die Abfrage, ob der Key erfolgreich hinterlegt wurde bzw. wie viele Clients aktuell über den Schlüsselverwaltungsdienst aktivert werden, erfolgt mit:

C:\Windows\System32\slmgr.vbs -dlv 98EBFE73-2084-4C97-932C-C0CD1643BEA7

User per VBScript aus dem AD in eine .csv exportieren für MAHARA-Import

Der Massenimport via .csv von Usern in MAHARA ist (vor allem, wenn man auf das deutsche Language-Pack umgestellt hat) voll der Pein und Trauer…

Anbei ein Script, dass ausgewählte Schüler anhand ihrer Mitgliedschaft zu einer OU in einer CommandShell ausgibt, die man dann nur noch kopieren muss in eine .csv und importieren…

Speicher als „maharaExport.vbs“ und in einer Commandshell mit
cscript maharaExport.vbs
ausführen lassen…

'On Error Resume Next
Const ADS_SCOPE_SUBTREE = 2
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand =   CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE 

'### hier die gewünschte OU auswählen ######
course = "3A,3B,3C,3D,3E"

courseArr = split(course,",")

'Wscript.Echo "Benutzername;Passwort;E-Mail;Vorname;Nachname;Studenten-ID"
Wscript.Echo "username,password,email,firstname,lastname,studentid"
UserCounter = 20170001

for i = 0 to UBOUND(courseArr)
	objCommand.CommandText = "SELECT name, distinguishedName, sAmAccountname, mail, givenName, SN FROM 'LDAP://OU=" & courseArr(i) & ",OU=Schueler,OU=Benutzer,DC=hak-neusiedl,DC=local' WHERE objectCategory='user'"

	Set objRecordSet = objCommand.Execute

	objRecordSet.MoveFirst

	Do Until objRecordSet.EOF

		Wscript.Echo  chr(34) & objRecordSet.Fields("sAmAccountname").Value & chr(34) & "," & chr(34) & "ASDFASDF" & chr(34) & "," & chr(34) & objRecordSet.Fields("mail").Value & chr(34) & "," & chr(34) & objRecordSet.Fields("givenName").Value & chr(34) & "," & chr(34) & objRecordSet.Fields("SN").Value & chr(34) & "," & chr(34) & UserCounter & chr(34) '& "," & courseArr(i)

		objRecordSet.MoveNext
		UserCounter = UserCounter+1
	Loop

next

per VBScript MailAttribute aus den UserAccounts entfernen

Es war einmal ein Exchange – der dann abgedreht wurde – und die User wurden dann auf Gmail umgesiedelt.

Das lief prima – bis die User auf den Hosted Exchange von OFFICE365 migriert werden sollten… (und es ja onPrime keinen Exchange mehr gab)…

Das folgende Script hat diese Einträge für alle User einer bestimmten OU entfernt – seither klappts mit der Migration wie am Schnürchen…
Als ExchangeAttributeDelete.vbs speichern und direkt am Domänencontroller starten (nach Anpassung an die eigene Domain!)

On Error Resume Next
Const ADS_SCOPE_SUBTREE = 2

Const ADS_PROPERTY_APPEND = 3
Const ADS_PROPERTY_DELETE = 4
Const ADS_PROPERTY_CLEAR = 1 

Set objConnection = CreateObject("ADODB.Connection")
Set objCommand =   CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE 

objCommand.CommandText = "SELECT legacyExchangeDN, name, distinguishedName, sAmAccountname, proxyaddresses FROM 'LDAP://OU=lehrer,OU=Benutzer,DC=gymnasium,DC=at' WHERE objectCategory='user'"

Set objRecordSet = objCommand.Execute

objRecordSet.MoveFirst

Do Until objRecordSet.EOF

    'Wscript.Echo objRecordSet.Fields("distinguishedName").Value
	if len(objRecordSet.Fields("legacyExchangeDN").Value)>= 1  THEN
	Wscript.Echo objRecordSet.Fields("sAmAccountname").Value & " -- " & objRecordSet.Fields("Name").Value

	'# falls man das Script nur für einen User testen möchte:  (ACHTUNG: zweites END IF unten einkommentieren)
	'if objRecordSet.Fields("name").Value = "WUT" then
	'Wscript.Echo objRecordSet.Fields("name").Value

	Set objUser = GetObject("LDAP://" & objRecordSet.Fields("distinguishedName").Value)

	Wscript.Echo objRecordSet.Fields("legacyExchangeDN").Value
	wscript.echo len(objRecordSet.Fields("legacyExchangeDN").Value)

			objUser.PutEx ADS_PROPERTY_CLEAR, "msExchHomeServerName", 0
			objUser.SetInfo

			objUser.PutEx ADS_PROPERTY_CLEAR, "legacyExchangeDN", 0
			objUser.SetInfo

			objUser.PutEx ADS_PROPERTY_CLEAR, "homeMDB", 0
			objUser.SetInfo

			objUser.PutEx ADS_PROPERTY_CLEAR, "homeMTA", 0
			objUser.SetInfo

			objUser.PutEx ADS_PROPERTY_CLEAR, "mDBUseDefaults", 0
			objUser.SetInfo

			objUser.PutEx ADS_PROPERTY_CLEAR, "msExchALObjectVersion", 0
			objUser.SetInfo

			objUser.PutEx ADS_PROPERTY_CLEAR, "msExchMailboxGuid", 0
			objUser.SetInfo

			objUser.PutEx ADS_PROPERTY_CLEAR, "msExchMailboxSecurityDescriptor", 0
			objUser.SetInfo

			objUser.PutEx ADS_PROPERTY_CLEAR, "msExchPoliciesIncluded", 0
			objUser.SetInfo

			objUser.PutEx ADS_PROPERTY_CLEAR, "msExchUserAccountControl", 0
			objUser.SetInfo

			objUser.PutEx ADS_PROPERTY_CLEAR, "msNPAllowDialin", 0
			objUser.SetInfo

			objUser.PutEx ADS_PROPERTY_CLEAR, "ShowInAddressBook", 0
			objUser.SetInfo

			objUser.PutEx ADS_PROPERTY_CLEAR, "textEncodedORAddress", 0
			objUser.SetInfo

			wscript.Echo "erfolgreiche geloescht!" & vbcrlf

	'end if
	end if

    objRecordSet.MoveNext

Loop

per VBScript Einträge im AD aus dem Attribut ProxyAddresses entfernen

Es kann vorkommen, dass in historisch gewachsenen Domänen einzelne (oder alle) User Einträge im AD-Attribut „ProxyAddresses“ haben, die auf einen alten Exchange / Gmail / etc hinweisen.

Dies ist äußerst hinderlich, wenn man diese Benutzer per Azure AD Connect ins OFFICE 365 übertragen möchte, da dieser Eintrag dazu führt, dass Benutzer kein Outlook-Konto in OFFICE365 bekommen.

Die Fehlermeldung lautet dann:

Mailfehler

 
 
 
 
Benutzername       xyz@domain.at    E-Mail-Adresse  Aliase   Anzeigen nicht möglich. Versuchen Sie es noch mal.
 

Die Lösung ist es nun, die Einträge im Attribut „ProxyAddresses“ zu entfernen, was folgendes Script massenhaft erledigen kann:
(als MassenAttributlöscher.vbs speichern und direkt am Domänencontroller ausführen)

On Error Resume Next
Const ADS_SCOPE_SUBTREE = 2
Const ADS_PROPERTY_APPEND = 3
Const ADS_PROPERTY_DELETE = 4
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand =   CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE 

objCommand.CommandText = "SELECT name, distinguishedName, sAmAccountname, proxyaddresses FROM 'LDAP://OU=lehrer,OU=Benutzer,DC=gymnasium,DC=at' WHERE objectCategory='user'"

Set objRecordSet = objCommand.Execute

objRecordSet.MoveFirst

Do Until objRecordSet.EOF

    'Wscript.Echo objRecordSet.Fields("distinguishedName").Value
	if NOT objRecordSet.Fields("proxyaddresses").Value = NULL THEN
	Wscript.Echo objRecordSet.Fields("sAmAccountname").Value & " -- " & objRecordSet.Fields("Name").Value

	'# falls man das Script nur für einen User testen möchte:  (ACHTUNG: zweites END IF unten einkommentieren)
	'if objRecordSet.Fields("name").Value = "DRE" then
	'Wscript.Echo objRecordSet.Fields("name").Value

	arrProxyAddresses = objRecordSet.Fields("proxyAddresses").Value
	Set objUser = GetObject("LDAP://" & objRecordSet.Fields("distinguishedName").Value)

	'### zum Löschen aller Einträge in ProxyAddresses folgendes einkommentieren:
	For Each objItem In arrProxyAddresses

					objUser.PutEx ADS_PROPERTY_DELETE, "proxyAddresses", Array(objItem)
					objUser.SetInfo

	Next

	'### zum Einfügen einer zusätzlichen Adresse folgendes einkommentieren:

				' objUser.PutEx ADS_PROPERTY_APPEND, "proxyAddresses", Array("smtp:" & objRecordSet.Fields("sAmAccountname").Value & "@brg-mattersburg.at" )
				 'objUser.SetInfo

	'### zum Auflisten aller Einträge in ProxyAddresses folgendes einkommentieren:
	For x=0 to UBOUND(arrProxyAddresses)
		wscript.echo arrProxyAddresses(x)

	Next

			wscript.Echo "erfolgreiche gelöscht!" & vbcrlf

	end if
	'end if

    objRecordSet.MoveNext

Loop