Utgivelsesdato:25. februar 2025

Versjon:.NET 8 og nyere.NET Framework, alle versjoner

Sammendrag

Microsoft har rullet ut sikkerhetsforbedringer til nyere versjoner av Windows. Disse sikkerhetsforbedringene endrer håndtering av midlertidig bane og kan føre til at visse .NET Framework og .NET-API-er somSystem.IO.Path.GetTempPath()returnerer en annen plassering etter at oppdateringen er tatt i bruk.

Handling kreves

Ingen handling kreves for noen .NET Framework eller . NET-basert program. Programmet vil automatisk dra nytte av eventuelle sikkerhetsforbedringer som gjelder for miljøet ditt. De fleste programmer vil ikke observere noen atferdsendring. 

Resten av denne artikkelen beskriver hvordan du fastslår om disse sikkerhetsforbedringene kan påvirke kjøretidsvirkemåten til programmet. Denne artikkelen viser også trinnene for tilpassing av virkemåten for kjøretid hvis du ønsker det

Gjeldende programvare

Denne artikkelen gjelder for følgende programvare: 

Bare når du kjører på følgende Windows Update-versjoner: 

  • Windows 10, versjon 22H2 når KB5052077 er installert

  • Windows Server 2019 når KB5053594 er installert 

  • Windows Server 2016 når KB5053594 er installert 

Denne artikkelen gjelder ikke for .NET Framework eller .NET som kjører på Windows 11, Windows Server 2022 eller nyere. 

Denne artikkelen gjelder ikke for .NET når du kjører på ikke-Windows-plattformer. 

Detaljert beskrivelse og konsekvensuttrykk

Fra og med Windows Update-KB-er nevnt ovenfor, har Microsoft støttet Win32 GetTempPath2-API-en til eldre markedsversjoner av Windows for å fungere som en sikrere erstatning for den eldre Win32 GetTempPath-API-en . Internt er .NET Framework og .NET avhengige av disse Win32-API-ene for å gi implementeringen av System.IO.Path.GetTempPath() -metoden: Win32- GetTempPath2 -API-en foretrekkes hvis den finnes, og Win32- GetTempPath -API-en brukes som et tilbakefall hvis GetTempPath2 ikke finnes. 

Siden disse KB-ene gjør den nye Win32- GetTempPath2 API-en tilgjengelig på gjeldende plattformer, begynner .NET Framework og .NET å bruke GetTempPath2 når KB-ene er installert. 

Den primære atferdsendringen er at innringere som kjører som SYSTEM-identitet, observerer System.IO.Path.GetTempPath() metoden returnerer %WINDIR%\SystemTemp som standard, mens innringere som kjører som noe annet enn SYSTEM-identiteten, observerer metoden, fortsetter å returnere den eksisterende verdien. 

Hvis programmet oppfyller alle vilkårene nedenfor, kan du bli påvirket av denne endringen: 

  • Programmet bruker en runtime- og OS-plattform som er oppført under den tidligere overskriften «Gjeldende programvare». og

  • Programmet kjører som SYSTEM-identitet. og

  • Du angir manuelt miljøvariabelen %TMP% eller %TEMP% for å omdirigere standard temp-filplassering. (Se Merknader-delen av Win32- GetTempPath API-dokumentasjonen.)

Hvis du oppfyller alle disse kriteriene, kan det hende du ser at programmet skriver til en annen midlertidig katalog enn katalogen du hadde tenkt deg når Windows-KB-ene er installert. 

Denne atferdsendringen kan være synlig gjennom alle .NET Framework eller . NET-levert API som etter hvert er avhengig av GetTempPath2. De vanligste inngangspunktene er: 

Dette er ikke ment å være en fullstendig liste over metoder som har virkemåter som kan endres når KB-ene er installert. 

Fastslå om et program kjører under SYSTEM-identiteten 

Det finnes flere ulike mekanismer for å fastslå identiteten til et .NET Framework- eller .NET-program

IIS-baserte nettprogrammer 

IIS refererer til SYSTEM-identiteten som LOCALSYSTEM. Gå til Programutvalg-fanen i IIS Manager (inetmgr.exe) for å se alle apputvalgene og de tilknyttede identitetene. Du kan også velge «Identitet» fra gruppen etter rullegardinliste for å gjøre det enklere å se apputvalg som kjører som LOCALSYSTEM-identitet. 

Skjermbildet nedenfor viser et eksempel på et apputvalg ("MyAppPool") som er konfigurert til å kjøre som LOCALSYSTEM. Alle programmer som kjører i dette apputvalget, kjøres som SYSTEM-identitet. 

Skjermbildet viser et eksempel på et apputvalg ("MyAppPool") som er konfigurert til å kjøre som LOCALSYSTEM. Alle programmer som kjører i dette apputvalget, kjøres som SYSTEM-identitet.

Du kan også få tilgang til denne informasjonen programmatisk fra en hevet PowerShell-økt ved hjelp av skriptet nedenfor. 

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

I en maskin som er konfigurert med et System-nivå i «MyAppPool»-apputvalget, som vist i skjermbildet ovenfor, skriver Dette PowerShell-skriptet ut følgende, som viser at «MyAppPool» kjører under SYSTEM-identiteten. 

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

Windows-tjenester 

Hvis .NET Framework eller . NET-basert program er registrert som en Windows-tjeneste, du kan bruke Tjenestebehandling til å vise den tilknyttede identiteten. 

Kjør services.mscfra en hevet ledetekst. Dette viser brukergrensesnittet for Tjenestebehandling. 

Kjør services.msc fra en hevet ledetekst. Dette viser brukergrensesnittet for Tjenestebehandling.

Hvis påloggingskolonnen viser «lokalt system» for tjenesteidentiteten, kjører tjenesten under SYSTEM-identiteten. 

Du kan også spørre disse dataene via PowerShell ved hjelp av Get-Service cmdlet. Hvis du for eksempel vil spørre denne informasjonen etter en tjeneste kalt MyService, bruker du følgende kommando. 

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

Hvis tjenesten er registrert til å kjøre under SYSTEM-identiteten, skriver dette ut True til konsollen. 

Andre mekanismer 

Verktøy som Oppgavebehandling (taskmgr.exe) eller Sysinternals Process Explorer kan også fortelle deg om et program kjører under SYSTEM-identiteten. 

Bruk Detaljvisning i Oppgavebehandling til å vise alle prosessene som kjører i systemet, og finn deretter prosessen for interesse og se på oppføringen under kolonnen Brukernavn

Bruk Detaljvisning i Oppgavebehandling til å vise alle prosessene som kjører i systemet, og finn deretter prosessen for interesse og se på oppføringen under kolonnen Brukernavn.

Hvis brukernavnverdien leser «SYSTEM», kjører prosessen under SYSTEM-identiteten. 

Eller finn interesseprosessen i Sysinternals Process Explorer, og angi Egenskaper-visningen , og se deretter på Bruker-feltet under Bilde-fanen

i Sysinternals Prosessutforsker finner du interesseprosessen og angir Egenskaper-visningen, og deretter ser du på Bruker-feltet under bildefanen.

Hvis brukerverdien leser NT AUTHORITY\SYSTEM, kjører prosessen under SYSTEM-identiteten. 

Endre den midlertidige banen for prosesser på SYSTEMnivå 

PowerShell-skriptet nedenfor demonstrerer hvordan du oppretter en ny katalog C:\NewSystemTemp\ og begrenser katalogtilgang til bare prosesser som kjører under SYSTEM-identiteten. Ikke prøv å endre tilgangskontrollister for en katalog som allerede er fylt ut med filer. 

Dette skriptet må kjøres fra en hevet PowerShell-økt. 

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 bekrefte at denne operasjonen var vellykket ved å kjøre kommandoen 

icacls C:\NewSystemTemp\ 

Som vil produsere følgende utdata som viser suksess: 

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

Når katalogen er opprettet, angir du miljøvariabelen %SYSTEMTEMP% med systemnivåomfang. Du kan angi dette via brukergrensesnittet for System Kontrollpanel, eller du kan angi det programmatisk via PowerShell: 

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

Start deretter maskinen på nytt. 

Hvis du endrer miljøvariabelen for %SYSTEMTEMP% , endres ikke returverdien for System.IO.Path.GetTempPath() for .NET Framework- og .NET-programmer som kjører som en annen identitet enn SYSTEM. Disse programmene vil fortsette å følge den samme oppløsningslogikken de alltid har, inkludert å overholde %TMP% eller %TEMP% miljøvariabler hvis de finnes. 

På samme måte vil ikke angivelse av miljøvariabelen for %TMP% eller %TEMP% endre returverdien for System.IO.Path.GetTempPath() for .NET Framework- og .NET-programmer som kjører som SYSTEM-identitet. 

Hvis du vil ha mer informasjon

Hvis du vil ha mer informasjon om virkemåter for .NET Framework og .NET, kan du se .NET-dokumentasjonen på Path.GetTempPath

Hvis du vil ha mer informasjon om den underliggende Virkemåten for Windows OS, kan du se Windows-dokumentasjonen om Win32 GetTempPath2-API-en.

Trenger du mer hjelp?

Vil du ha flere alternativer?

Utforsk abonnementsfordeler, bla gjennom opplæringskurs, finn ut hvordan du sikrer enheten og mer.