Das Ziel ist die Anlage von Active Directory Gruppen für die Datei- und Ordnerberechtigungen.
Angelegt wird eine domainlokale und eine globale Gruppe. Beide werden verschachtelt. (globale Gruppe als Mitglied der domainlokalen Gruppe).
Etwaige Benutzerobjekte werden dann im Anschluss (manuell) in die erzeugte globale Gruppe aufgenommen.
Angepasst werden muss je nach Bedarf Ablageort (OU) für eure spezifische Umgebung.
'Lokale und Globale Gruppe anlegen, verschachteln und Beschreibung setzen
Const ADS_GROUP_TYPE_GLOBAL_GROUP = 2
Const ADS_GROUP_TYPE_DOMAIN_LOCAL_GROUP = 4
Const ADS_GROUP_TYPE_UNIVERSAL_GROUP = 8
Const ADS_GROUP_TYPE_SECURITY_ENABLED = &h80000000
Name=InputBox("Gruppennamen?","Userinput")
G_Group = Name + "GLOBAL"
L_Group = Name + "LOCAL"
' GetObject
Set ou = GetObject("LDAP://rootdse")
Set gruppe = ou.Create("group", "cn=" + G_Group)
gruppe.sAMAccountName = G_Group
gruppe.groupType = ADS_GROUP_TYPE_GLOBAL_GROUP_
+ ADS_GROUP_TYPE_SECURITY_ENABLED
gruppe.SetInfo
Set gruppe_G = ou.GetObject("group", "cn=" + G_Group)
' GetObject
Set ou = GetObject("LDAP://rootdse")
Set gruppe = ou.Create("group", "cn=" + L_Group)
gruppe.sAMAccountName = L_Group
gruppe.groupType = ADS_GROUP_TYPE_DOMAIN_LOCAL_GROUP_
+ ADS_GROUP_TYPE_SECURITY_ENABLED
gruppe.SetInfo
Set gruppe_L = ou.GetObject("group", "cn=" + L_Group)
gruppe_L.Add gruppe_G.ADsPath
MsgBox "Gruppen angelegt sowie globale in lokale Gruppe aufgenommen."
Die Ausführung bestimmter Tools erfordert spezielle Rechte (administrativer Art). Ich übernehme keinerlei Gewährleistung für evtl. auftretende Schäden. Sie benutzen das Tool auf eigene Gefahr. Bitte sichern Sie zuvor Ihre Daten!
Diese Prozedur setzt im Active Directory pro Organisationseinheit den Profilpfad aller enthaltener Userobjekte. Der UNC Pfad zu dem Profil wird angegeben. Das Verzeichnis selbst wird gleich dem Anmeldenamen gesetzt. Der LDAP Pfad wird am Anfang aus der Domain extrahiert.
Dim objAs, objUser, sUser, oDomain, oComputer
Dim group As IADsGroup
Dim Container As IADsContainer
Dim user As IADsUser
Dim computer As IADsComputer
Dim ListeOU(1000)
Dim strLDAPQuery ' As String
Dim objCON ' As ADODB.Connection
Dim W$, Anzahl
Dim BS, Ver, CName, WS
Dim Bereich
AnzahlOU = 1
Kontrollfeld.Text = ""
On Error Resume Next
Kontrollfeld.Text = ""
Set objCON = CreateObject("ADODB.Connection")
CONSTRING = "Provider=ADSDSOObject"
objCON.Open CONSTRING
Dim dc(10)
tmp = Domain.Text
i = 1
While (InStr(1, tmp, ".")) <> 0
laenge = Len(tmp)
punkt = InStr(1, tmp, ".")
dc(i) = Left(tmp, punkt - 1) & ","
rest = laenge - punkt
tmp = Right(tmp, rest)
i = i + 1
Wend
dc(i) = tmp
For K = 1 To i
DomSTR2 = DomSTR2 & "dc=" & dc(K)
Next K
DomSTR = Domain.Text & "/" & DomSTR2 & ">"
strLDAPQuery = "
Wie immer, ihr benutzt die Prozeduren auf eigene Gefahr. Ihr benötigt hierfür teilweise Adminrechte. Prüft in einem Testsystem ob alles so funktioniert wie ihr wollt.
Ihr wollt nicht immer wieder die Active Directory (AD)-Benutzer MMC öffnen, herum klicken, Tippfehler machen und zum x-ten Mal ein neues Benutzerkonto erstellen? Wenn dies der Fall ist, ist es Zeit das Hinzufügen eines Benutzers zu automatisieren.
Wie meistens existieren hierfür mehrere Wege, die alle zum Ziel führen. Der Erste ist, einen Benutzer mittels Script anzulegen und die benötigten Attribute mitzugeben. Ein Zweiter Weg ist, einen vorhandenen Benutzer zu kopieren. In dem Fall ist ein Referenzobjekt erforderlich. Die dritte Möglichkeit besteht darin mittels einer csv-Liste die Objekte und Eigenschaften zu übermitteln.
Für welchen Weg ihr euch entscheidet müsst ihr selbst festlegen.
Code
Hier ist der zentrale Source Code zu der Prozedur User anlegen. Anpassen müsst ihr nur Domain, und natürlich eine Userliste bereitstellen.
'User anlegen in der root der Domain
Private Sub mnu_User_Create_Click()
Dim objAs, sUser, sOU, sGroup
Dim Container As IADsContainer
Dim user As IADsUser
Dim objUser
'Variablen belegen
sLastName = cNachname.Text
sGivenName = cVorname.Text
sFullname = sLastName & " " & sGivenName
sDescription = "User"
Set adsi = GetObject("LDAP:")
Dim dc(10)
tmp = Domain.Text
i = 1
While (InStr(1, tmp, ".")) <> 0
laenge = Len(tmp): punkt = InStr(1, tmp, "."):_
dc(i) = Left(tmp, punkt - 1) & ",": rest = laenge - punkt
tmp = Right(tmp, rest): i = i + 1
Wend
dc(i) = tmp
For K = 1 To i
DomSTR2 = DomSTR2 & "dc=" & dc(K)
Next K
Kontrollfeld.Text = Err.Number & " ; " & Err.Description
Err.Clear
Set user = adsi.OpenDSObject("LDAP://" &_
Domain & "/" & "CN=" & sFullname & "," &_
DomSTR2, admin.Text, adminpwd.Text, 1)
Set Container = GetObject(user.Parent)
user.AccountDisabled = False
user.SetPassword (cpassword.Text)
user.SetInfo
If Err.Number = 0 Then cerror =_
"User erfolgreich angelegt" Else cerror =_
Err.Number & " ; " & Err.Description
Kontrollfeld.Text = cerror
Err.Clear
End Sub
Dieses Scriptstück ist inzwischen etwas in die Jahre gekommen.
Inzwischen verwende ich Powershell zur Lösung derartiger Aufgaben. Mit New-ADUser erreicht ihr hier einen besseren Code bei der Umsetzung. Hier nur ein Beispiel.
Es ist auch sehr einfach alle bekannten Attribute bei der Anlage mitzugeben wie Passwort, Standort, Organisation, Homelaufwerk, Gültigkeitszeitraum, Telefondaten, Stadt usw. Toll daran ist, ihr könnt das mit einem einzigen Powershell Befehl umsetzen.
Vorrausetzungen:
Windows PowerShell 5.1 auf eurem Rechner muss vorhanden sein.
Remote Server Administration Tools (RSAT). Dieses Paket installiert das Active Directory PowerShell Modul welches das New-AdUser cmdlet beinhaltet.
Ihr müsst an einem Rechner angemeldet sein, der Mitglied der Domain ist in der ihr die User anlegen wollt.
Der benutzte AD Account muss über die Berechtigungen verfügen Bentzer anzulegen.
Diesen Code verwendet ihr auf eigene Gefahr. Voraussetzung sind entsprechende Berechtigungen auf die AD Struktur. Ich übernehme keine Gewährleistung.
LDIF steht für LDAP Data Interchange Format und ist das Format der Wahl wenn ihr in einer Active Directory Struktur Massenänderungen durchführen wollt.
Ein LDAP-Objekt wird durch mehrere LDIF-Zeilen beschrieben. Am Anfang steht immer der distinguished name dn, der die absolute Position im LDAP-Baum angibt. Es folgen Objektklassen, die definieren, welche Attribute zulässig oder vorgeschrieben sind.
Beispiel:
dn: dc=struktur, dc=de
objectclass: organization
objectclass: top
o: struktur
Es existieren zwei grundlegende LDIF Formate, LDIF Change und LDIF Change. Letzterer enthält die Änderungen an einem Objekt.
Ziel:
Das Script wandelt eine Excel Tabelle in das LDIF Format um, zum weiteren Import in eine Active Directory Struktur.
Private Sub Excel2LDIF_Click()
'LDIF Ausgabe aus Excelliste
Dim oAs, oUser As Object
Dim xlApp As Object
Dim zaehler
Dim ADSI As Object
Dim OUTeil(256) As String
'On Error Resume Next
Set xlApp = CreateObject(pfad_tabelle.Caption)
xlApp.Application.Visible = False
xlApp.Windows(1).Visible = False
On Error Resume Next
With CommonDialog1
.CancelError = True
.Flags = cdlOFNOverwritePrompt
.Filter = "Textdateien (*.LDIF)|*.LDIF"
.ShowSave
If .FileName <> "" Then
F = FreeFile
Open .FileName For Output As #F
End If
End With
' Ermittlung der Anzahl Datensaetze und Prüfung
Fehleranzahl = 0 ' Fehleranzahl
Kontrollfeld.Text = Kontrollfeld.Text & "Prüfung !!!" & vbCrLf
AnzahlDatensaetze = 2
While (xlApp.Worksheets(1).Range("A" & AnzahlDatensaetze).Value) <> ""
If Trim(xlApp.Worksheets(1).Range("C" & AnzahlDatensaetze).Value) = "" Then
Fehleranzahl = Fehleranzahl + 1
End If
If Trim(xlApp.Worksheets(1).Range("D" & AnzahlDatensaetze).Value) = "" Then
Fehleranzahl = Fehleranzahl + 1
End If
If Trim(xlApp.Worksheets(1).Range("E" & AnzahlDatensaetze).Value) = "" Then
Fehleranzahl = Fehleranzahl + 1
End If
If Trim(xlApp.Worksheets(1).Range("G" & AnzahlDatensaetze).Value) = "" Then
Fehleranzahl = Fehleranzahl + 1
End If
AnzahlDatensaetze = AnzahlDatensaetze + 1
Wend
If Fehleranzahl > 0 Then
Antwort = MsgBox("Anzahl fehlerhafter Datensätze: " & Fehleranzahl, vbYesNo + vbExclamation, "Wollen Sie eine LDIF - Ausgabe erstellen?")
If Antwort = vbOK Then
Else
Print #F, Kontrollfeld.Text
Close #F
Unload Form1
Exit Sub
xlApp.Application.Quit
End If
End If
' Start Bearbeitung
zaehler = 2
While (xlApp.Worksheets(1).Range("A" & zaehler).Value) <> ""
'Refresh der Anzeige
Form1.Refresh
Kontrollfeld.Refresh
'Schreibe LDIF
'Variablen belegen
'---------------------------------------------------------------------------
'Variable Werte aus Tabelle --------------------------------------------
Datum = Format$(Now, "yy.mm.dd")
Tag = Right(Datum, 2)
Monat = Mid(Datum, 4, 2)
Jahr = Left(Datum, 2)
Zeit = Format$(Now, "hh:nn:ss")
Min = Mid(Zeit, 4, 2)
St = Left(Zeit, 2)
If zaehler > 9 Then
employeeNumber = "E" & Jahr & Monat & Tag & St & zaehler & "1"
Else
employeeNumber = "E" & Jahr & Monat & Tag & St & Min & zaehler
End If
sn = Trim(xlApp.Worksheets(1).Range("C" & zaehler).Value) 'Nachname
givenName = Trim(xlApp.Worksheets(1).Range("D" & zaehler).Value) 'Vorname
' - berechneter Wert aus Tabelle ---------------------------------------
Print #F, "dn: cn=" & sn & " " & givenName & " " & employeeNumber & "," & "cn=Users,cn=XXXXXX"
Print #F, "cn: " & sn & " " & givenName & " " & employeeNumber
Print #F, "employeeNumber: " & employeeNumber
Print #F, "sn: " & Trim(xlApp.Worksheets(1).Range("C" & zaehler).Value)
Print #F, "givenName: " & Trim(xlApp.Worksheets(1).Range("D" & zaehler).Value)
' Prüfung auf Firma vorhanden wenn ja dann Excelliste wenn nein ="extern"
If UCase(Trim(xlApp.Worksheets(1).Range("H" & zaehler).Value)) = "" Then
Print #F, "Company: EXTERN 'Firma =xxx"
Else
Print #F, "Company: " & UCase(Trim(xlApp.Worksheets(1).Range("H" & zaehler).Value))
End If
Print #F, "Salutation: " & Trim(xlApp.Worksheets(1).Range("B" & zaehler).Value)
OU = UCase(Trim(xlApp.Worksheets(1).Range("E" & zaehler).Value))
K = 1
OUTeil(K) = UCase(Trim(xlApp.Worksheets(1).Range("E" & zaehler).Value)) '(1)
K = K + 1
While (InStrRev(OU, "-")) <> 0
Position = (InStrRev(OU, "-"))
OUTeil(K) = Left(OU, Position - 1)
OU = Left(OU, Position - 1)
K = K + 1
Wend
OU = "OU: ou="
For J = 1 To K - 1
If J = K - 1 Then
OU = OU & OUTeil(J)
Else
OU = OU & OUTeil(J) & ",ou="
End If
Next J
OU = OU & ",o=xxx,cn=xxx"
Print #F, OU
'Kostenstelle
Print #F, "Kostenstelle: " & UCase(Trim(xlApp.Worksheets(1).Range("G" & zaehler).Value)) 'Kostenstelle
' ADS User Typ auswerten -> Base OU bestimmen START
ADOU = UCase(Trim(xlApp.Worksheets(1).Range("K" & zaehler).Value))
Select Case ADOU
Case "1"
ADOU = "OU=Users,"
Case "2"
ADOU = "OU=Users,"
Case "3"
ADOU = "OU=Users,"
Case Else
ADOU = "OU=Users,"
End Select
Print #F, "ADOU: " & ADOU
Print #F, "AD: " & Trim(xlApp.Worksheets(1).Range("I" & zaehler).Value) 'AD Status
Print #F, vbCrLf
zaehler = zaehler + 1
Wend
Close #F
xlApp.Application.Quit
End Sub
Diesen Code verwendet ihr auf eigene Gefahr. Voraussetzung sind entsprechende Berechtigungen auf die AD Struktur. Ich übernehme keine Gewährleistung.
Als Administrator ist es immer mal wieder notwendig in der AD Struktur bestimmte Gruppen zu ermitteln. Sei es zum Abgleich oder zu anderweitigen Analysen.
Hier gelistet ist der Source Code zu der Prozedur Gruppenmitglieder ermitteln. Umgesetzt in VBS, mit entsprechender graphischer Ein- und Ausgabe.
Start
Dim objADAM ' Binding object.
Dim objGroup ' Group object.
Dim objMember ' Member object.
Dim strPath ' Binding path.
Dim dc(10)
' Create the Domain - String
Kontrollfeld.Text = ""
Set rootDSE = GetObject("LDAP://rootDSE")
If Err.Number = 0 Then
DCName = rootDSE.Get("defaultNamingContext")
Kontrollfeld.Text = Kontrollfeld.Text & DCName
Else
Kontrollfeld.Text = Kontrollfeld.Text & "Nicht an Domäne angemeldet."
End If
' Construct the binding string.
strPath = OU.Text
' Bind to object.
Set objADAM = GetObject(strPath)
' Output error if bind fails.
If Err.Number <> vbEmpty Then
Kontrollfeld.Text = Kontrollfeld.Text & "Error: Bind failed." & vbCrLf
End If
' Enumerate groups and members.
objADAM.Filter = Array("group")
For Each objGroup In objADAM
Kontrollfeld.Text = Kontrollfeld.Text &_
"Group: " & objGroup.Name & vbCrLf
For Each objMember In objGroup.Members
Kontrollfeld.Text = Kontrollfeld.Text &_
objMember.samAccountName & ";" & objMember.LastName &_
";" & objMember.GivenName & ";" & objMember.mail & vbCrLf
Form1.Refresh
Kontrollfeld.Refresh
Next
Next
' Output success or error.
If Err.Number <> vbEmpty Then
Kontrollfeld.Text = Kontrollfeld.Text &_
"Error: Enumeration failed." & vbCrLf
Else
Kontrollfeld.Text = Kontrollfeld.Text &_
"Success: Enumeration complete." & vbCrLf
End If
Array mit For-Each-Schleife durchlaufen
Standardmäßig durchlaufen Sie ein Array mit einer For-Schleife, etwa um alle Einträge auf dem Bildschirm auszugeben. Das Array lautet beispielsweise
int[] a={2, 3, 5, 7, 11, 13};
Die For-Schleife lautet dann:
for (int i=0; i<6; i++) System.out.println(a[i]);
Mithilfe einer For-Each-Schleife durchlaufen Sie das Array folgendermaßen:
for (int x : a) // for each x in a
System.out.println(x);
Bei der For-Each-Schleife können Sie nicht auf die Index-Positionen der Einträge zugreifen, und Sie können nur lesend auf die Einträge zugreifen.
Sehr elegant lassen sich For-Each-Schleifen schachteln, um mehrdimensionale Arrays zu durchlaufen, beispielsweise wenn Sie ein mehrdimensionales Array ausgeben möchten.
Die Ausführung bestimmter Tools erfordert spezielle Rechte (administrativer Art). Ich übernehme keinerlei Gewährleistung für evtl. auftretende Schäden. Sie benutzen das Tool auf eigene Gefahr. Bitte sichern Sie zuvor Ihre Daten! Ich übernehme keine Gewähr!
Hier gelistet ist der Source Code zu der Prozedur Organisationseinheiten (OU) einer Active Directory Struktur ermitteln. Ausgegeben werden die Organinsationseinheiten einer Active Directory Struktur. Diese Informationen müsst ihr zuvor der Variablen Domain.Text zuweisen.
Ihr bekommt die Ausgabe in ein Testfeld. Ich denke es ist kein Problem dieses auch in eine Textdatei umzuleiten. Müsstet ihr ergänzen oder die Wahl ermöglichen.
Hier gelistet ist der Source Code zu der Prozedur Organisationseinheiten (OU) einer Active Directory Struktur ermitteln. Ausgegeben werden die Organinsationseinheiten einer Active Directory Struktur.
Die ganze Funktion habe eingebettet in ein VB6 Formular. Dort besteht ein ein eigener Menüpunkt zur Ausführung der Funktion.
Aufgabe: Ausgabe von Objekten und den dazugehörigen Informationen.
Das beiliegende Script gibt alle Directory Einträge (Objekteigenschaft = USER) aus in C:\temp\ad_user_list.csv (CSV – Format) Eingetragen werden müssen die zu durchsuchenden Domains. Es kann auch ein Start in einer bestimmten Organisationseinheit gewählt werden. Das Programm eignet sich für eine regelmäßige Ausgabe über den Task Scheduler, damit liegt immer eine aktuelle Liste der Einträge vor, die entsprechend abgegriffen und weiter verarbeitet werden kann.
Ausgegeben wird:
Anmeldename;
Nachname;
Vorname;
Telefon;
ipPhone;
Email;
Ort;
Strasse;
ADSPfad;
Department;
Division;
Company.
Die Laufzeit ist abhängig von der Domaingröße und den darin enthaltenen Objekten.
Private Sub Form_Load()
'Dimensionierung
Dim objAs, objUser, oDomain
Dim ListeOU(60000)
Dim strLDAPQuery
Dim objCON
Dim i, Bereich(3), DC(10)
AnzahlOU = 1
Open "C:\temp\ad_user_list.csv" For Output As #1
On Error Resume Next
Bereich(0) = ""
Bereich(1) = ""
Bereich(2) = ""
Print #1,
"Anmeldename;
Nachname;
Vorname;
Telefon;
ipPhone;
Email;
Ort;
Strasse;
ADSPfad;
Department;
Division;
Company;
Beschreibung;"
For i = 0 To 2
Set objCON = CreateObject("ADODB.Connection")
CONSTRING = "Provider=ADSDSOObject"
objCON.Open CONSTRING
strLDAPQuery = Bereich(i) &_
";(objectclass=organizationalUnit);samaccountname,adspath;subtree"
Set rs = objCON.Execute(strLDAPQuery)
While Not rs.EOF
ListeOU(AnzahlOU) = rs("adspath")
If InStr(1, ListeOU(AnzahlOU), "User") Then
If InStr(1, ListeOU(AnzahlOU), Mid(Bereich(i), 9, 3)) Then
Set oDomain = GetObject(ListeOU(AnzahlOU))
oDomain.Filter = Array("user")
For Each oUser In oDomain
ADSPfad = oUser.ADsPath
oUser.GetInfo
If oUser.LastName = "" Then
nachname = " "
Else
nachname = oUser.LastName
End If
If oUser.FirstName = "" Then
Vorname = " "
Else
Vorname = oUser.FirstName
End If
If oUser.Get("mail") = "" Then
mail = " "
Else
mail = oUser.Get("mail")
End If
If oUser.department = "" Then
department = "?"
Else
department = oUser.department
End If
If oUser.Get("l") = "" Then
l = " "
Else
l = oUser.Get("l")
End If
If oUser.Get("streetAddress") = "" Then
street = " "
Else
street = oUser.Get("streetAddress")
End If
If oUser.Get("TelephoneNumber") = "" Then
Telefon = " "
Else
Telefon = oUser.Get("TelephoneNumber")
End If
If oUser.Get("ipPhone") = "" Then
ipPhone = " "
Else
ipPhone = oUser.Get("ipPhone")
End If
If oUser.Get("division") = "" Then
division = " "
Else
division = oUser.Get("division")
End If
If oUser.Get("company") = "" Then
company = " "
Else
company = oUser.Get("company")
End If
If oUser.Get("description") = "" Then
beschreibung = " "
Else
beschreibung = oUser.Get("description")
End If
Print #1,Chr(34) &
oUser.Get("SAMAccountname") & Chr(34) & ";" & Chr(34) &
nachname & Chr(34) & ";" & Chr(34) &
Vorname & Chr(34) & ";" & Chr(34) &
Telefon & Chr(34) & ";" & Chr(34) &
ipPhone & Chr(34) & ";" & Chr(34) &
mail & Chr(34) & ";" & Chr(34) &
l & Chr(34) & ";" & Chr(34) &
street & Chr(34) & ";" & Chr(34) &
ADSPfad & Chr(34) & ";" & Chr(34) &
department & Chr(34) & ";" & Chr(34) &
division & Chr(34) & ";" & Chr(34) &
company & Chr(34) & ";" & Chr(34) &
beschreibung & Chr(34) & ";"
Next
End If
End If
AnzahlOU = AnzahlOU + 1
rs.MoveNext
Wend
Next i
Close #1
Unload Form1
End Sub
Der wesentliche Zweck von Powershell ist die Automatisierung der Systemverwaltung. Von mehreren Computern ist eine Remoteverwaltung gleichzeitig möglich. Seit der PS in Version 3.0 ist ein Unterbrechen von Sitzungen und deren Weiterführung von einer anderen Workstation aus möglich.
In der interaktiven Variante startet man durch:
Enter-PSSession
eine Shell auf dem anderen Rechner und führt dort Kommandos aus, so als wäre man an der Konsole der betreffenden Maschine. Für die Automatisierung von Aufgaben wird man mehrere parallele Sessions öffnen und über diese Scripts oder Befehle starten.
Um dir ein optimales Erlebnis zu bieten, verwenden wir Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wenn du diesen Technologien zustimmst, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn du deine Zustimmung nicht erteilst oder zurückziehst, können bestimmte Merkmale und Funktionen beeinträchtigt werden.
Funktional
Immer aktiv
Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
Vorlieben
Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Voreinstellungen erforderlich, die nicht vom Abonnenten oder Nutzer beantragt wurden.
Statistiken
Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt.Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
Marketing
Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.