====== 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