====== Allgemeine Beispiele für PowerShell im AD ====== ===== User, Gruppen und Computer ===== **User auslesen:**\\ alle nicht deaktiverten Domänen-User auslesen und nur den Namen anzeigen: get-aduser -ldapfilter "(&(&(objectCategory=user)(userAccountControl=512)))" | where-object -property enabled -eq true | fl name userAccountControl=512 heißt "NORMAL_ACCOUNT", siehe:[[https://support.microsoft.com/en-us/help/305144/how-to-use-useraccountcontrol-to-manipulate-user-account-properties]]\\ **Gruppen auslesen:** Get-ADGroup -Filter "GroupScope -eq 'Global' -and GroupCategory -eq 'Security'" **verschachtelte AD-Gruppen-Mitgliedschaften (nested):**\\ sh. [[https://gallery.technet.microsoft.com/scriptcenter/Get-nested-group-15f725f2]] Get-ADNestedGroupMembers "GroupName" **Computer auslesen:** Get-ADComputer -filter 'name -like "*"' -Properties * | select name,OperatingSystem,IPv4Address'' **Username zu SID**: (New-Object System.Security.Principal.NTAccount($(read-host -prompt "Username"))).Translate([System.Security.Principal.SecurityIdentifier]).value **Benutzer remote von Arbeitsplatz abmelden**:\\ Step 1: Wer ist an dem System angemeldet? Invoke-Command -ComputerName REMOTECOMPUTER-X -ScriptBlock {quser} Die Ausgabe dazu sieht wie folgt aus: BENUTZERNAME SITZUNGSNAME ID STATUS LEERLAUF ANMELDEZEIT USER_TO_LOG_OFF 1 Getr. 36 06.07.2022 07:37 2ND_USER rdp-tcp#0 3 Aktiv . 06.07.2022 13:49 Step 2: Benutzer über Session-ID abmelden: Invoke-Command -ComputerName vm-133 -ScriptBlock {logoff 1} Das Ganze halbwegs automatisiert als Skript: $User=Read-Host "SamAccountName eingeben" # Anmeldelogs nach dem System des Benutzers durchsuchen $Directory="\\vbw-bochum.local\dfs\Logondaten\benutzer" $Files=Get-ChildItem $Directory -File $UserSystems=@() foreach ($File in $Files) { foreach($line in Get-Content ($File.FullName)) { if($line -like "Rechner*") { $item=New-Object -type psobject | Add-Member -MemberType NoteProperty -Name "SamAccountName" -Value $File.name.TrimEnd(".txt") -PassThru | add-member -MemberType NoteProperty -Name "System" -Value $line.TrimStart("Rechner: ") -PassThru | Add-Member -MemberType NoteProperty -Name "Erfassungsdatum" -Value $File.lastwritetime -PassThru } } $UserSystems += $item } $system=(($UserSystems | Where-Object samaccountname -like $User).system).trimend(" ") # Auf dem gefundenen System nach Sessions mit dem Anmeldenamen suchen Invoke-Command -ComputerName $system -ScriptBlock ` { $sessions=quser | Where-Object {$_ -match "$($user:using)"} $sessions $SessionIDs=@() foreach ($line in $sessions) { if ($line -notlike "*Benutzername*" -and $line -notlike "*Aktiv*") { #replace "\s{2,}",";" => Ersetze alle mehr als 2x aufeinanderfolgenden Leerzeichen durch ein ; $SessionIDs+=($line -replace "\s{2,}",";").split(";")[2] } } foreach ($SessionID in $SessionIDs) { logoff $SessionID } } **Horizon-Anmeldedienst starten**:\\ Invoke-Command -ComputerName REMOTECOMPUTER-X -ScriptBlock {Get-Service vmlm | start-service} ===== Arbeiten am AD ===== **Anbinden einer Domäne als PSDrive** New-PSDrive -Name AD2 -PSProvider ActiveDirectory -Server $FQDN_DC_ServerName -root "//RootDSE/" **DNS abfragen**: Get-DnsServerZone -ComputerName DNSSERVERNAME **Alle DomainController abfragen** (Get-ADForest).Domains | %{ Get-ADDomainController -Filter * -Server $_ } **Subnets in Sites and Services** Get-ADReplicationSubnet -filter * -Properties * | Select Name, Site, Location, Description **Exchange-Version** Get-ADObject "CN=ms-Exch-Schema-Version-Pt,$((Get-ADRootDSE).schemaNamingContext)" -Property Rangeupper ==== Bilder konvertieren ==== Eigentlich ist das kein Powershell-Problem. Bilder können über eine beliebige Shell sehr gut mit Hilfe von ImageMagick konvertiert werden.\\ **Alle *.HEIC Dateien im aktuellen Verzeichnis nach ''.PNG'' konvertieren:** magick mogrify -monitor -format PNG *.heic **Wahlweise nach ''.JPG'':** magick mogrify -monitor -format JPG *.heic **Eine einzelne Datei konvertieren:** magick convert IMG_1874.HEIC IMG_1874.jpg