Archiv der Kategorie: Scripts

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

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

Fehlerhafte Absenderadressen in Office365 Exchange – Lösung

Problem:
Aus dem Active Directory nach Office 365 exportierte Benutzer haben als erste E-Mail-Adresse nicht die gewünschten „Domänenerweiterungen“, sondern Adressen nach dem Muster

Benutzername@MeineFirma.onmicrosoft.com
und zusätzlich
Benutzername@wunschdomain.at

Mails können an beide Adressen versandt bzw. empfangen werden, beim Versenden wird aber die unerwünschte
Benutzername@MeineFirma.onmicrosoft.com
als Absenderadresse verwendet, was nicht nur etwas ungünstig wirkt, sondern bei manchen als SPAM klassifiziert wird.

Ursache:
Während der Synchronisierung der Benutzer aus Active Directory mittels Synchronization Service Manager bzw. Azure AD Connect werden auch alle Attribute synchronisiert. Dazu zählt auch das Feld „E-Mail“.
Ist dieses Feld leer, dann wird nach der Synchronisierung automatisch eine Mailbox angelegt nach obigem Muster.

Der Versuch, den Eintrag für den Primären SMTP-Server per PowerShell zu ändern schlägt fehl!
Fehlermeldung:

Fehler bei Vorgang für Postfach "BRGM_TestUser", da es außerhalb des 
Schreibbereichs für den aktuellen Benutzer liegt. Die Aktion 'Set-Mailbox',
'EmailAddresses', kann nicht für das Objekt 'BRGM_TestUser' durchgeführt 
werden, weil dieses Objekt von lokal synchronisiert wird. Diese Aktion sollte
lokal für das Objekt durchgeführt werden.

——————————– EXKURS – ist zur Problemlösung völlig uninteressant                    ——————-

Zur Info – und damit ich es selber schneller finde beim nächsten Anlass:

1.) PowerShell-Script, um alle User inkl. einschlägiger Attribute in ein csv zu exportieren:
HINWEIS: PowerShell als Administrator starten und folgenden Befehl absetzen:
Set-ExecutionPolicy Unrestricted

$session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri "https://outlook.office365.com/powershell-liveid/" -Credential $cred -Authentication Basic -AllowRedirection
 Import-PSSession $session
 Get-Mailbox -Resultsize Unlimited | Select Alias, UserPrincipalName, WindowsEmailAddress | Export-Csv "C:\off365\user.csv"

2.) csv entsprechend ändern – WICHTIG: Felder MÜSSEN mit KOMMA (NICHT SEMIKOLON) getrennt sein!!!

Recipient PrimaryEmail AliasEmail
edi.mustermann edi.mustermann@MeineSchule.at edi.mustermann@MeineSchule.onmicrosoft.com

3.) Das PowerShell-Script, das mit den Daten aus dem .csv die Primary SMTP-Address ändert:

$Recipients = Import-Csv C:\off365\User.csv
Foreach ($Mailbox in $Recipients)
{
Set-Mailbox -Identity $Mailbox.Recipient -EmailAddresses $Mailbox.PrimaryEmail,$Mailbox.AliasEmail 
}

——————————————————— EXKURS – ENDE  ——————————————————–

Lösung:
Das entsprechende Attribut „E-Mail“ muss direkt in Active Directory am DC für den jeweiligen User geändert werden! (Im FachChargon würde das dann „On Premises“ genannt werden)
Danach wird es automatisch synchronisiert und die Einträge stimmen auch in Office 365.

Nachdem das für ein paar Hundert User nicht manuell durchführbar ist, hier ein VBScript, mit dem im Bulk – also massenhaft – Benutzern das Attribut eingetragen wird:
(Quelle: Scripting Guys und ein paar Extrazeilen)

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 

objCommand.CommandText = "SELECT name, distinguishedName FROM 'LDAP://OU=Schueler,OU=Benutzer,DC=MeineSchule,DC=at' WHERE objectCategory='user'"

Set objRecordSet = objCommand.Execute

objRecordSet.MoveFirst

Do Until objRecordSet.EOF

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

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

		    objUser.Put "mail", objRecordSet.Fields("Name").Value & "@meineDomain.at" 
		    objUser.SetInfo

    objRecordSet.MoveNext

Loop

Verwendung:
Auf einen DomänenController als „Emailer.vbs“ speichern und die Einträge an die eigene Domäne anpassen!
(Zeile 11 und Zeile 24)
Abschließend in einer Command-Shell mit
cscript Emailer.vbs
starten.

Die Benutzernamen schwirren dann über den Bildschirm – und nach wenigen Sekunden haben alle Benutzer den gewünschten Eintrag im Feld E-Mail im AD. Nach der nächsten Synchronisierung dann auch in Office 365.

In Office 365 bleiben weiterhin beide zu Beginn genannten Mailadressen erhalten, auch am Loginnamen ändert dies nichts! Lediglich der Eintrag für den Primary SMTP-Server (=Absendeadresse) wird geändert.

 

Massenlizenzierung in Office365 mit Powershell

Problem:
Nachdem die Benutzer aus dem Active Directory mit dem Synchronization Service Manager bzw. Azure AD Connect mit Office 365 synchronisiert wurden, müssen ihnen noch Lizenzen zugewiesen werden.

Lösung:
Variante 1:
Die Zuweisung von Lizenzen kann in der WebGUI erfolgen.
Checkboxen der betreffenden User auswählen -> Massenaktionen -> Produktlizenzen bearbeiten
[Problem dieser Methode: das dauert bei mehreren Hundert Benutzern vieeel zu lange!!!]

Variante 2 (Empfohlen ab einer größeren Anzahl von Usern):
Die Zuweisung von Lizenzen kann mittels PowerShell erfolgen (empfohlene Methode!):

Vorbereitung:
Am DC, auf dem Azure AD Connect installiert wird, muss zuerst noch eine Kleinigkeit installiert werden (erfordert kein Reboot!)

  1. Microsoft Online Services-Anmelde-Assistenten für IT-Experten RTW
  2. Azure Active Directory-Modul für Windows PowerShell (64-Bit-Version)

1.) Verbindung zum Online Services Modul

Connect-MsolService

Benutzername nach dem Muster Wurstmann@WurstDomain.local eingeben!

 

2.) Eine Abfrage mit den vorhandenen Lizenzen:

Get-MsolAccountSku

get-msolAccountSku1

 

3.) Allen bzw. bestimmten Usern eine UsageLocation zuweisen

Get-MsolUser -All | where {$_.UserPrincipalName -match "@brg-MeineSchule.at"} | Set-MsolUser -UsageLocation "AT"

Der Teil  | where …. | ist optional

Anschließende Kontrolle, ob die Location zugewiesen wurde
:

Get-MsolUser -UserPrincipalName "edi@brg-MeineSchule.at" | Select-Object UsageLocation

 

 

4.) Allen bzw. bestimmten Usern eine Lizenz zuweisen!

Tipp: die Zuweisung von mehreren Lizenzen ist nicht möglich!!!
Daher empfiehlt es sich, in nachfolgender Zuweisung nach Usern zu filtern, die noch keine Lizenz zugewiesen bekommen haben.

where {$_.UserPrincipalName -match […] } ist wieder optional!!!

Get-MsolUser -All -UnlicensedUsersOnly | where {$_.UserPrincipalName -match "NMS_"} | Set-MsolUserLicense -AddLicenses BGbrg-MeineSchule:STANDARDWOFFPACK_IW_STUDENT

Eine Zuweisung für alle User wäre also:

Get-MsolUser -All -UnlicensedUsersOnly | Set-MsolUserLicense -AddLicenses BGbrg-MeineSchule:STANDARDWOFFPACK_IW_STUDENT

Die jeweiligen Vorgänge dauern einige Minuten – abhängig von der Benutzeranzahl – und werden ohne Meldung abgeschlossen. Keine Fehlermeldung = Erfolg!

Office 365 – Benutzernamen haben eine falsche Domain

Problem:
Die Benutzername in Office 365 – insbesonders der Teil hinter dem @ (also der Domänenname) ist nach der synchronisierung nicht wie gewünscht!

NICHT
Benutzername@wunschdomain.at
SONDERN
Benutzername@MeineFirma.onmicrosoft.com

Ursache:
Als Benutzername wird der UPN (der in Active Directory Benutzer und Computer –> rechte Maustaste auf User –> Eigenschaften –> Attribut-Editor –> User Principle Name angezeigt wird) verwendet. Falls sich dieser (bzw. der Domain-Teil) von der in Office365 registrierten Domäne unterscheidet, dann wird stattdessen  @MeineFirma.onmicrosoft.com verwendet.

Lösung:

  • 1.) Active Directory-Domänen und -Vertrauensstellungen -> Rechte Maustaste -> Domäne hinzufügenDomainHinzufügen
  • Den UPN-Suffix für alle User einer OU ändern:
    Alle User markieren -> Eigenschaften ->UPN_Suffix_Ändern

Nach der nächsten Synchronisierung sind die Benutzernamen in der Weboberfläche richtig, und damit können sich die Benutzer dann auch mit dem von uns erwünschten UPN einloggen

 

Abschließend ein VBScript, das massenhaft im Bulk für alle User einer OU und UnterOU die Einträge für den „Benutzer-PrinzipalsNamen-Suffix“ aka UserPrincipalName vornimmt:

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 

objCommand.CommandText = "SELECT userPrincipalName, name, distinguishedName FROM 'LDAP://OU=Schueler,OU=Benutzer,DC=MeineSchule,DC=at' WHERE objectCategory='user'"

Set objRecordSet = objCommand.Execute

objRecordSet.MoveFirst

Do Until objRecordSet.EOF

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

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

		    objUser.Put "userPrincipalName", objRecordSet.Fields("Name").Value & "@meine-schule.at" 
		    objUser.SetInfo

			'wscript.Echo "done"

    objRecordSet.MoveNext

Loop

Verwendung:
Zeile 11 und 25 an die eigene Umgebung anpassen!

Als „userUpdater.vbs“ am DomänenController speichern und in einer Command-Shell mit
cscript userUpdater.vbs
starten.

Adminomat kann in der Version 1.3 auch installierte Software suchen

Seit Version 1.3 kann die von uns entwickelte Software „Adminomat“ auch installierte Software auf Clients im AD anzeigen.

Anlassfall war die Frage, ob eine ausgerollte Software per GPO auch auf allen Clients angekommen ist…
(also etwas sehr häufiges)

Alle anderen wirklich lässigen Funktionen von ADMINOMAT sowie der Download unter

http://www.adminomat.at/produktvergleich/

Und da ein Bild mehr als 1000 Worte sagt:
adminomatAdminomat_DetailsAdminomat_Anzeige

Rollout Geogebra 5 per Gruppenrichtlinie

Nachdem Geogebra 5 per „normale“ Softwareverteilung via Gruppenrichtlinie nicht mehr funktioniert, anbei ein kleines Script, das den msi-Installer einmalig als Startscript ausführt.

Vorgangsweise:
1.) Download des Installers von GeoGebra-Windows-Installer-5-0-47-0.msi

2.) Folgendes Script als Install_Geogebra5.vbs speichern, anpassen (ServerShare – Logdatei) und als Startscript auf die gewünschten Maschinen per GPO einrichten:

on Error resume next
logdatei = "c:\geogebra5.txt"
Set fs = CreateObject("Scripting.FileSystemObject")
If NOT fs.FileExists (logdatei) then


Set WshShell = WScript.CreateObject("WScript.Shell")

'ACHTUNG: alles was auf WshShell.Run folgt, MUSS in EINER ZEILE stehen!!!

WshShell.Run "msiexec.exe /i ""\\dc1\sysvol\brgmattersburg.at\scripts\software\geogebra\GeoGebra-Windows-Installer-5.msi"" /qn ALLUSERS=2  /Lime C:\GeogebraProtokolldatei.txt", 0, True

Set a = fs.CreateTextFile(logdatei, True)
a.WriteLine("z. B: Geogebra 5 Installation am " & now())
a.Close
END IF

oder noch kürzer:

on Error resume next
logdatei = "C:\GeogebraProtokolldatei.txt"
Set fs = CreateObject("Scripting.FileSystemObject")
If NOT fs.FileExists (logdatei) then
  
Set WshShell = WScript.CreateObject("WScript.Shell")
 
WshShell.Run "msiexec.exe /i ""\\dc1\sysvol\brgmattersburg.at\scripts\software\geogebra\GeoGebra-Windows-Installer-5.msi"" /qn ALLUSERS=2  /Lime C:\GeogebraProtokolldatei.txt", 0, True 

END IF

Besitzer und Sicherheitseinstellungen von Ordnern im AD per Skript ändern

Es ist durchaus üblich, dass das Home Directory und der Username in einer Windows Active Directory Domäne ident sind.

Dies kann man dazu nützen, dass man die Berechtigungen automatisiert für diese Ordner neu setzt.

[Das Script hab ich schnell zusammengebastelt/googelt, weil ich bei einem Kunden eine Struktur vorgefunden habe, die dadurch zu einer Katastrophe wurde, dass einerseits Berechtigungen vererbt wurden, andererseits JEDER Vollzugriff hatte und dergleichen mehr…]

Verwendung:
als ChangeBerechtigungen.vbs speichern und dann aus einer command-shell heraus wie folgt starten:

cscript ChangeBerechtigungen.vbs /scharf:[no/yes] /Userordner:\\server\share\home$

Der Flag /scharf lässt einen das Script ohne echte Aktivität einmal ausprobieren…

Was passiert während der Abarbeitung:
es wird für jeden Ordner im angegebenen Userordner geprüft, ob es einen User im AD gibt, der den selben Namen trägt.
Wenn ein User existiert,
– übernimmt die Gruppe der Administratoren den Besitz
– erhält die Gruppe der Administratoren Vollzugriff, der betreffende User darf Ändern
– der betreffende User wird neuer Besitzer des Ordners
Dies alles wird nach unten hin vererbt, sodass danach die Rechte auf den entsprechenden Ordner und alle Unterordner wieder passen sollten.

Ich habe das Script soeben mit 800 Usern getestet und bin ziemlich happy 😉

WICHTIG: Das Script wurde nur unter Windows 7 getestet!!! Ich kann nicht versprechen, ob es auf einem anderen OS läuft!

warntext = warntext & "Dieses Tool verändert den Besitzer von Ordnern und Dateien!" & vbcrlf
warntext = warntext & "Funktionsweise: Es wird für jeden Ordner und Unterordner im Active Directory ""nachgesehen"", ob es einen User" & vbcrlf
warntext = warntext & "mit dem selben Namen gibt!" & vbcrlf
warntext = warntext & "Wenn es eine Übereinstimmung gibt, so wird bei alle Dateien sowie Ordnern in diesem Verzeichnis der Besitzer geändert" & vbcrlf
warntext = warntext & "" & vbcrlf
warntext = warntext & "ACHTUNG! Es werden aktuell hier nur die Ordner aufgelistet." & vbcrlf
warntext = warntext & "Um in den Ordnern die Besitzer tatsächlich zu ändern (nachdem alles kontrolliert wurde), MUSS dieses Script " & vbcrlf
warntext = warntext & "aus einer Commandshell heraus mit wie folgt gestartet werden:" & vbcrlf & vbcrlf  & vbcrlf
warntext = warntext & "BerechtigungenReparieren.exe /scharf:YES /Userordner:H:\meineHomeverzeichnisse\Schueler" & vbcrlf & vbcrlf  & vbcrlf
warntext = warntext & "[wobei H:\meineHomeverzeichnisse\Schueler natürlich für den zu verändernden Ordner steht!!!]" & vbcrlf  
warntext = warntext & "[Tipp: wenn Ordner Leerzeichen haben, dann den Ordnername zwischen zwei "" sezten]" & vbcrlf 
warntext = warntext & "[Tipp2: das Tool funktioniert auch mit Freigaben, also zB \\meinServer\home$\schueler]" & vbcrlf & vbcrlf & vbcrlf
warntext = warntext & "Chefmodus: (Experts only)" & vbcrlf
warntext = warntext & "unten abgebildeten Quellcode mit dem Notepad als BerechtigungenReparieren.vbs speichern und folgendes ändern:" &vbcrlf
warntext = warntext & "in der Zeile mit dem Quelltext //   ' Modus = ""yes""  // muss lediglich das Hochkomma am Beginn gelöscht werden" & vbcrlf
warntext = warntext & "dann kann das Script auch per Doppelklick SCHARF gestartet werden!" & vbcrlf
warntext = warntext & "jetzt wird durch jeden DOPPELKLICK auf diese Datei BerechtigungenReparieren.vbs im jeweiligen Ordner und Unterordner die Berechtigungen geändert!" & vbcrlf & vbcrlf
warntext = warntext & "ACHTUNG: Es wird keine Haftung für etwaige Schäden übernommen!!! Also VORSICHT bei der Verwendung" & vbcrlf & vbcrlf
warntext = warntext & "[Feedback an Edi Pfisterer --> edi@schulnetz.info --> www.schulnetz.info]" & vbcrlf & vbCrLf  & vbcrlf & vbCrLf

Set objFSO = CreateObject("Scripting.FileSystemObject")

dateiname = "Berechtigungsänderungen.txt"

ueberordner = WScript.Arguments.Named.Item("Userordner")
         if len(ueberordner)= 0 then
                  scriptname = Wscript.ScriptFullName
                  ueberordner = objFSO.getparentfoldername(scriptname)
         end if
warntext = warntext & "Aktuelles Verzeichnis: " & ueberordner & vbcrlf & vbcrlf
Modus = WScript.Arguments.Named.Item("scharf")

' Modus = "yes"

 call InDateiSchreiben(warntext)

                        Set objShell = CreateObject("WScript.Shell")
					    objShell.Popup "Es werden nun alle eventuell zu verändernden Ordner einzeln aufpoppen! " & vbcrlf & "Lesen Sie in der Datei Benutzerberechtigungen.txt, die soeben angelegt wurde nach, wie Sie dieses Tool ""scharfstellen""!" & vbcrlf & "Um diese Tool zu stoppen, müssen Sie im Taskmanager die Datei wscript.exe beenden!", 20, "Info"
					    Set objShell = Nothing

call Ordnerliste(ueberordner)

function Ordnerliste(pfad)

        Set objFolder = objFSO.GetFolder(pfad)
        Set colSubfolders = objFolder.Subfolders

        For Each objSubfolder in colSubfolders
      ' msgbox objSubfolder
              on Error resume next

                 vollername = objFSO.GetAbsolutePathName(objSubfolder)

                NT_Benutzer = UserNameIsolieren(vollername)
                if Benutzerabfrage(NT_Benutzer) = 1 THEN
                   if instr(1,modus,"yes",1) = 0 Then  'es wird lediglich eine txt erzeugt, Dateien bleiben unverändert
                        call InDateiSchreiben(vollername)
                        call InDateiSchreiben("USER GIBTS")
                      befehl1 = "icacls " & vollername & " /setowner Administratoren /t /c /l /q "
                      befehl2 = "cacls " & vollername & " /T /G Administratoren:F " & NT_Benutzer & ":C"
                      befehl3 = "icacls " & vollername & " /setowner " & NT_Benutzer & " /t /c /l /q "
                     InDateiSchreiben befehl1
					 InDateiSchreiben befehl2 
					 InDateiSchreiben befehl3

                   Else 

                      befehl1 = "icacls " & vollername & " /setowner Administratoren /t /c /l /q "
                      befehl2 = "cacls " & vollername & " /T /G Administratoren:F " & NT_Benutzer & ":C"
                      befehl3 = "icacls " & vollername & " /setowner " & NT_Benutzer & " /t /c /l /q "

' InDateiSchreiben befehl1
' InDateiSchreiben befehl2 
' InDateiSchreiben befehl3

                      Set objShell = CreateObject("WScript.Shell")
                      objShell.Run "%comspec% /c echo j|" & befehl1, 0, 1
wscript.sleep 10
                      objShell.Run "%comspec% /c echo j|" & befehl2, 0, 1
wscript.sleep 10
                      objShell.Run "%comspec% /c echo j|" & befehl3, 0, 1
wscript.sleep 10

                      call InDateiSchreiben(vollername & " wurde auf den neuen Besitzer " & NT_Benutzer & " geändert!" & vbcrlf)

					   ' Set objShell = CreateObject("WScript.Shell")
					   ' objShell.Popup vollername & " wurde auf den neuen Besitzer " & NT_Benutzer & " geändert!", 5, "Info"
					   ' Set objShell = Nothing

						objFSO.DeleteFile(vollername & "\desktop.ini")

					end If

                end if

         call Ordnerliste(vollername)
        Next

end function

function InDateiSchreiben(inhalt)
  set logbuch1 =objFSO.opentextfile(dateiname, 8, true,0)  ' 8 zum anfügen
                logbuch1.write inhalt & vbcrlf
                logbuch1.close
end function

function UserNameIsolieren(strUsername)
  letzterBackslash = instrRev(strUsername,"\")
  laenge = len(strUsername)
  eigentlicherUsername = right(strUsername, laenge-letzterBackslash)
  'call InDateiSchreiben(eigentlicherUsername)
  UserNameIsolieren = eigentlicherUsername
end function

function benutzerabfrage(strUserName)

		 Set rootDSE = GetObject("LDAP://RootDSE")
		DomainName = rootDSE.Get("defaultnamingcontext")   

		strObjectName = strUserName
		strObjectType = "user"  
		strRootSearch = DomainName    

		Set objConnection = CreateObject("ADODB.Connection")  
		objConnection.Open "Provider=ADsDSOObject;"    
		Set objCommand = CreateObject("ADODB.Command")  
		objCommand.ActiveConnection = objConnection    

		objCommand.CommandText = _      
		"<LDAP://" & strRootSearch & ">;(&(objectCategory=" & strObjectType & ")" & _      
		"(samAccountName=" & strObjectName & "));samAccountName,distinguishedName;subtree"    

		Set objRecordSet = objCommand.Execute    

		If objRecordset.RecordCount = 0 Then      

		benutzerabfrage = 0
		else
		benutzerabfrage = 1
		end if 

objConnection.Close 

end function

msgBox "Ich bin fertig!"