Grundlegende Einrichtung von PowerShell für Schul-PC-Admins
Tipp für Admins:
Führe das in pwsh.exe (PowerShell 7) aus, da es moderner ist.
Da Version 7 in Windows meist parallel mit PowerShell 5.1 läuft, bitte beachten, dass Module pro Version installiert werden müssen!
Teste mit Get-Module -ListAvailable, welche Module in welchen Versionen vorhanden sind.
Ausführungsrichtlinie
Die Ausführungsrichtlinie auf RemoteSigned setzen erlaubt lokale Skripte ohne Signatur, aber Internet-Skripte brauchen eine – sicher und praktisch für schnelle Tests auf Schul-PCs.
Das PowerShell Gallery (offizieller Modul-Shop) als vertrauenswürdig markieren, damit du Module ohne Extra-Bestätigung installieren kannst – spart Zeit bei umfangreicheren Verwaltungsaufgaben.
Diese Module sind essenziell für Schul-PC-Verwaltung via Intune (Geräte, Apps, Policies deployen). Installiere sie pro PowerShell-Version (5.1 und 7.x separat). Jeder Eintrag hat 1-2 Sätze: Was es macht und warum nützlich.
Microsoft.Graph: Die moderne API-Schnittstelle zu Microsoft-Diensten (Intune, Teams, etc.). Ermöglicht z.B. PC-Listen abzurufen oder Policies zu setzen.
microsoft.graph.intune: Speziell für Intune-Geräteverwaltung. Hilft, Schul-PCs zuzuweisen, Software zu pushen oder Compliance zu prüfen – ideal für tägliche Admin-Aufgaben.
Microsoft.Graph.DeviceManagement.Administration: Erweiterung für detaillierte Intune-Kontrolle (z.B. Audit-Events, Cloud-PCs). Nützlich, um Probleme auf Schüler-PCs zu diagnostizieren und zu fixen.
Weitere für Microsoft-Services (SharePoint, Exchange, Teams)
IntuneEndpointTools: Diagnose-Tools direkt auf Schul-PCs. Z.B. Sync mit Intune erzwingen, Logs sammeln oder Apps neu starten – perfekt, wenn ein PC "hängt" .
Nach Installation
Import-Module <Name> laden.
Für Intune: Connect-MgGraph -Scopes "DeviceManagementManagedDevices.ReadWrite.All" (Login mit Admin-Account).
Connect-MgGraph: Sichere Anmeldung bei Microsoft Graph (inkl. Intune). Gibt dir Zugriff auf alle Dienste – wie ein Master-Key für Admin-Aufgaben; Scopes definieren, was du darfst.
Skript zur automatischen Installation
Schuladmin-PowerShell-SetUp-Skript
Dieses Script setzt optional die Execution Policy, vertraut PSGallery, installiert die wichtigsten Module für die Schulcomputer-Administration und kann auf Wunsch auch gleich die Anmeldung an Microsoft Graph starten.
Inhalt
Das Skript installiert moderne Module wie Microsoft.Graph, Microsoft.Graph.DeviceManagement, Microsoft.Graph.DeviceManagement.Administration, ExchangeOnlineManagement, MicrosoftTeams, Microsoft.Online.SharePoint.PowerShell und IntuneEndpointTools, weil diese für Intune-, M365- und Schul-PC-Verwaltung sinnvoll sind. Veraltete Module wie AzureAD und MSOnline sind nicht standardmäßig enthalten und werden nur per Schalter ergänzt, weil sie nur noch für Altskripte gedacht sind.
Verwendung
Normale Ausführung für den aktuellen Benutzer:
.\Schuladmin-PowerShell-Setup.ps1
Systemweit für alle Benutzer:
.\Schuladmin-PowerShell-Setup.ps1 -AllUsers
Mit alten AzureAD/MSOnline-Modulen für Legacy-Skripte:
Das Skript ist so gebaut, dass es auch unter Windows PowerShell 5.1 lauffähig bleibt, gleichzeitig aber moderne Graph-/Intune-Module bevorzugt. Für neue Admin-Skripte auf Schulgeräten ist PowerShell 7 meist die bessere Zielplattform, aber für manche Altlasten bleibt 5.1 relevant.
Skript
Das folgende Skript als Schuladmin-PowerShell-Setup.ps1 abspeichern.
#requires -Version 5.1
[CmdletBinding(SupportsShouldProcess = $true)]
param(
[switch]$AllUsers,
[switch]$IncludeLegacyAzureAD,
[switch]$SkipExecutionPolicy,
[switch]$SkipRepositoryTrust,
[switch]$ConnectGraph,
[string[]]$GraphScopes = @('DeviceManagementManagedDevices.ReadWrite.All','Group.ReadWrite.All')
)
Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'
function Write-Info {
param([string]$Message)
Write-Host "[INFO] $Message" -ForegroundColor Cyan
}
function Write-WarnMsg {
param([string]$Message)
Write-Host "[HINWEIS] $Message" -ForegroundColor Yellow
}
function Install-RequiredModule {
param(
[Parameter(Mandatory)] [string]$Name,
[string]$MinimumVersion,
[switch]$AllowClobber
)
$installParams = @{
Name = $Name
Force = $true
}
if ($AllUsers) {
$installParams['Scope'] = 'AllUsers'
}
else {
$installParams['Scope'] = 'CurrentUser'
}
if ($MinimumVersion) {
$installParams['MinimumVersion'] = $MinimumVersion
}
if ($AllowClobber) {
$installParams['AllowClobber'] = $true
}
$installed = Get-Module -ListAvailable -Name $Name | Sort-Object Version -Descending | Select-Object -First 1
if ($installed -and (-not $MinimumVersion -or $installed.Version -ge [version]$MinimumVersion)) {
Write-Info "$Name ist bereits installiert (Version $($installed.Version))."
return
}
if ($PSCmdlet.ShouldProcess($Name, 'Install-Module')) {
Write-Info "Installiere Modul: $Name"
Install-Module @installParams
}
}
Write-Info "Starte PowerShell-Grundeinrichtung für die Verwaltung von Schulcomputern."
Write-Info "PowerShell-Version: $($PSVersionTable.PSVersion)"
Write-Info "Installationsziel: $(if ($AllUsers) { 'AllUsers' } else { 'CurrentUser' })"
if (-not $SkipExecutionPolicy) {
if ($PSCmdlet.ShouldProcess('CurrentUser', 'Set-ExecutionPolicy RemoteSigned')) {
Write-Info 'Setze die Ausführungsrichtlinie für den aktuellen Benutzer auf RemoteSigned.'
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser -Force
}
}
else {
Write-WarnMsg 'Ausführungsrichtlinie wurde übersprungen.'
}
if (-not $SkipRepositoryTrust) {
if ($PSCmdlet.ShouldProcess('PSGallery', 'Set-PSRepository Trusted')) {
Write-Info 'Markiere PSGallery als vertrauenswürdiges Repository.'
Set-PSRepository -Name 'PSGallery' -InstallationPolicy Trusted
}
}
else {
Write-WarnMsg 'PSGallery-Vertrauensstellung wurde übersprungen.'
}
$modules = @(
@{ Name = 'PowerShellGet'; AllowClobber = $true; Beschreibung = 'Verwaltet die Installation weiterer Module.' },
@{ Name = 'Microsoft.Graph'; AllowClobber = $true; Beschreibung = 'Zentrale Schnittstelle zu Microsoft 365 und Intune.' },
@{ Name = 'Microsoft.Graph.DeviceManagement'; AllowClobber = $true; Beschreibung = 'Cmdlets für Geräteverwaltung in Intune.' },
@{ Name = 'Microsoft.Graph.DeviceManagement.Administration'; AllowClobber = $true; Beschreibung = 'Erweiterte Intune-Verwaltung und Auswertung.' },
@{ Name = 'Microsoft.Online.SharePoint.PowerShell'; AllowClobber = $true; Beschreibung = 'Verwaltung von SharePoint Online.' },
@{ Name = 'ExchangeOnlineManagement'; AllowClobber = $true; Beschreibung = 'Verwaltung von Exchange Online.' },
@{ Name = 'MicrosoftTeams'; AllowClobber = $true; Beschreibung = 'Verwaltung von Microsoft Teams.' },
@{ Name = 'IntuneEndpointTools'; AllowClobber = $true; Beschreibung = 'Hilft bei Diagnose und lokalen Intune-Aktionen auf Clients.' }
)
if ($PSVersionTable.PSVersion.Major -ge 7) {
$modules += @{ Name = 'Microsoft.Graph.Intune'; AllowClobber = $true; Beschreibung = 'Älteres Intune-Graph-Modul; nur bei Bedarf für vorhandene Skripte.' }
}
else {
Write-WarnMsg 'Microsoft.Graph.Intune wird hier nicht automatisch ergänzt; für neue Skripte ist Microsoft.Graph vorzuziehen.'
}
if ($IncludeLegacyAzureAD) {
Write-WarnMsg 'Legacy-Module AzureAD und MSOnline gelten als veraltet und sollten nur für Alt-Skripte genutzt werden.'
$modules += @(
@{ Name = 'AzureAD'; AllowClobber = $true; Beschreibung = 'Veraltetes AzureAD-Modul für ältere Skripte.' },
@{ Name = 'MSOnline'; AllowClobber = $true; Beschreibung = 'Sehr altes Modul für Altumgebungen.' }
)
}
foreach ($module in $modules) {
Write-Info "$($module.Name): $($module.Beschreibung)"
Install-RequiredModule -Name $module.Name -AllowClobber:([bool]$module.AllowClobber)
}
Write-Info 'Installierte Modulpfade in dieser PowerShell-Umgebung:'
$env:PSModulePath -split [IO.Path]::PathSeparator | ForEach-Object { Write-Host " - $_" }
if ($ConnectGraph) {
if (Get-Module -ListAvailable -Name Microsoft.Graph.Authentication) {
Write-Info "Starte Anmeldung an Microsoft Graph mit Scopes: $($GraphScopes -join ', ')"
Connect-MgGraph -Scopes $GraphScopes
}
else {
Write-WarnMsg 'Microsoft.Graph.Authentication wurde nicht gefunden; Anmeldung wird übersprungen.'
}
}
else {
Write-Info "Für die Anmeldung an Microsoft Graph später ausführen: Connect-MgGraph -Scopes '$($GraphScopes -join "','")'"
}
Write-Info 'Fertig. Prüfe die verfügbaren Module mit: Get-Module -ListAvailable'