Udgivelsesdato:25. februar 2025

Version:.NET 8 og nyere.NET Framework, alle versioner

Oversigt

Microsoft har implementeret sikkerhedsforbedringer til de seneste versioner af Windows. Disse sikkerhedsforbedringer ændrer midlertidig håndtering af stier og kan medføre, at visse .NET Framework og .NET-API'er som f.eks.System.IO.Path.GetTempPath()returnerer en anden placering, når programrettelsen er installeret.

Handling påkrævet

Der kræves ingen handling for nogen .NET Framework eller . NET-baseret program. Dit program vil automatisk drage fordel af eventuelle sikkerhedsforbedringer, der gælder for dit miljø. De fleste programmer vil ikke observere nogen adfærdsændringer. 

Resten af denne artikel beskriver, hvordan du kan afgøre, om disse sikkerhedsforbedringer kan påvirke programmets kørselsfunktion. Denne artikel indeholder også trin til tilpasning af kørselsfunktionsmåden, hvis det ønskes

Gældende software

Denne artikel gælder for følgende software: 

Kun, når du kører på følgende versioner af Windows Update: 

  • Windows 10, version 22H2, når KB5052077 er installeret

  • Windows Server 2019, når KB5053594 er installeret 

  • Windows Server 2016, når KB5053594 er installeret 

Denne artikel gælder ikke for .NET Framework eller .NET, der kører på Windows 11, Windows Server 2022 eller nyere. 

Denne artikel gælder ikke for .NET, når du kører på ikke-Windows-platforme. 

Detaljeret beskrivelse og virkningssætning

Fra og med de Windows Update KB'er, der er nævnt ovenfor, har Microsoft tilbageført Win32 GetTempPath2 API'en til ældre versioner af Windows på markedet, så den fungerer som en mere sikker erstatning for den ældre Win32 GetTempPath API. Internt er .NET Framework og .NET afhængige af disse Win32-API'er til at levere implementeringen af System.IO.Path.GetTempPath() -metoden: Win32 GetTempPath2 API foretrækkes, hvis den findes, og Win32 GetTempPath API bruges som en fallback, hvis GetTempPath2 ikke findes. 

Da disse KB'er gør den nye Win32 GetTempPath2 API tilgængelig på de relevante platforme, begynder .NET Framework og .NET at bruge GetTempPath2, når KB'erne er installeret. 

Den primære adfærdsændring er, at opkaldere, der kører som SYSTEM-identiteten, som standard overholder den System.IO.Path.GetTempPath() metode returnerer %WINDIR%\SystemTemp , hvorimod opkaldere, der kører som andet end SYSTEM-identiteten, fortsat vil observere metoden med at returnere den eksisterende værdi. 

Hvis din ansøgning opfylder alle nedenstående kriterier, kan du blive påvirket af denne ændring: 

  • Dit program anvender en runtime- og OS-platform, der er angivet under overskriften "Relevant software". og

  • Dit program kører som SYSTEM-identitet. og

  • Du angiver manuelt miljøvariablen %TMP% eller %TEMP% til at omdirigere den midlertidige standardfilplacering. Se afsnittet Bemærkninger i dokumentationen til Win32 GetTempPath API.

Hvis du opfylder alle disse kriterier, kan du, når Windows KB'erne er installeret, observere, at programmet skriver til en anden midlertidig mappe end den mappe, du havde til hensigt. 

Denne ændring i funktionsmåden kan være synlig via alle .NET Framework eller . NET-provided API, der til sidst er afhængig af GetTempPath2. De mest almindelige indgangspunkter er: 

Dette er ikke beregnet til at være en udtømmende liste over metoder, hvis funktionsmåde kan ændres, når KB'erne er installeret. 

Afgøre, om et program kører under SYSTEM-identiteten 

Der findes flere forskellige mekanismer til bestemmelse af identiteten af et .NET Framework- eller .NET-program

IIS-baserede webprogrammer 

IIS refererer til SYSTEM-identiteten som "LOCALSYSTEM". I IIS Manager (inetmgr.exe) skal du gå til fanen Programgrupper for at få vist alle appgrupper og deres tilknyttede identiteter. Du kan også vælge "Identitet" på rullelisten Gruppér efter for at gøre det nemmere at se appgrupper, der kører som LOCALSYSTEM-identiteten. 

Skærmbilledet nedenfor viser et eksempel på en appgruppe ("MyAppPool"), som er konfigureret til at køre som LOCALSYSTEM. Alle programmer, der kører i denne appgruppe, kører som SYSTEM-identiteten. 

Skærmbilledet viser et eksempel på en appgruppe ("MyAppPool"), der er konfigureret til at køre som LOCALSYSTEM. Alle programmer, der kører i denne appgruppe, kører som SYSTEM-identiteten.

Du kan også få adgang til disse oplysninger programmeringsmæssigt fra en PowerShell-session med administratorrettigheder ved hjælp af scriptet nedenfor. 

Import-Module IISAdministration  Get-IISAppPool | where {$_.ProcessModel.IdentityType -eq "LocalSystem"} 

I en computer, der er konfigureret med en "MyAppPool"-appgruppe på SYSTEM-niveau som vist på skærmbilledet ovenfor, udskriver dette PowerShell-script følgende, der viser, at "MyAppPool" kører under SYSTEM-identiteten. 

Name                 Status       CLR Ver  Pipeline Mode  Start Mode  ----                 ------       -------  -------------  ---------- MyAppPool            Started      v4.0     Integrated     OnDemand 

Windows-tjenester 

Hvis din .NET Framework eller . NET-baseret program er registreret som en Windows-tjeneste. Du kan bruge Tjenestestyring til at få vist den tilknyttede identitet. 

Kør services.mscfra en kommandoprompt med administratorrettigheder. Dette viser brugergrænsefladen for Services Manager. 

Kør services.msc fra en kommandoprompt med administratorrettigheder. Dette viser brugergrænsefladen for Services Manager.

Hvis kolonnen Log på som viser "Lokalt system" for tjenesteidentiteten, kører tjenesten under SYSTEM-identiteten. 

Du kan også forespørge på disse data via PowerShell ved hjælp af cmdlet'en Get-Service . Hvis du f.eks. vil forespørge om disse oplysninger for en tjeneste med navnet MyService, skal du bruge følgende kommando. 

(Get-Service MyService).UserName -ieq "LocalSystem" 

Hvis tjenesten er registreret til at køre under SYSTEM-identiteten, udskrives Sand for konsollen. 

Andre mekanismer 

Værktøjer som Jobliste (taskmgr.exe) eller Sysinternals Process Explorer kan også fortælle dig, om et program kører under SYSTEM-identiteten. 

Brug detaljevisningen i Jobliste til at få vist alle kørende processer i systemet, find derefter den interessante proces, og kig på posten under kolonnen Brugernavn

Brug detaljevisningen i Jobliste til at få vist alle kørende processer i systemet, find derefter den interessante proces, og kig på posten under kolonnen Brugernavn.

Hvis værdien Brugernavn er "SYSTEM", kører processen under SYSTEM-identiteten. 

Eller find den interessante proces i Sysinternals Process Explorer, og angiv visningen Egenskaber , og kig derefter på feltet Bruger under fanen Billede

i Sysinternals Process Explorer skal du finde den interessante proces og angive visningen Egenskaber og derefter se på feltet Bruger under fanen Billede.

Hvis værdien User er "NT AUTHORITY\SYSTEM", kører processen under SYSTEM-identiteten. 

Ændring af den midlertidige sti for processer på SYSTEM-niveau 

PowerShell-scriptet nedenfor viser, hvordan du opretter en ny mappe C:\NewSystemTemp\ og begrænser mappeadgang til processer, der kører under SYSTEM-identiteten. Forsøg ikke at ændre ACL'erne for en mappe, der allerede er udfyldt med filer. 

Dette script skal køres fra en PowerShell-session med administratorrettigheder. 

mkdir C:\NewSystemTemp\  $acl = New-Object System.Security.AccessControl.DirectorySecurity  $acl.SetSecurityDescriptorSddlForm("O:SYG:SYD:PAI(A;OICI;FA;;;SY)(A;OICI;FA;;;BA)")  Set-Acl C:\NewSystemTemp\ -AclObject $acl 

Du kan bekræfte, at handlingen blev gennemført, ved at køre kommandoen 

icacls C:\NewSystemTemp\ 

Som vil producere følgende output viser succes: 

C:\NewSystemTemp\ NT AUTHORITY\SYSTEM:(OI)(CI)(F)                    BUILTIN\Administrators:(OI)(CI)(F)   Successfully processed 1 files; Failed processing 0 files 

Når mappen er oprettet, skal du angive den %SYSTEMTEMP% miljøvariabel med området på systemniveau. Du kan indstille dette via brugergrænsefladen til system Kontrolpanel, eller du kan indstille den programmeringsmæssigt via PowerShell: 

[Environment]::SetEnvironmentVariable("SYSTEMTEMP", "C:\NewSystemTemp", [EnvironmentVariableTarget]::Machine) 

Genstart derefter computeren. 

Hvis du ændrer den %SYSTEMTEMP% miljøvariabel, ændres returværdien af System.IO.Path.GetTempPath()ikke for .NET Framework- og .NET-programmer, der kører som en anden identitet end SYSTEM. Disse programmer vil fortsat følge den samme løsningslogik, de altid har, herunder overholde %TMP% eller %TEMP% miljøvariabler, hvis de findes. 

På samme måde ændrer indstilling af miljøvariablen %TMP% eller %TEMP% ikke returværdien af System.IO.Path.GetTempPath() for .NET Framework- og .NET-programmer, der kører som SYSTEM-identiteten. 

Yderligere oplysninger

Du kan få mere at vide om .NET Framework og .NET-funktionsmåder i .NET-dokumentationen på Path.GetTempPath

Du kan få mere at vide om den underliggende funktionsmåde for Windows-operativsystemet i Windows-dokumentationen til Win32 GetTempPath2 API.

Har du brug for mere hjælp?

Vil du have flere indstillinger?

Udforsk abonnementsfordele, gennemse kurser, få mere at vide om, hvordan du sikrer din enhed og meget mere.