Kategorien
Scripte

How to read Active Directory 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 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 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.

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

Effektive Automatisierung mit Powershell

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.