Kategorien
Scripte

Active Directory read Groups

AD Icon Graustufen

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!

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

Kategorien
Scripte

PS zur Automatisierung nutzen

CSS Programming Image

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.

In der interaktiven Variante startet man 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

PS leere AD Gruppen ermitteln

Prozess Pyramide
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

Excel2LDIF für den Directory Import

CSS Programming Image

Ziel:

Das Script wandelt eine Excel Tabelle in das LDIF Format um, zum weiteren Import.

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

Modify Tool for Active Directory

Binäre Darstellung

Die Directory Tools entstanden während meiner Einarbeitung in Active Directory und während meiner MCSE – Prüfungsvorbereitung. 2002 entstanden die ersten Tools separat als kleine Skripte, wurden erweitert und verbessert wenn es nötig war.

Nach häufigem Einsatz habe ich mich dann entschlossen die Tools in einer Oberfläche zusammen zu fassen. Zweite Stufe war die Erweiterung für Mehr-Domänen-Betrieb. Derzeit ist das Einlesen von Text oder Excel-Dateien nicht implementiert, da ich gerad an einer Überarbeitung dieser Features arbeite.

Geplant ist weiterhin eine Umstellung auf .NET. (wobei ich nicht weiß wann ich das machen soll. Zusammengefasst: Das Tool ist sowohl spezifisch auf eine Domain und die daraus resultierenden Anfragen bezogen, kann aber auch problemlos erweitert werden.

Kategorien
Scripte

Active Directory read OU’s

Binäre Darstellung

Hier gelistet ist der Source Code zu der Prozedur Organisationseinheiten (OU) einer Active Directory Struktur ermitteln.

Das ganze ist eingebettet in ein VB6 Formular als ein eigener Menüpunkt.

Kategorien
Scripte

Active Directory read User

Binäre Darstellung

Source Code VB 6 zum Auslesen eines Active Directory und Erstellung einer Userdatei im CSV Format

Ausgegeben werden:

  • SAMAccountname
  • Lastname
  • Givenname
  • TelephoneNumber
  • Mail
  • location
  • street
  • LDAP-Pfad
  • Department
  • HomeDirectory
  • LogonScript
  • IsAccountLocked
  • userWorkstations
Dim objAs, objUser, sUser, oDomain, oComputer
Dim ListeOU(5000)
Dim strLDAPQuery
Dim objCON
Dim Anzahl, Bereich
Kategorien
Scripte

Active Directory create Contact

Binäre Darstellung

Hier gibt es den zentralen Source Code zu der Prozedur Kontakte anlegen. Wie immer aus einer Textdatei mit den gültigen Domain Daten.

Kategorien
Scripte

Active Directory create User

Binäre Darstellung

Active Directory create User

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

Active Directory read Info

Binäre Darstellung

Active Directory Domain Info lesen

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