Skip to content

Commit 7438383

Browse files
committed
Testet Version - Final of V0.2.7
1 parent b6b505b commit 7438383

File tree

2 files changed

+198
-67
lines changed

2 files changed

+198
-67
lines changed

easyADGroup_V0.2.7.ps1

Lines changed: 174 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -325,13 +325,21 @@ function Get-ADData {
325325
# [GERMAN - Ruft alle Organisationseinheiten aus AD ab]
326326
Write-DebugMessage "Rufe alle OUs aus AD ab..."
327327
$script:allOUs = Get-ADOrganizationalUnit -Filter * -Properties Name, DistinguishedName |
328+
# Filtere Standard-OUs heraus (basierend auf deren Standardnamen oder Strukturen)
329+
Where-Object {
330+
# Filtere Standard-OUs wie "Domain Controllers", "Users", "Computers" heraus
331+
$excludedOUs = @('Domain Controllers', 'Users', 'Computers', 'Builtin')
332+
$_.Name -notin $excludedOUs -and
333+
# Filtere auch Container-Objekte heraus (beginnen mit CN= statt OU=)
334+
$_.DistinguishedName -notlike "CN=*"
335+
} |
328336
ForEach-Object {
329337
[PSCustomObject]@{
330338
Name = $_.Name
331339
DN = $_.DistinguishedName
332340
}
333341
} | Sort-Object Name
334-
Write-DebugMessage "Anzahl gefundener OUs: $($script:allOUs.Count)"
342+
Write-DebugMessage "Anzahl gefundener OUs nach Filterung: $($script:allOUs.Count)"
335343

336344
# [7.1.2 | USER RETRIEVAL]
337345
# [ENGLISH - Retrieve users from AD (limited to 200)]
@@ -476,6 +484,48 @@ function Test-Input {
476484
$errors += 'Gruppenname enthält ungültige Zeichen: \ / : * ? ` " < > |'
477485
}
478486

487+
# [NEUE FUNKTION] - Validierung der Gruppennamen auf ungültige AD-Zeichen
488+
$groupsToValidate = @()
489+
490+
if ($chkSpecial.Checked) {
491+
$suffixes = $adgroupsConfig.AdditionalSuffixes.Split(",")
492+
foreach ($suffix in $suffixes) {
493+
$groupsToValidate += "$($textBoxPrefix.Text.Trim())$($textBoxSeparator.Text.Trim())$suffix"
494+
}
495+
}
496+
elseif (($textBoxStart.Text.Trim() -eq "") -and ($textBoxEnd.Text.Trim() -eq "")) {
497+
$groupsToValidate += "$($textBoxPrefix.Text.Trim())"
498+
}
499+
else {
500+
if ($errors.Count -eq 0) { # Nur ausführen, wenn keine Fehler bei Start/End
501+
$start = [int]$textBoxStart.Text.Trim()
502+
$end = [int]$textBoxEnd.Text.Trim()
503+
for ($i = $start; $i -le $end; $i++) {
504+
$groupsToValidate += "$($textBoxPrefix.Text.Trim())$($textBoxSeparator.Text.Trim())$i"
505+
}
506+
}
507+
}
508+
509+
# Validiere alle Gruppennamen
510+
foreach ($groupName in $groupsToValidate) {
511+
# Prüfe auf ungültige AD-Zeichen (ergänzt zu den bereits geprüften Zeichen)
512+
if ($groupName -match '[,;@\[\]{}+=&~!#%^()''`]') {
513+
$errors += "Gruppenname '$groupName' enthält ungültige Zeichen für Active Directory."
514+
break # Stoppe nach dem ersten fehlerhaften Namen
515+
}
516+
517+
# Prüfe auf Längenbeschränkungen
518+
if ($groupName.Length > 256) {
519+
$errors += "Gruppenname '$groupName' ist zu lang (max. 256 Zeichen)."
520+
break
521+
}
522+
523+
# Prüfe SAMAccountName-Länge
524+
if ($groupName.Length > 20) {
525+
Write-DebugMessage "SAMAccountName für '$groupName' wird auf 20 Zeichen gekürzt"
526+
}
527+
}
528+
479529
# [8.1.4 | VALIDATION RESULT]
480530
# [ENGLISH - Log validation results]
481531
# [GERMAN - Protokolliert Validierungsergebnisse]
@@ -883,6 +933,7 @@ $buttonCreate.Add_Click({
883933
Size = New-Object System.Drawing.Size(300, 100)
884934
StartPosition = "CenterScreen"
885935
FormBorderStyle = "FixedDialog"
936+
TopMost = $true
886937
}
887938
$progressBar = New-Object System.Windows.Forms.ProgressBar -Property @{
888939
Location = New-Object System.Drawing.Point(10, 10)
@@ -896,12 +947,31 @@ $buttonCreate.Add_Click({
896947
$progressForm.Show()
897948
$progressForm.Refresh()
898949

899-
# Speichere ausgewählte Benutzer vorher, da ein UI-Thread-Problem auftreten könnte
950+
# FIXIERT: Verbesserte Benutzerauswahl-Extraktion
900951
$script:selectedUsers = @()
901-
foreach ($item in $listBoxUsers.SelectedItems) {
902-
if ($item -is [System.Data.DataRow]) {
903-
$script:selectedUsers += $item["SamAccountName"]
952+
if ($listBoxUsers.SelectedItems.Count -gt 0) {
953+
Write-DebugMessage "Ausgewählte Benutzer werden extrahiert... ($($listBoxUsers.SelectedItems.Count) Elemente)"
954+
955+
foreach ($selectedItem in $listBoxUsers.SelectedItems) {
956+
try {
957+
# Korrekter Zugriff auf die SamAccountName-Eigenschaft
958+
$samAccountName = $selectedItem.Item("SamAccountName")
959+
if (-not [string]::IsNullOrWhiteSpace($samAccountName)) {
960+
$script:selectedUsers += $samAccountName
961+
Write-DebugMessage "Benutzer ausgewählt: $samAccountName"
962+
}
963+
}
964+
catch {
965+
Write-LogMessage "Fehler beim Extrahieren des SamAccountName: $($_.Exception.Message)" -logLevel "WARNING"
966+
Write-DebugMessage "Ausgewähltes Item-Typ: $($selectedItem.GetType().FullName)"
967+
Write-DebugMessage "Properties: $($selectedItem | Format-List | Out-String)"
968+
}
904969
}
970+
971+
Write-LogMessage "Es wurden $($script:selectedUsers.Count) Benutzer für die Gruppenmitgliedschaft ausgewählt" -logLevel "INFO"
972+
Write-DebugMessage "Ausgewählte Benutzer: $($script:selectedUsers -join ', ')"
973+
} else {
974+
Write-LogMessage "Keine Benutzer für Gruppenmitgliedschaft ausgewählt" -logLevel "INFO"
905975
}
906976

907977
try {
@@ -930,73 +1000,132 @@ $buttonCreate.Add_Click({
9301000
$count = 0
9311001

9321002
foreach ($groupName in $groupsToCreate) {
1003+
# SAMAccountName-Überprüfung (max. 256 Zeichen für Namen, 20 für SAM)
1004+
$samAccountName = $groupName
1005+
if ($samAccountName.Length > 20) {
1006+
$samAccountName = $samAccountName.Substring(0, 20)
1007+
Write-LogMessage "SAMAccountName für $groupName wurde auf $samAccountName gekürzt (max. 20 Zeichen)" -logLevel "WARNING"
1008+
}
1009+
1010+
if ($groupName.Length > 256) {
1011+
$groupName = $groupName.Substring(0, 256)
1012+
Write-LogMessage "Gruppenname wurde auf $groupName gekürzt (max. 256 Zeichen)" -logLevel "WARNING"
1013+
}
1014+
1015+
# Prüfe auf problematische Zeichen, die nicht bereits durch die Validierung abgefangen wurden
1016+
if ($groupName -match '[,;@\[\]{}+=&~!#%^()''`]' -or $groupName -match '[\\/:*?"<>|]') {
1017+
Write-LogMessage "Gruppenname $groupName enthält ungültige Zeichen - wird übersprungen" -logLevel "ERROR"
1018+
continue
1019+
}
1020+
9331021
$params = @{
934-
Name = $groupName
935-
Path = $comboBoxOU.SelectedValue
936-
GroupScope = if ($radioGlobal.Checked) { "Global" } elseif ($radioUniversal.Checked) { "Universal" } else { "DomainLocal" }
937-
Description = if ($textBoxDescription.Text) { $textBoxDescription.Text } else { $adgroupsConfig.GroupDescription }
1022+
Name = $groupName
1023+
SamAccountName = $samAccountName
1024+
Path = if ($comboBoxOU.SelectedValue -is [string]) { $comboBoxOU.SelectedValue } else { $comboBoxOU.SelectedValue.DN }
1025+
GroupScope = if ($radioGlobal.Checked) { "Global" } elseif ($radioUniversal.Checked) { "Universal" } else { "DomainLocal" }
1026+
Description = if ($textBoxDescription.Text) { $textBoxDescription.Text } else { $adgroupsConfig.GroupDescription }
1027+
DisplayName = $groupName
1028+
}
1029+
1030+
# Debug-Ausgabe erweitern zur besseren Fehlerdiagnose
1031+
Write-DebugMessage "Erstelle Gruppe: $groupName mit Pfad: $($params.Path) (Typ: $($params.Path.GetType().FullName))"
1032+
1033+
# Server-Parameter nur hinzufügen, wenn ADServer definiert ist
1034+
if ($os.ProductType -eq 1 -and $adConfig.ADServer) {
1035+
$params["Server"] = $adConfig.ADServer
9381036
}
939-
if ($radioSecurity.Checked) { $params["GroupCategory"] = "Security" }
940-
else { $params["GroupCategory"] = "Distribution" }
941-
if ($os.ProductType -eq 1) { $params["Server"] = $adConfig.ADServer }
9421037

9431038
Write-DebugMessage "Erstelle Gruppe: $($params | ConvertTo-Json -Compress)"
9441039
try {
945-
# Prüfe, ob die Gruppe bereits existiert
1040+
# Verbesserte Prüfung, ob die Gruppe bereits existiert (nach SAMAccountName)
9461041
$existingGroup = $null
9471042
try {
948-
$existingGroup = Get-ADGroup -Identity $groupName -ErrorAction Stop
949-
} catch {
1043+
$existingGroup = Get-ADGroup -Identity $samAccountName -Properties * -ErrorAction SilentlyContinue
1044+
}
1045+
catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException] {
9501046
# Gruppe existiert nicht - das ist gut
1047+
Write-DebugMessage "Gruppe ${samAccountName} existiert nicht - kann erstellt werden"
1048+
}
1049+
catch {
1050+
Write-LogMessage "Fehler bei Prüfung auf existierende Gruppe ${samAccountName}: $($_.Exception.Message)" -logLevel "WARNING"
9511051
}
9521052

9531053
if ($existingGroup) {
954-
Write-LogMessage "Gruppe $groupName existiert bereits - wird übersprungen" -logLevel "WARNING"
1054+
Write-LogMessage "Gruppe mit SAMAccountName $samAccountName existiert bereits - wird übersprungen" -logLevel "WARNING"
9551055
continue
9561056
}
9571057

9581058
Write-LogMessage "Erstelle Gruppe: $($params.Name) in OU: $($params.Path) mit Scope: $($params.GroupScope) und Category: $($params.GroupCategory)" -logLevel "INFO"
959-
$group = New-ADGroup @params -PassThru -ErrorAction Stop
960-
961-
[void]$script:createdGroups.Add($group.Name)
962-
Write-DebugMessage "Gruppe $groupName erfolgreich erstellt"
963-
964-
# Verbesserte Benutzerverarbeitung mit vorspeicherten ausgewählten Benutzern
965-
if ($script:selectedUsers.Count -gt 0) {
966-
Write-DebugMessage "Füge $($script:selectedUsers.Count) ausgewählte Mitglieder hinzu: $($script:selectedUsers -join ', ')"
967-
try {
968-
Add-ADGroupMember -Identity $group -Members $script:selectedUsers -ErrorAction Stop
969-
Write-LogMessage "Mitglieder zu $groupName hinzugefügt: $($script:selectedUsers -join ', ')" -logLevel "INFO"
970-
} catch {
971-
Write-LogMessage "Fehler beim Hinzufügen von Mitgliedern zu ${groupName}: $($_.Exception.Message)" -logLevel "ERROR"
972-
}
973-
}
9741059

975-
if ($adgroupsConfig.GroupMembersAddActive -eq "1") {
976-
$fixedMembers = $adgroupsConfig.GroupMembersAdd.Split(",")
977-
if ($fixedMembers) {
978-
Write-DebugMessage "Füge feste Mitglieder aus INI hinzu: $($fixedMembers -join ', ')"
1060+
# Verbessertes Error-Handling beim Erstellen der Gruppe
1061+
try {
1062+
$group = New-ADGroup @params -PassThru -ErrorAction Stop
1063+
1064+
# Kleine Verzögerung für AD-Replikation
1065+
Start-Sleep -Milliseconds 500
1066+
1067+
[void]$script:createdGroups.Add($group.Name)
1068+
Write-DebugMessage "Gruppe $groupName erfolgreich erstellt"
1069+
1070+
# FIXIERT: Verbesserte Benutzerverarbeitung
1071+
if ($script:selectedUsers.Count -gt 0) {
1072+
Write-DebugMessage "Füge $($script:selectedUsers.Count) ausgewählte Mitglieder hinzu: $($script:selectedUsers -join ', ')"
9791073
try {
980-
Add-ADGroupMember -Identity $group -Members $fixedMembers -ErrorAction Stop
981-
Write-LogMessage "Feste Mitglieder zu $groupName hinzugefügt: $($fixedMembers -join ', ')" -logLevel "INFO"
1074+
# Verzögerung vor dem Hinzufügen von Mitgliedern
1075+
Start-Sleep -Milliseconds 1000
1076+
1077+
# Hinzufügen von ausgewählten Benutzern sicherstellen
1078+
Add-ADGroupMember -Identity $samAccountName -Members $script:selectedUsers -ErrorAction Stop
1079+
Write-LogMessage "Mitglieder zu $groupName hinzugefügt: $($script:selectedUsers -join ', ')" -logLevel "INFO"
9821080
} catch {
983-
Write-LogMessage "Fehler beim Hinzufügen fester Mitglieder zu ${groupName}: $($_.Exception.Message)" -logLevel "WARNING"
1081+
Write-LogMessage "Fehler beim Hinzufügen von Mitgliedern zu ${groupName}: $($_.Exception.Message)" -logLevel "ERROR"
1082+
Write-DebugMessage "Vollständige Fehlerdetails: $($_ | Format-List -Force | Out-String)"
1083+
1084+
# Fallback: Versuche es erneut mit dem DN der Gruppe
1085+
try {
1086+
Add-ADGroupMember -Identity $group.DistinguishedName -Members $script:selectedUsers -ErrorAction Stop
1087+
Write-LogMessage "Mitglieder zu $groupName hinzugefügt (2. Versuch mit DN)" -logLevel "INFO"
1088+
} catch {
1089+
Write-LogMessage "Auch 2. Versuch zum Hinzufügen der Mitglieder fehlgeschlagen" -logLevel "ERROR"
1090+
}
1091+
}
1092+
} else {
1093+
Write-DebugMessage "Keine Benutzer aus GUI zur Gruppe hinzuzufügen"
1094+
}
1095+
1096+
# INI-basierte Benutzer
1097+
if ($adgroupsConfig.GroupMembersAddActive -eq "1") {
1098+
$fixedMembers = $adgroupsConfig.GroupMembersAdd.Split(",")
1099+
if ($fixedMembers) {
1100+
Write-DebugMessage "Füge feste Mitglieder aus INI hinzu: $($fixedMembers -join ', ')"
1101+
try {
1102+
Add-ADGroupMember -Identity $group -Members $fixedMembers -ErrorAction Stop
1103+
Write-LogMessage "Feste Mitglieder zu $groupName hinzugefügt: $($fixedMembers -join ', ')" -logLevel "INFO"
1104+
} catch {
1105+
Write-LogMessage "Fehler beim Hinzufügen fester Mitglieder zu ${groupName}: $($_.Exception.Message)" -logLevel "WARNING"
1106+
}
9841107
}
9851108
}
1109+
1110+
Write-LogMessage "Gruppe $groupName erfolgreich erstellt" -logLevel "INFO"
1111+
}
1112+
catch {
1113+
Write-LogMessage "Fehler beim Erstellen der Gruppe ${groupName}: $($_.Exception.Message)" -logLevel "ERROR"
1114+
# Detaillierte Fehlerinformationen ausgeben
1115+
if ($generalConfig.Debug -eq "1") {
1116+
Write-DebugMessage "Exception-Details: $($_ | Format-List -Force | Out-String)"
1117+
}
9861118
}
987-
988-
Write-LogMessage "Gruppe $groupName erfolgreich erstellt" -logLevel "INFO"
9891119
}
9901120
catch {
9911121
Write-LogMessage "Fehler bei ${groupName}: $($_.Exception.Message)" -logLevel "ERROR"
9921122
}
9931123

9941124
$count++
995-
# UI-Thread-sicheres Update der ProgressBar mit korrigierter Syntax
996-
$progressForm.Invoke({
997-
$progressBar.Value = [Math]::Min(($count / $total) * 100, 100)
998-
$progressForm.Text = "Fortschritt: $($count)/$($total)"
999-
})
1125+
# UI-Thread-sichere Aktualisierung der ProgressBar
1126+
$progressBar.Value = [Math]::Min([int](($count / $total) * 100), 100)
1127+
$progressForm.Text = "Fortschritt: $($count)/$($total)"
1128+
[System.Windows.Forms.Application]::DoEvents()
10001129

10011130
Write-DebugMessage "Fortschritt: $count/$total Gruppen erstellt"
10021131
}

easyADGroups.ini

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,57 @@
11
[General]
22
; Allgemeine Informationen
33
; SCRIPT Information | VERSION
4-
ScriptVersion = 0.2.7
4+
ScriptVersion=0.2.7
55
; SCRIPT Information | LAST UPDATE
6-
LastUpdate = 16.03.2025
6+
LastUpdate=16.03.2025
77
; SCRIPT Information | AUTHOR
8-
Author = Andreas Hepp
8+
Author=Andreas Hepp
99
; GUI Umleitungs-URL
10-
WebsiteURL = https://psscripts.de
10+
WebsiteURL=https://phinit.de
1111
; GUI Umleitungs-URL Text
12-
WebsiteURLText = psscripts.de
12+
WebsiteURLText=phinit.de
1313
; DEBUG ein = 1 | aus = 0
14-
Debug = 1
14+
Debug=1
1515

1616
[LOGGING]
1717
; DATEINAME: LOG_easyADGroups-[yyyy-MM-dd]-[LogFileName aus INI].txt
18-
LogFileName = FIRMENNAME.txt
18+
LogFileName=PHINIT.log
19+
LogActive=1
20+
LogLevel=INFO
1921

2022
[GUI]
2123
; Farbe für Header
22-
HeaderBackColor = DarkGray
24+
HeaderBackColor=DarkGray
2325
; Farbe für Footer
24-
FooterBackColor = DarkGray
26+
FooterBackColor=DarkGray
2527
; Farbe für Footer Schrift
26-
FooterFontColor = White
28+
FooterFontColor=White
2729
; GUI AppName
28-
AppName = CREATE AD-Groups
30+
AppName=Active Directory ADGroups
2931
; GUI AppName Schriftgröße
30-
AppNameFontSize = 12
32+
AppNameFontSize=14
3133
; GUI AppName Schriftfarbe
32-
AppNameFontColor = White
34+
AppNameFontColor=White
3335
; GUI Schriftart
34-
AppFont = Arial
36+
AppFont=Segoe UI
3537
; GUI LOGO
36-
AppLogoPath = APPICON.png
38+
AppLogoPath=APPICON.png
3739
; GUI LOGO Größe (Breite, Höhe)
38-
AppLogoSize = 175,50
40+
AppLogoSize=150,60
3941

4042
[AD]
4143
; Nur benötigt, wenn Windows Client erkannt wird!
4244
; AD Server (falls nicht erkannt und vom Windows Client ausgeführt)
43-
ADServer = DC01
45+
ADServer=dc01.phinit.de
4446
; AD Server Port (LDAP / LDAPs)
45-
ADServerPort = 389
47+
ADServerPort=389
4648

4749
[ADGROUPS]
4850
; Feste Gruppenbeschreibung
49-
GroupDescription = Example Group Description
51+
GroupDescription=Erstellt mit easyADgroup
5052
; Zusätzliche Suffixe für Spezialgruppen (z.B. "RW,R,ADM")
51-
AdditionalSuffixes = RW,R,ADM
53+
AdditionalSuffixes=RW,R,ADM
5254
; Feste Gruppenmitglieder an = 1 | aus = 0
53-
GroupMembersAddActive = 1
55+
GroupMembersAddActive=1
5456
; Welche Mitglieder immer zuordnen?
55-
GroupMembersAdd = immerda
57+
GroupMembersAdd=Domänen-Admins,Domänen-Benutzer

0 commit comments

Comments
 (0)