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:
-
.NET 8 og nyere
-
.NET Framework, alle versioner fra og med juli 2024-sikkerhedsopdateringer og efterfølgende opdateringer
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.
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.
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 .
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 .
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.