Zum Inhalt
run once at startup with intune
Home » Run once at Startup – Intune

Run once at Startup - Intune

Immer mal wieder kann es nützlich sein, eine Aktion, als eine "Run once at Startup" Script einmalig als Benutzer oder System beim Start des Computers auszuführen. Intune hat keine "Run once at Startup" Funktion. Darum habe ich zwei Scripts erstellt, mit welchen ich die Möglichkeit habe, eine Änderung oder Bereinigung durchzuführen, bevor der Endbenutzer ein Programm geöffnet hat, oder in einen Fehler läuft. Dies habe ich beispielsweise beim "Clear Microsoft Teams cache once" eingesetzt.

Da ein Script nicht immer mit derselben Berechtigung ausgeführt werden muss, wende ich zwei unterschiedliche Methoden an. Die Erste ist via Scheduled Task und führt das Script als "System" User aus. So ist gewährleistet, dass auch Tasks mit erhöhten Rechten oder beispielsweise für alle User gleichzeitig ausgeführt werden können.
Die zweite Version nützt die Funktion des "RunOnce-Registry Keys". Dadurch wird das Script einmalig als User ausgeführt. Beie Script kannst du sehr einfach mit Intune und somit als "Run once at Startup" verteilen.

Deinen Code fügst du bei beiden Scripts nach dem Kommentar ein und löschst den "Write-Host" Part:

Run once code, Intune

Run one at Startup - as User

Für die Ausführung eines Tasks als Benutzer gibt es in Windows einen, beziehungsweise zwei einfachen Registry Einträge, welche verwendet werden können.

Dies sind folgende zwei:

  • HKCU:\Software\Microsoft\Windows\CurrentVersion\RunOnce
  • HKLM:\Software\Microsoft\Windows\CurrentVersion\RunOnce


Der Erste, welcher im "Current User" ist, führ nur bei dem spezifischen Benutzer selbst den Task aus.
Im zweiten, der sich im "Local Machine" Kontext befindet, wird der Task bei jedem Benutzer einmalig ausgeführt.

In meinem Script habe ich beide Fälle abgefangen.
Wenn du das Script in Intune als PowerShell Script verteilst (Devices > Windows > PowerShell scripts), kannst du in den Optionen bei "Run this script using the logged on credentials", "Ja" oder "Nein" auswählen. Mit "Ja", wird das Script nur auf dem zugewiesenen Benutzer (Das Script sollte dann einer Benutzer Gruppe zugewiesen werden) ausgeführt. Mit "Nein" wird das Script als System ausgeführt und der Registry Eintrag im "Local Machine" Content gesetzt.

Intune PowerShell as user or system

Das Script wird nach der Ausführung nicht gelöscht, da es von mehreren Usern verwendet werden kann.

Run one at Startup - as System

Um das Script einmalig beim Star des Computers als System auszuführen, verwende ich einen "Scheduled Task". Dieser Task wird beim Start ausgeführt, führt dabei sein definiertes Script aus, welches er im Anschluss löscht. Zudem wird auch der "Scheduled Task" selbst gelöscht, sodass auf dem Computer nach der Ausführung, ausser dem Log keine Reste mehr vorhanden sind.

Hier muss bei der Verteilung zwingend die Ausführung als System ausgewählt sein:

Intune, PowerShell run as system

3 Gedanken zu „Run once at Startup - Intune“

  1. Pingback: Teams im Hintergrund öffnen | scloud

  2. Hey nice article,

    I downloaded your script to test it out, (run as system)
    when I run it I receive an error about:
    Cannot bind argument to parameter 'Path' because it is an empty string.
    + CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException

    I didn't edit the script, I just downloaded it and run it without editing what so ever.
    This is the full error output from Powershell:

    $PackageName = "run-once"
    $Version = "1"
    $Path_4netIntune = "$Env:Programfiles\4net\EndpointManager"
    Start-Transcript -Path "$Path_4netIntune\Log\$PackageName.log" -Force
    try{
    # Check if Task exist with correct version
    $task_existing = Get-ScheduledTask -TaskName $PackageName -ErrorAction SilentlyContinue
    if($task_existing.Description -like "Version $Version*"){
    ############################################################################################
    # YOUR CODE TO RUN ONCE
    Write-Host "GUGUS :)"
    # END RUN ONCE CODE
    ############################################################################################
    # Delete ScheduledTask
    Unregister-ScheduledTask -TaskName $PackageName -Confirm:$false
    # Delete Script
    Remove-Item -Path $MyInvocation.MyCommand.Source
    }else{
    # script path
    $script_path = "$Path_4netIntune\Data\$PackageName.ps1"
    # get and save file content
    Get-Content -Path $($PSCommandPath) | Out-File -FilePath $script_path -Force

    # Register scheduled task to run at startup
    $schtaskDescription = "Version $Version"
    $trigger = New-ScheduledTaskTrigger -AtStartup
    $principal= New-ScheduledTaskPrincipal -UserID "NT AUTHORITY\SYSTEM" -LogonType "ServiceAccount" -RunLevel "Highest"
    $action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-ExecutionPolicy Bypass -File `"$script_path`""
    $settings= New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries
    Register-ScheduledTask -TaskName $PackageName -Trigger $trigger -Action $action -Principal $principal -Settings $settings -Description $schtaskDescription -Force
    }
    }catch{
    Write-Error $_
    }
    Stop-Transcript : Cannot bind argument to parameter 'Path' because it is an empty string.
    + CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException

    1. Did you paste in the content itself or did you call the script?
      If you paste in the content in a Terminal, it won't work, cause of the "$PSCommandPath", which is the script itself.
      If you run a terminal as system, just call the script with its pat like &"C:\...\script.ps1"

Schreiben Sie einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

de_CHDE