<# =============================================================== Przygotowanie ćwiczenia 14.1c — Delegowanie i zabezpieczenia obiektów AD Windows Server 2019 | Active Directory Zakres: - dodać użytkowników uz1 i uz2 do CN=Users, - utworzyć OU=Mandatory, - utworzyć OU=Abc bezpośrednio pod domeną (OU=Abc,DC=rol00,DC=edu,DC=pl). Uwaga: To jest PRZYGOTOWANIE środowiska — bez delegacji i zmian ACL. =============================================================== #> # --- Parametry (możesz dostosować) --- $Users = @( @{ Sam = 'uz1' # sAMAccountName GivenName = 'uz1' DisplayName = 'uz1' Password = 'zaq1@WSX' # Hasło zgodne z polityką z Twoich materiałów PWNeverExpires = $true CannotChangePW = $true ChangePWAtLogon = $false }, @{ Sam = 'uz2' GivenName = 'uz2' DisplayName = 'uz2' Password = 'zaq1@WSX' PWNeverExpires = $true CannotChangePW = $true ChangePWAtLogon = $false } ) $MandatoryOuName = 'Mandatory' # OU wymagane w zadaniu $AbcOuName = 'Abc' # OU do zabezpieczeń w ćwiczeniu # Jeśli znasz nazwę domeny, możesz ją wymusić (w przeciwnym razie pobieramy z RootDSE): # $DomainDN = 'DC=rol00,DC=edu,DC=pl' # --- Funkcje logujące (PL) --- function Write-Info($m){ Write-Host $m -ForegroundColor Cyan } function Write-Ok($m){ Write-Host $m -ForegroundColor Green } function Write-Warn($m){ Write-Host $m -ForegroundColor Yellow } function Write-Err($m){ Write-Host $m -ForegroundColor Red } # --- Moduł ActiveDirectory --- try { Import-Module ActiveDirectory -ErrorAction Stop Write-Info "Załadowano moduł ActiveDirectory." } catch { Write-Err "Brak modułu ActiveDirectory (RSAT). Zainstaluj i uruchom ponownie." throw } # --- Ustalenie DN domeny z RootDSE --- try { if (-not $DomainDN) { $DomainDN = (Get-ADRootDSE).DefaultNamingContext } $Domain = Get-ADDomain $DnsRoot = $Domain.DNSRoot # np. rol00.edu.pl $NetBIOS = $Domain.NetBIOSName # np. IS Write-Info "Wykryto domenę: $DnsRoot ($DomainDN)" } catch { Write-Err "Nie można pobrać informacji o domenie. Sprawdź łączność z DC." throw } # --- Ścieżki docelowe --- $UsersCN = "CN=Users,$DomainDN" # Kontener wbudowany na konta i grupy $MandatoryOUPath = "OU=$MandatoryOuName,$DomainDN" # OU=Mandatory pod domeną $AbcOUPath = "OU=$AbcOuName,$DomainDN" # OU=Abc pod domeną (jak wymagasz) # --- Utworzenie OU=Mandatory (jeśli brak) --- $ouMandatoryExists = Get-ADOrganizationalUnit -LDAPFilter "(ou=$MandatoryOuName)" -SearchBase $DomainDN -ErrorAction SilentlyContinue if (-not $ouMandatoryExists) { Write-Info "Tworzę OU=$MandatoryOuName w $DomainDN ..." New-ADOrganizationalUnit -Name $MandatoryOuName -Path $DomainDN -ProtectedFromAccidentalDeletion $false Write-Ok "Utworzono OU=$MandatoryOuName." } else { Write-Info "OU=$MandatoryOuName już istnieje — pomijam tworzenie." } # --- Utworzenie OU=Abc (jeśli brak) --- $ouAbcExists = Get-ADOrganizationalUnit -LDAPFilter "(ou=$AbcOuName)" -SearchBase $DomainDN -ErrorAction SilentlyContinue if (-not $ouAbcExists) { Write-Info "Tworzę OU=$AbcOuName bezpośrednio pod domeną ($DomainDN) ..." New-ADOrganizationalUnit -Name $AbcOuName -Path $DomainDN -ProtectedFromAccidentalDeletion $false Write-Ok "Utworzono OU=$AbcOuName." } else { Write-Info "OU=$AbcOuName już istnieje pod domeną — pomijam tworzenie." } # --- Przygotowanie użytkowników uz1 i uz2 w CN=Users --- foreach ($u in $Users) { $Sam = $u.Sam $UPN = "$Sam@$DnsRoot" # Sprawdź czy konto istnieje (po SAM) $existing = Get-ADUser -Filter "samAccountName -eq '$Sam'" -SearchBase $UsersCN -ErrorAction SilentlyContinue if (-not $existing) { # Utwórz konto w CN=Users $sec = ConvertTo-SecureString $u.Password -AsPlainText -Force Write-Info "Tworzę użytkownika $Sam w $UsersCN ..." New-ADUser ` -Name $Sam ` -SamAccountName $Sam ` -UserPrincipalName $UPN ` -Path $UsersCN ` -Enabled $true ` -AccountPassword $sec ` -PasswordNeverExpires $u.PWNeverExpires ` -CannotChangePassword $u.CannotChangePW ` -ChangePasswordAtLogon $u.ChangePWAtLogon # Uzupełnij imię/DisplayName (opcjonalnie wyczyść Nazwisko) Set-ADUser -Identity $Sam -GivenName $u.GivenName -DisplayName $u.DisplayName Set-ADUser -Identity $Sam -Clear sn -ErrorAction SilentlyContinue Write-Ok "Utworzono użytkownika: $Sam (UPN: $UPN; logowanie: $NetBIOS\$Sam)" } else { Write-Warn "Użytkownik $Sam już istnieje w $UsersCN — uzupełniam właściwości." # Uzupełnij właściwości jeśli trzeba Set-ADUser -Identity $Sam -UserPrincipalName $UPN -SamAccountName $Sam Set-ADUser -Identity $Sam ` -PasswordNeverExpires $u.PWNeverExpires ` -CannotChangePassword $u.CannotChangePW ` -ChangePasswordAtLogon $u.ChangePWAtLogon ` -GivenName $u.GivenName ` -DisplayName $u.DisplayName try { Set-ADUser -Identity $Sam -Clear sn } catch {} Write-Ok "Zaktualizowano ustawienia konta: $Sam" } } # --- Podsumowanie (tylko przygotowanie, bez delegacji/ACL) --- Write-Warn "PRZYGOTOWANIE ZAKOŃCZONE:" Write-Ok ("OU (Mandatory): {0}" -f $MandatoryOUPath) Write-Ok ("OU (Abc): {0}" -f $AbcOUPath) Write-Ok ("Konta: {0}\{1}, {0}\{2}" -f $NetBIOS, $Users[0].Sam, $Users[1].Sam) # Poprawne łączenie nazw użytkowników z tablicy (bez błędu ForEach-Object/-join) $memberNamesDeclared = ($Users | ForEach-Object { $_.Sam }) -join ', ' Write-Ok ("Użytkownicy przygotowani w CN=Users: {0}" -f $memberNamesDeclared) Write-Info "Dalej wykonaj ręcznie: delegowanie kontroli (uz1/uz2) oraz konfigurację zabezpieczeń (ACL) dla OU=Abc — zgodnie z instrukcją 14.1c."