diff --git a/DDUserManager/DDUserManager/DDUserManager.vbproj b/DDUserManager/DDUserManager/DDUserManager.vbproj
index 28d1ff9..41161ed 100644
--- a/DDUserManager/DDUserManager/DDUserManager.vbproj
+++ b/DDUserManager/DDUserManager/DDUserManager.vbproj
@@ -60,6 +60,9 @@
+
+
+
@@ -83,6 +86,12 @@
+
+ frmADImport.vb
+
+
+ Form
+
Form
@@ -115,6 +124,9 @@
+
+ frmADImport.vb
+
frmMain.vb
diff --git a/DDUserManager/DDUserManager/frmADImport.Designer.vb b/DDUserManager/DDUserManager/frmADImport.Designer.vb
new file mode 100644
index 0000000..21288b9
--- /dev/null
+++ b/DDUserManager/DDUserManager/frmADImport.Designer.vb
@@ -0,0 +1,62 @@
+ _
+Partial Class frmADImport
+ Inherits System.Windows.Forms.Form
+
+ 'Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen.
+ _
+ Protected Overrides Sub Dispose(ByVal disposing As Boolean)
+ Try
+ If disposing AndAlso components IsNot Nothing Then
+ components.Dispose()
+ End If
+ Finally
+ MyBase.Dispose(disposing)
+ End Try
+ End Sub
+
+ 'Wird vom Windows Form-Designer benötigt.
+ Private components As System.ComponentModel.IContainer
+
+ 'Hinweis: Die folgende Prozedur ist für den Windows Form-Designer erforderlich.
+ 'Das Bearbeiten ist mit dem Windows Form-Designer möglich.
+ 'Das Bearbeiten mit dem Code-Editor ist nicht möglich.
+ _
+ Private Sub InitializeComponent()
+ Me.gridAD_Groups = New DevExpress.XtraGrid.GridControl()
+ Me.GridView1 = New DevExpress.XtraGrid.Views.Grid.GridView()
+ CType(Me.gridAD_Groups, System.ComponentModel.ISupportInitialize).BeginInit()
+ CType(Me.GridView1, System.ComponentModel.ISupportInitialize).BeginInit()
+ Me.SuspendLayout()
+ '
+ 'gridAD_Groups
+ '
+ Me.gridAD_Groups.Dock = System.Windows.Forms.DockStyle.Left
+ Me.gridAD_Groups.Location = New System.Drawing.Point(0, 0)
+ Me.gridAD_Groups.MainView = Me.GridView1
+ Me.gridAD_Groups.Name = "gridAD_Groups"
+ Me.gridAD_Groups.Size = New System.Drawing.Size(294, 456)
+ Me.gridAD_Groups.TabIndex = 0
+ Me.gridAD_Groups.ViewCollection.AddRange(New DevExpress.XtraGrid.Views.Base.BaseView() {Me.GridView1})
+ '
+ 'GridView1
+ '
+ Me.GridView1.GridControl = Me.gridAD_Groups
+ Me.GridView1.Name = "GridView1"
+ '
+ 'frmADImport
+ '
+ Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
+ Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
+ Me.ClientSize = New System.Drawing.Size(865, 456)
+ Me.Controls.Add(Me.gridAD_Groups)
+ Me.Name = "frmADImport"
+ Me.Text = "frmADImport"
+ CType(Me.gridAD_Groups, System.ComponentModel.ISupportInitialize).EndInit()
+ CType(Me.GridView1, System.ComponentModel.ISupportInitialize).EndInit()
+ Me.ResumeLayout(False)
+
+ End Sub
+
+ Friend WithEvents gridAD_Groups As DevExpress.XtraGrid.GridControl
+ Friend WithEvents GridView1 As DevExpress.XtraGrid.Views.Grid.GridView
+End Class
diff --git a/DDUserManager/DDUserManager/frmADImport.resx b/DDUserManager/DDUserManager/frmADImport.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/DDUserManager/DDUserManager/frmADImport.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/DDUserManager/DDUserManager/frmADImport.vb b/DDUserManager/DDUserManager/frmADImport.vb
new file mode 100644
index 0000000..d81e082
--- /dev/null
+++ b/DDUserManager/DDUserManager/frmADImport.vb
@@ -0,0 +1,108 @@
+Imports System.DirectoryServices
+Imports System.DirectoryServices.ActiveDirectory
+Imports System.DirectoryServices.AccountManagement
+
+Public Class frmADImport
+
+ Private excludedGroupNames As New List(Of String) From {
+ "Abgelehnte",
+ "DHCP",
+ "Distributed COM",
+ "Dns",
+ "Domänen-Gäste",
+ "Domänencomput",
+ "Druck",
+ "Einstellungen eingehender",
+ "Ereignis",
+ "Gäst",
+ "Hyper-V",
+ "IIS_",
+ "Klonbare",
+ "Konten-Oper",
+ "Kryptografie",
+ "Leistungs",
+ "Netzwerkskon",
+ "PrivUser",
+ "Protected User",
+ "Prä-Windows",
+ "RAS- und IAS-Server",
+ "RDS-",
+ "Remoteverwaltungs",
+ "Replikations",
+ "Reporting",
+ "Richtlinien-Ersteller",
+ "SQLAccess",
+ "Schreibgeschützte Domänen",
+ "Server-Operatore",
+ "Sicherungs",
+ "Terminalserver-Liz",
+ "WinRMR",
+ "Windows-Auth",
+ "Zertifikat",
+ "Zugriffssteuerungs",
+ "Zulässige"
+ }
+
+ Private Sub frmADImport_Load(sender As Object, e As EventArgs) Handles MyBase.Load
+ Dim groups = GetActiveDirectoryGroups(Environment.UserName)
+
+ gridAD_Groups.DataSource = groups
+ End Sub
+
+ Private Function FindUser(rootEntry As DirectoryEntry, samAccountName As String) As DirectoryEntry
+ Dim userSearch = New DirectorySearcher(
+ rootEntry,
+ $"(samAccountName={samAccountName})",
+ New String() {"displayName"}
+ )
+
+ Dim result = userSearch.FindOne()
+
+ If IsNothing(result) Then
+ Return Nothing
+ Else
+ Return result.GetDirectoryEntry()
+ End If
+ End Function
+
+ Private Function GetGroupNameFromTokenGroupEntry(rootEntry As DirectoryEntry, tokenGroup As Byte())
+ Dim sID As New Security.Principal.SecurityIdentifier(tokenGroup, 0)
+ Dim sIDSearch = New DirectorySearcher(rootEntry, $"(objectSid={sID.Value})", New String() {"name"})
+ Dim sIDResult = sIDSearch.FindOne()
+
+ If IsNothing(sIDResult) Then
+ Return Nothing
+ Else
+ Return sIDResult.Properties("name").Item(0).ToString()
+ End If
+ End Function
+
+ Private Function GetActiveDirectoryGroups(samAccountName As String) As List(Of String)
+ Dim groups As New List(Of String)
+ Dim adRoot As New DirectoryEntry() With {
+ .AuthenticationType = AuthenticationTypes.Secure
+ }
+ Dim user As DirectoryEntry = FindUser(adRoot, samAccountName)
+
+ If IsNothing(user) Then
+ MsgBox($"Benutzer {samAccountName} wurde nicht in der Active Directory gefunden!")
+ Return groups
+ End If
+
+ user.RefreshCache(New String() {"tokenGroups"})
+
+ For Each tokenGroup As Byte() In user.Properties("tokenGroups")
+ Dim groupName As String = GetGroupNameFromTokenGroupEntry(adRoot, tokenGroup)
+
+ If Not IsNothing(groupName) Then
+ Dim isValidGroup As Boolean = excludedGroupNames.Where(Function(excludedGroup) Not groupName.StartsWith(excludedGroup)).Any()
+
+ If isValidGroup Then
+ groups.Add(groupName)
+ End If
+ End If
+ Next
+
+ Return groups
+ End Function
+End Class
\ No newline at end of file