Kategorien
Scripte

AD Import einfach gemacht mit LDIF

CSS Programming Image

AD Import: 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 einer Definition für einen AD Import:

dn: dc=struktur, dc=de
objectclass: organization
objectclass: top
o: struktur

Es existieren zwei grundlegende LDIF Formate die für den AD Import genutzt werden können, 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

Jetzt zur Bearbeitung

' 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

 

Und noch die Kostenstelle verarbeiten

 '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.

Michael Leidig

Kategorien
Scripte

PS leere AD Gruppen ermitteln

Powershell Logo
Powershell Logo

Leere Active Directory-Objekte (Gruppen) sollten gefunden und gelöscht werden. Der Grund ist, weil sie unnötigen Speicherplatz beanspruchen, die Sicherheit gefährden und die Verwaltung erschweren können. Ein aufgeräumtes Active Directory funktioniert schneller und sicherer.

Get-ADGroup -Filter * -Properties Members | where { -not $_.Members} | select Name

Das Cmdlet Get-ADGroup ruft eine Gruppe ab oder führt eine Suche durch, um ein oder mehrere Gruppen aus einem Active Directory abzurufen.

Der Parameter Identity gibt die abzurufende Active Directory-Gruppe an. Sie können eine Gruppe anhand des Distinguished Name (DN), ihrer GUID, ihrer Sicherheitskennung (SID) oder ihres Kontonamens (Security Accounts Manager, SAM) identifizieren.

Um mehr als eine Gruppe zu suchen und anzuzeigen, gibt es die LDAP-Filter-Parameter. Der Parameter Filter verwendet die PowerShell Expression Language, um Abfragezeichenfolgen für Active Directory zu schreiben.

Hier in dem Beispiel erfolgt ein Ausschluss für Gruppen die keine Mitglieder enthalten. Der Anwendungszweck wäre z.B. die Vorbereitung einer Bereinigung an AD Objekten.

Kategorien
Scripte

Powershell und effektive Automatisierung

CSS Programming Image

Einführung

Der wesent­liche Zweck von Power­shell ist die Auto­mat­isierung der System­verwaltung. Von mehreren Computern ist eine Remoteverwaltung gleich­zeitig möglich. Seit der PS in Ver­sion 3.0 ist ein Unter­brechen von Sitzungen und deren Weiterführung von einer anderen Work­station aus möglich.

Enter-PSSession ist ein Befehl in Windows PowerShell, der verwendet wird, um eine Remotesitzung mit einem anderen Computer herzustellen. Mit diesem Befehl können Sie auf einen entfernten Computer zugreifen und Befehle direkt auf diesem Computer ausführen, als wären Sie vor Ort.

In einfachen Worten: Wenn Sie Enter-PSSession verwenden, “betreten” Sie eine andere Computerumgebung, um Befehle darauf auszuführen, als ob Sie direkt davor sitzen würden. Dies ist besonders nützlich für die Verwaltung und Wartung von Remote-Computern in einem Netzwerk.

In der interaktiven Variante startet man in der Powershell durch:

Enter-PSSession 

eine Shell auf dem anderen Rechner und führt dort Kom­mandos aus, so als wäre man an der Konsole der betreffenden Maschine. Für die Automa­tisierung von Aufgaben wird man mehrere parallele Sessions öffnen und über diese Scripts oder Befehle starten.

Kategorien
Scripte

How do I view Active Directory data?

Binäre Darstellung

Active Directory Domain Info ermitteln

Domain Policy Info abfragen, Ausgegeben werden Passwortinformationen und Attribute zur Sicherheit.

Const MIN_IN_DAY = 1440, SEC_IN_MIN = 60
Set objDomain = GetObject("WinNT://domain")
Set objAds = GetObject("LDAP://dc=domain")
Kontrollfeld.Text = ""
intMaxPwdAgeSeconds = objDomain.Get("MaxPasswordAge")
intMinPwdAgeSeconds = objDomain.Get("MinPasswordAge")
intLockOutObservationWindowSeconds = objDomain.Get("LockoutObservationInterval")
intLockOutDurationSeconds = objDomain.Get("AutoUnlockInterval")
intMinPwdLength = objAds.Get("minPwdLength")
intPwdHistoryLength = objAds.Get("pwdHistoryLength")
intPwdProperties = objAds.Get("pwdProperties")
intLockoutThreshold = objAds.Get("lockoutThreshold")
intMaxPwdAgeDays =
 ((intMaxPwdAgeSeconds / SEC_IN_MIN) / MIN_IN_DAY) & " days"
intMinPwdAgeDays =
 ((intMinPwdAgeSeconds / SEC_IN_MIN) / MIN_IN_DAY) & " days"
intLockOutObservationWindowMinutes =
 (intLockOutObservationWindowSeconds / SEC_IN_MIN) & " minutes"
If intLockOutDurationSeconds <> -1 Then
  intLockoutDurationMinutes =
 (intLockOutDurationSeconds / SEC_IN_MIN) & " minutes"
Else
  intLockoutDurationMinutes =
 "Administrator muss manuell gelockte Accounts entsperren"
End If
Kontrollfeld.Text = Kontrollfeld.Text &
"maxPwdAge = " & intMaxPwdAgeDays & vbCrLf
Kontrollfeld.Text = Kontrollfeld.Text &
 "minPwdAge = " & intMinPwdAgeDays & vbCrLf
Kontrollfeld.Text = Kontrollfeld.Text &
 "minPwdLength = " & intMinPwdLength & vbCrLf
Kontrollfeld.Text = Kontrollfeld.Text &
 "pwdHistoryLength = " & intPwdHistoryLength & vbCrLf
Kontrollfeld.Text = Kontrollfeld.Text &
 "pwdProperties = " & intPwdProperties & vbCrLf
Kontrollfeld.Text = Kontrollfeld.Text &
 "lockOutThreshold = " & intLockoutThreshold & vbCrLf
Kontrollfeld.Text = Kontrollfeld.Text &
 "lockOutObservationWindow = " &
intLockOutObservationWindowMinutes & vbCrLf
Kontrollfeld.Text = Kontrollfeld.Text &
 "lockOutDuration = " & intLockoutDurationMinutes & vbCrLf
End Sub
Kategorien
Scripte

How to List Users in Active Directory?

Binäre Darstellung

Aufgabe: Ausgabe von Users Objekten und den dazugehörigen Informationen.

Das beiliegende Script gibt alle Directory Einträge (Objekteigenschaft = USERs) 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.

Der Codeblock

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
Kategorien
Scripte

How to read Active Directory OUs

Binäre Darstellung

Hier gelistet ist der Source Code zu der Prozedur Organisationseinheiten (OU) einer Active Directory Struktur ermitteln. Ausgegeben werden die Organisationseinheiten 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.

Kategorien
Scripte

How to read Active Directory (AD) Groups

AD Icon Graustufen

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 beispiels­weise

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 folgender­maß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, beispiels­weise 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!

Michael Leidig

https://learn.microsoft.com/de-de/dotnet/visual-basic/language-reference/statements/for-each-next-statement

Kategorien
Scripte

How to create Active Directory User

Binäre Darstellung

Benutzer im Active Directory erzeugen

Ein Active Directory Benutzer ist ein Benutzerkonto, das in einer Windows-basierten Netzwerkumgebung über das Active Directory (AD) erstellt und verwaltet wird. Dieses Konto ermöglicht es einem Benutzer, sich an Computern im Netzwerk anzumelden und Ressourcen wie Dateien und Drucker zu nutzen. Das Active Directory speichert Informationen über den Benutzer, einschließlich seines Namens, Passworts und Zugriffsrechten, und ermöglicht die zentrale Verwaltung von Benutzerkonten und deren Berechtigungen in einer Organisation.

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
DomSTR = Domain.Text & "/" & DomSTR2
  Set objAs = adsi.OpenDSObject("LDAP://" &_
  DomSTR, admin.Text, adminpwd.Text, 1)
  Set objUser = objAs.Create("User", "CN=" & sFullname)
  objUser.FullName = sFullname
  objUser.Description = sDescription
  objUser.LastName = sLastName
  objUser.GivenName = sGivenName
  objUser.Put "company", "Company"
  
  objUser.Put "samAccountname", LCase(cAccountname)
  objUser.Put "UserPrincipalName",_
  LCase(cAccountname) & "@" & Domain
  objUser.SetInfo
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.

New-ADUser -Name "h.muster" -OtherAttributes @{'title'="your title";'mail'="h.muster@yourdomain.de"}

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.

Michael Leidig
Kategorien
Scripte

Multiple AD Groups – how to create?

CSS Programming Image

Ziel:

Das Ziel ist die automatisierte Anlage von Active Directory Gruppen für die Datei- und Ordnerberechtigungen. (Multiple AD Groups)

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."

Domainlokale und globale Gruppen sind Konzepte in Active Directory, einem Verzeichnisdienst von Microsoft, der zur Verwaltung von Benutzern, Gruppen und Ressourcen in einer Windows-Domäne verwendet wird. Hier ist der Unterschied zwischen domainlokalen und globalen Gruppen:

  1. Globale Gruppen:
    • Globale Gruppen dienen hauptsächlich zur Verwaltung von Benutzerkonten und Gruppen aus der gesamten Domäne.
    • Sie können Mitglieder aus derselben Domäne und auch Mitglieder aus vertrauenden Domänen enthalten.
    • Globale Gruppen können in andere globale Gruppen derselben Domäne oder in domainlokale Gruppen derselben Domäne eingebettet werden.
    • Sie sind am besten geeignet, um Zugriff auf Ressourcen und Berechtigungen zu verwalten, die auf Domänenebene gelten sollen.
  2. Domainlokale Gruppen:
    • Domainlokale Gruppen werden normalerweise verwendet, um den Zugriff auf Ressourcen und Berechtigungen auf Servern und Ressourcen in derselben Domäne zu steuern.
    • Sie können Mitglieder aus derselben Domäne sowie aus anderen Domänen enthalten.
    • Domainlokale Gruppen können in globale Gruppen und andere domainlokale Gruppen eingebettet werden.
    • Sie sind am besten geeignet, um Zugriff auf lokale Ressourcen, wie z.B. Dateifreigaben auf einem Server, zu steuern.

In der Regel wird eine Organisationsstruktur in Active Directory so aufgebaut, dass globale Gruppen Benutzer zusammenfassen, die ähnliche Aufgaben oder Berechtigungen haben. Diese globalen Gruppen werden dann in domainlokale Gruppen eingebettet, um den Zugriff auf spezifische Ressourcen zu kontrollieren. Diese Struktur bietet Flexibilität bei der Verwaltung von Berechtigungen und erleichtert die Verwaltung von Benutzern und Ressourcen in einer Active Directory-Umgebung.

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!

Michael Leidig

Bei Fragen benutzt das Kontaktformular.

Kategorien
Scripte

How to set Active Directory Profile

Binäre Darstellung

Active Directory set ProfilePath

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.