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