Tag 2 · Block 3: Active Directory, Remoting und Module
Deine Umgebung: Domäne pslab.internal, Domänencontroller DC01, Kursrechner PSLAB-01 bis PSLAB-03. Du bist als PSLAB\teilnehmerNN angemeldet (NN ist deine Nummer, zum Beispiel 01). Du darfst in deiner eigenen OU OU=T01,OU=Uebung,OU=Kurs,DC=pslab,DC=internal (bzw. T02, T03) Objekte anlegen. Überall sonst darfst du nur lesen.
Active Directory
Abschnitt betitelt „Active Directory“- Lade das Modul
ActiveDirectoryund zeige Informationen zur Domäne an. - Zeige dich selbst als AD-Benutzer an, mit den Eigenschaften
Department,TitleundLastLogonDate. - Wie viele Benutzer hat die OU
OU=Benutzer,OU=Kurs,DC=pslab,DC=internal? - Welche Benutzer gehören zur Abteilung
IT? Gib nurNameundSamAccountNameaus.
Lösung anzeigen
Import-Module ActiveDirectoryGet-ADDomain
Get-ADUser -Identity $env:USERNAME -Properties Department, Title, LastLogonDate | Select-Object Name, Department, Title, LastLogonDate
Get-ADUser -Filter * -SearchBase "OU=Benutzer,OU=Kurs,DC=pslab,DC=internal" | Measure-Object
Get-ADUser -Filter "Department -eq 'IT'" -Properties Department | Select-Object Name, SamAccountName- Finde alle deaktivierten Benutzerkonten.
- Finde alle Konten, deren Passwort abgelaufen ist (
Search-ADAccount). - Exportiere die deaktivierten Konten mit
Name,SamAccountNameundEnabledalsC:\Kurs\Ausgabe\ad-deaktiviert.csv.
Lösung anzeigen
Get-ADUser -Filter 'Enabled -eq $false' | Select-Object Name, SamAccountNameSearch-ADAccount -PasswordExpired | Select-Object Name, SamAccountName
Get-ADUser -Filter 'Enabled -eq $false' | Select-Object Name, SamAccountName, Enabled | Export-Csv C:\Kurs\Ausgabe\ad-deaktiviert.csv- Zeige alle Gruppen, deren Name mit
GRP-beginnt. - Zeige die Mitglieder der Gruppe
GRP-IT. - In welchen Gruppen bist du selbst Mitglied?
- Welche Benutzer sind in keiner
GRP--Gruppe? Das ist eine Challenge. Gehe schrittweise vor: Ermittle zuerst alle Mitglieder allerGRP--Gruppen in einer Variable.
Lösung anzeigen
Get-ADGroup -Filter "Name -like 'GRP-*'" | Select-Object Name, GroupScopeGet-ADGroupMember -Identity GRP-IT | Select-Object Name, SamAccountNameGet-ADPrincipalGroupMembership -Identity $env:USERNAME | Select-Object Name
# Challenge$mitglieder = Get-ADGroup -Filter "Name -like 'GRP-*'" | Get-ADGroupMember | Select-Object -ExpandProperty SamAccountName -UniqueGet-ADUser -Filter * -SearchBase "OU=Benutzer,OU=Kurs,DC=pslab,DC=internal" | Where-Object { $_.SamAccountName -notin $mitglieder } | Select-Object Name, SamAccountNameLege in deiner OU (OU=TNN,OU=Uebung,OU=Kurs,DC=pslab,DC=internal) einen Benutzer an.
- Lege
$oumit dem Pfad deiner OU an. - Frage ein Startpasswort mit
Read-Host -AsSecureStringab. Das Lab-Passwortrichtlinie verlangt mindestens 12 Zeichen mit Groß- und Kleinbuchstaben, Zahl und Sonderzeichen. - Lege mit
New-ADUserden Benutzermax.mustermann.tNNan, zuerst mit-WhatIf. - Prüfe, ob er existiert. Setze
DepartmentaufITund füge ihn der GruppeGRP-IThinzu. (Hinweis: Dafür fehlt dir das Recht. Was meldet PowerShell? Warum ist das so gewollt?) - Lösche den Benutzer wieder mit
Remove-ADUser.
Lösung anzeigen
$ou = "OU=T01,OU=Uebung,OU=Kurs,DC=pslab,DC=internal" # deine Nummer einsetzen$pw = Read-Host -AsSecureString -Prompt "Startpasswort"
New-ADUser -Name "Max Mustermann" -SamAccountName max.mustermann.t01 ` -Path $ou -AccountPassword $pw -Enabled $true -WhatIf
New-ADUser -Name "Max Mustermann" -SamAccountName max.mustermann.t01 ` -Path $ou -AccountPassword $pw -Enabled $true
Get-ADUser -Identity max.mustermann.t01Set-ADUser -Identity max.mustermann.t01 -Department ITAdd-ADGroupMember -Identity GRP-IT -Members max.mustermann.t01 # Zugriff verweigert
Remove-ADUser -Identity max.mustermann.t01 -Confirm:$falseSet-ADUser funktioniert in deiner OU. Die Gruppe GRP-IT liegt außerhalb. Dort hast du nur Leserechte (Prinzip der minimalen Rechte).
Im Lab liegt C:\Kurs\Daten\Neue-Mitarbeiter.csv mit den Spalten Vorname, Nachname und Abteilung.
Lege für jede Zeile einen Benutzer in deiner OU an. Der SamAccountName soll vorname.nachname.tNN (alles klein) lauten. Teste zuerst mit -WhatIf. Lösche alle neuen Benutzer danach wieder.
Tipps: foreach, .ToLower(), Import-Csv, ein gemeinsames Startpasswort.
Lösung anzeigen
$ou = "OU=T01,OU=Uebung,OU=Kurs,DC=pslab,DC=internal"$pw = Read-Host -AsSecureString -Prompt "Startpasswort"
foreach ($m in Import-Csv C:\Kurs\Daten\Neue-Mitarbeiter.csv) { $sam = ("{0}.{1}.t01" -f $m.Vorname, $m.Nachname).ToLower() New-ADUser -Name "$($m.Vorname) $($m.Nachname)" ` -GivenName $m.Vorname -Surname $m.Nachname ` -SamAccountName $sam -Department $m.Abteilung ` -Path $ou -AccountPassword $pw -Enabled $true -WhatIf}
# Nach dem Test: -WhatIf entfernen und ausführen. Aufräumen:Get-ADUser -Filter * -SearchBase $ou | Remove-ADUser -Confirm:$falseUmlaute im SamAccountName können Probleme machen. Die Lab-Datei enthält deshalb nur ASCII-Namen.
Remoting
Abschnitt betitelt „Remoting“- Prüfe mit
Test-WSMan, obPSLAB-02erreichbar ist (wenn duPSLAB-02bist, nimmPSLAB-03). Teste auchDC01. - Öffne mit
Enter-PSSessioneine interaktive Sitzung auf dem Nachbarrechner. Lass dir den Rechnernamen (hostname) und den aktuellen Benutzer (whoami) ausgeben und beende die Sitzung. - Führe von deinem Rechner aus mit
Invoke-Commandauf beiden anderen Kursrechnern den Befehlhostnameaus.
Lösung anzeigen
Test-WSMan -ComputerName PSLAB-02Test-WSMan -ComputerName DC01
Enter-PSSession -ComputerName PSLAB-02hostnamewhoamiExit-PSSession
Invoke-Command -ComputerName PSLAB-02, PSLAB-03 -ScriptBlock { hostname }Wenn du PSLAB-01 bist, sind die anderen beiden PSLAB-02 und PSLAB-03.
- Zeige mit
Invoke-Commandden Status des DienstesSpoolerauf den anderen beiden Kursrechnern. Welche Spalte verrät dir, von welchem Rechner die Zeile stammt? - Gib den Dienstnamen über eine Variable an,
$dienst, und übergib sie mit$using:. - Prüfe auf allen drei Rechnern (auch deinem eigenen), welche PowerShell-7-Version installiert ist (
$PSVersionTable.PSVersion). Tipp:-ConfigurationName PowerShell.7. - Liste die zehn größten Dateien in
C:\Kurs\DatenaufPSLAB-02. Kommen die Ergebnisse als „echte” Dateiobjekte zurück? (ProbiereGet-Member.)
Lösung anzeigen
Invoke-Command -ComputerName PSLAB-02, PSLAB-03 -ScriptBlock { Get-Service -Name Spooler } | Select-Object PSComputerName, Name, Status
$dienst = 'Spooler'Invoke-Command -ComputerName PSLAB-02 -ScriptBlock { Get-Service -Name $using:dienst }
Invoke-Command -ComputerName PSLAB-01, PSLAB-02, PSLAB-03 -ConfigurationName PowerShell.7 ` -ScriptBlock { $PSVersionTable.PSVersion.ToString() }
Invoke-Command -ComputerName PSLAB-02 -ScriptBlock { Get-ChildItem C:\Kurs\Daten -Recurse -File | Sort-Object Length -Descending | Select-Object -First 10} | Get-MemberGet-Member zeigt Deserialized.System.IO.FileInfo: Eigenschaften sind da, Methoden fehlen. Remote-Ergebnisse sind Kopien.
- Öffne mit
New-PSSessioneine Sitzung zuPSLAB-02. - Setze darin eine Variable
$x = 42und lies sie in einem zweitenInvoke-Commandwieder aus. Was passiert ohne-Session? - Schließe die Sitzung ordentlich.
Lösung anzeigen
$s = New-PSSession -ComputerName PSLAB-02Invoke-Command -Session $s -ScriptBlock { $x = 42 }Invoke-Command -Session $s -ScriptBlock { $x } # 42Invoke-Command -ComputerName PSLAB-02 -ScriptBlock { $x } # leer: neue SitzungRemove-PSSession $s- Zeige alle Module an, die geladen sind, und alle, die installiert sind.
- Wie viele Cmdlets bringt das Modul
ActiveDirectorymit? - Suche in der PowerShell Gallery nach dem Modul
ImportExcel(Find-PSResourceoderFind-Module) und lies Version und Beschreibung. - Installiere es für deinen Benutzer (ohne Adminrechte).
- Welche Cmdlets enthält es? Finde mit der Hilfe heraus, was
Export-Excelkann, und exportiereGet-Servicein eine Excel-DateiC:\Kurs\Ausgabe\dienste.xlsx. - Entferne das Modul wieder aus der Sitzung.
Lösung anzeigen
Get-ModuleGet-Module -ListAvailableGet-Command -Module ActiveDirectory | Measure-Object
Find-PSResource -Name ImportExcelInstall-PSResource -Name ImportExcel -Scope CurrentUser -TrustRepository
Get-Command -Module ImportExcelGet-Help Export-Excel -ExamplesGet-Service | Export-Excel C:\Kurs\Ausgabe\dienste.xlsx
Remove-Module ImportExcelStatt Install-PSResource funktioniert auch Install-Module -Scope CurrentUser.