<# =============================================================== Przygotowanie ćwiczenia 14.1c — Delegowanie i zabezpieczenia obiektów AD Windows Server 2019 | Active Directory Zakres: - dodać użytkowników puz1 i puz2 do CN=Users, - utworzyć OU=pMan, - utworzyć OU=pAbc bezpośrednio pod domeną (OU=pAbc,DC=rol00,DC=edu,DC=pl). Uwaga: To jest PRZYGOTOWANIE środowiska — bez delegacji i zmian ACL. =============================================================== #> # --- Parametry (możesz dostosować) --- $Users = @( @{ Sam = 'puz1' # sAMAccountName GivenName = 'puz1' DisplayName = 'puz1' Password = 'zaq1@WSX' # Hasło zgodne z polityką z Twoich materiałów PWNeverExpires = $true CannotChangePW = $true ChangePWAtLogon = $false }, @{ Sam = 'puz2' GivenName = 'puz2' DisplayName = 'puz2' Password = 'zaq1@WSX' PWNeverExpires = $true CannotChangePW = $true ChangePWAtLogon = $false } ) $pManOuName = 'pMan' # OU wymagane w zadaniu $pAbcOuName = 'pAbc' # 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 $pManOUPath = "OU=$pManOuName,$DomainDN" # OU=pMan pod domeną $pAbcOUPath = "OU=$pAbcOuName,$DomainDN" # OU=pAbc pod domeną (jak wymagasz) # --- Utworzenie OU=pMan (jeśli brak) --- $oupManExists = Get-ADOrganizationalUnit -LDAPFilter "(ou=$pManOuName)" -SearchBase $DomainDN -ErrorAction SilentlyContinue if (-not $oupManExists) { Write-Info "Tworzę OU=$pManOuName w $DomainDN ..." New-ADOrganizationalUnit -Name $pManOuName -Path $DomainDN -ProtectedFromAccidentalDeletion $false Write-Ok "Utworzono OU=$pManOuName." } else { Write-Info "OU=$pManOuName już istnieje — pomijam tworzenie." } # --- Utworzenie OU=pAbc (jeśli brak) --- $oupAbcExists = Get-ADOrganizationalUnit -LDAPFilter "(ou=$pAbcOuName)" -SearchBase $DomainDN -ErrorAction SilentlyContinue if (-not $oupAbcExists) { Write-Info "Tworzę OU=$pAbcOuName bezpośrednio pod domeną ($DomainDN) ..." New-ADOrganizationalUnit -Name $pAbcOuName -Path $DomainDN -ProtectedFromAccidentalDeletion $false Write-Ok "Utworzono OU=$pAbcOuName." } else { Write-Info "OU=$pAbcOuName już istnieje pod domeną — pomijam tworzenie." } # --- Przygotowanie użytkowników puz1 i puz2 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 — puzupeł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 (pMan): {0}" -f $pManOUPath) Write-Ok ("OU (pAbc): {0}" -f $pAbcOUPath) 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 (puz1/puz2) oraz konfigurację zabezpieczeń (ACL) dla OU=pAbc — zgodnie z instrukcją 14.1c."