@@ -325,13 +325,21 @@ function Get-ADData {
325
325
# [GERMAN - Ruft alle Organisationseinheiten aus AD ab]
326
326
Write-DebugMessage " Rufe alle OUs aus AD ab..."
327
327
$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
+ } |
328
336
ForEach-Object {
329
337
[PSCustomObject ]@ {
330
338
Name = $_.Name
331
339
DN = $_.DistinguishedName
332
340
}
333
341
} | Sort-Object Name
334
- Write-DebugMessage " Anzahl gefundener OUs: $ ( $script :allOUs.Count ) "
342
+ Write-DebugMessage " Anzahl gefundener OUs nach Filterung : $ ( $script :allOUs.Count ) "
335
343
336
344
# [7.1.2 | USER RETRIEVAL]
337
345
# [ENGLISH - Retrieve users from AD (limited to 200)]
@@ -476,6 +484,48 @@ function Test-Input {
476
484
$errors += ' Gruppenname enthält ungültige Zeichen: \ / : * ? ` " < > |'
477
485
}
478
486
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
+
479
529
# [8.1.4 | VALIDATION RESULT]
480
530
# [ENGLISH - Log validation results]
481
531
# [GERMAN - Protokolliert Validierungsergebnisse]
@@ -883,6 +933,7 @@ $buttonCreate.Add_Click({
883
933
Size = New-Object System.Drawing.Size(300 , 100 )
884
934
StartPosition = " CenterScreen"
885
935
FormBorderStyle = " FixedDialog"
936
+ TopMost = $true
886
937
}
887
938
$progressBar = New-Object System.Windows.Forms.ProgressBar - Property @ {
888
939
Location = New-Object System.Drawing.Point(10 , 10 )
@@ -896,12 +947,31 @@ $buttonCreate.Add_Click({
896
947
$progressForm.Show ()
897
948
$progressForm.Refresh ()
898
949
899
- # Speichere ausgewählte Benutzer vorher, da ein UI-Thread-Problem auftreten könnte
950
+ # FIXIERT: Verbesserte Benutzerauswahl-Extraktion
900
951
$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
+ }
904
969
}
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"
905
975
}
906
976
907
977
try {
@@ -930,73 +1000,132 @@ $buttonCreate.Add_Click({
930
1000
$count = 0
931
1001
932
1002
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
+
933
1021
$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
938
1036
}
939
- if ($radioSecurity.Checked ) { $params [" GroupCategory" ] = " Security" }
940
- else { $params [" GroupCategory" ] = " Distribution" }
941
- if ($os.ProductType -eq 1 ) { $params [" Server" ] = $adConfig.ADServer }
942
1037
943
1038
Write-DebugMessage " Erstelle Gruppe: $ ( $params | ConvertTo-Json - Compress) "
944
1039
try {
945
- # Prüfe , ob die Gruppe bereits existiert
1040
+ # Verbesserte Prüfung , ob die Gruppe bereits existiert (nach SAMAccountName)
946
1041
$existingGroup = $null
947
1042
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 ] {
950
1046
# 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"
951
1051
}
952
1052
953
1053
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"
955
1055
continue
956
1056
}
957
1057
958
1058
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
- }
974
1059
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 ' , ' ) "
979
1073
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"
982
1080
} 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
+ }
984
1107
}
985
1108
}
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
+ }
986
1118
}
987
-
988
- Write-LogMessage " Gruppe $groupName erfolgreich erstellt" - logLevel " INFO"
989
1119
}
990
1120
catch {
991
1121
Write-LogMessage " Fehler bei ${groupName} : $ ( $_.Exception.Message ) " - logLevel " ERROR"
992
1122
}
993
1123
994
1124
$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()
1000
1129
1001
1130
Write-DebugMessage " Fortschritt: $count /$total Gruppen erstellt"
1002
1131
}
0 commit comments