Datum izdanja:25. veljače 2025.
Verzija:.NET 8 i novija.NET Framework, sve verzije
Sažetak
Microsoft je uvodio sigurnosna poboljšanja nedavnih verzija sustava Windows. Ta sigurnosna poboljšanja modificiraju temp rukovanje putovima i mogu uzrokovati da .NET Framework i .NET API-ji kao što suSystem.IO.Path.GetTempPath()vraćaju neko drugo mjesto nakon primjene zakrpe.
Potrebna je akcija
Nijedna akcija nije potrebna za .NET Framework ili . Aplikacija utemeljena na NET-u. Vaša će aplikacija automatski imati koristi od svih sigurnosnih poboljšanja koja se odnose na vaše okruženje. Većina aplikacija neće primijetiti promjene u ponašanju.
Ostatak ovog članka sadrži pojedinosti o tome kako utvrditi mogu li ta sigurnosna poboljšanja utjecati na ponašanje vaše aplikacije prilikom izvođenja. U ovom su članku navedeni i koraci za prilagodbu ponašanja izvođenja ako želite
Primjenjivi softver
Ovaj se članak odnosi na sljedeći softver:
-
.NET 8 i noviji
-
.NET Framework, sve verzije, od sigurnosnih ažuriranja i daljnjih ažuriranja iz srpnja 2024.
Samo kada je pokrenuto u sljedećim verzijama servisa Windows Update:
-
Windows 10, verzija 22H2 KB5052077 instalirana
-
Windows Server 2019. kada je KB5053594 instaliran
-
Windows Server 2016. kada je KB5053594 instaliran
Ovaj se članak ne odnosi na .NET Framework ili .NET koji se izvodi Windows 11, Windows Server 2022 ili novijem.
Ovaj se članak ne odnosi na .NET kada je pokrenut na platformama koje nisu windows.
Detaljni opis i izjava o utjecaju
Od prethodno spomenutih KB-ova ažuriranja sustava Windows, Microsoft je podržavao API GetTempPath2 za Win32 na starije verzije sustava Windows na tržištu da bi funkcionirao kao sigurnija zamjena za stariji WIN32 GetTempPath API. Interno se .NET Framework i .NET koriste za win32 API-je da bi omogućili implementaciju metode System.IO.Path.GetTempPath() : API za Win32 GetTempPath2 preferira se ako postoji, a WIN32 GetTempPath API koristi se kao rezervni ako GetTempPath2 ne postoji.
Budući da ovi KB-ovi čine novi WIN32 GetTempPath2 API dostupnim na primjenjivim platformama, .NET Framework i .NET će početi koristiti GetTempPath2 nakon instalacije KB-ova.
Primarna promjena ponašanja jest to što će pozivatelji koji se izvode kao identitet sustava pratiti povrat %WINDIR%\SystemTemp metode System.IO.Path.GetTempPath() po zadanom, dok će pozivatelji koji se izvode kao bilo što drugo osim identiteta sustava primijetiti da će metoda nastaviti vraćati postojeću vrijednost.
Ako aplikacija zadovoljava sve kriterije navedene u nastavku, promjena može utjecati na vas:
-
Aplikacija koristi platformu izvođenja i OS-a navedenu u prethodnom naslovu "Primjenjivi softver". i
-
Aplikacija se pokreće kao identitet sustava; i
-
Ručno postavite varijablu %TMP% ili %TEMP% da biste preusmjerili standardno temp mjesto datoteke. (Pogledajte odjeljak Napomene u dokumentaciji za Win32 GetTempPath API-ja.)
Ako zadovoljavate sve te kriterije, nakon instalacije KB-ova sustava Windows možda ćete primijetiti da aplikacija piše u imeniku koji nije direktorij koji ste na to naužili.
Ta promjena ponašanja može biti vidljiva putem bilo koje .NET Framework ili . NET API koji se naposljetku oslanja na GetTempPath2. Najčešće su ulazne točke sljedeće:
To nije cjelovit popis metoda čije se ponašanje može promijeniti nakon instalacije KB-ova.
Utvrđivanje izvodi li se aplikacija pod identitetom SUSTAVA
Postoji nekoliko različitih mehanizama za utvrđivanje identiteta aplikacije .NET Framework .NET
Web-aplikacije utemeljene na IIS-u
IIS se odnosi na identitet SUSTAVA kao "LOCALSYSTEM". U upravitelju IIS-inetmgr.exe idite na karticu Grupe aplikacija da biste vidjeli sve grupe aplikacija i povezane identitete. Na padajućem izborniku Grupiraj po možete odabrati "Identitet" da biste lakše vidjeli grupe aplikacija koje se izvode kao identitet LOCALSYSTEM-a.
Snimka zaslona u nastavku prikazuje primjer skupa aplikacija ("MyAppPool") koji je konfiguriran za pokretanje kao LOCALSYSTEM. Sve aplikacije pokrenute u ovoj grupi aplikacija pokrenut će se kao identitet sustava.
Tim informacijama možete pristupiti i programski putem povišene sesije komponente PowerShell pomoću skripte u nastavku.
Import-Module IISAdministration Get-IISAppPool | where {$_.ProcessModel.IdentityType -eq "LocalSystem"}
Na računalu konfiguriranom s skupom aplikacija "MyAppPool" na razini SUSTAVA, kao što je prikazano na gornjoj snimci zaslona, ova skripta komponente PowerShell ispisuje sljedeću skriptu koja prikazuje da je "MyAppPool" pokrenut pod identitetom SUSTAVA.
Name Status CLR Ver Pipeline Mode Start Mode ---- ------ ------- ------------- ---------- MyAppPool Started v4.0 Integrated OnDemand
Servisi sustava Windows
Ako je .NET Framework ili . Aplikacija utemeljena na NET-u registrirana je kao servis sustava Windows, pomoću upravitelja servisa možete vidjeti njegov pridruženi identitet.
Iz povišenog naredbenog retka pokrenite services.msc. Time se prikazuje korisničko sučelje upravitelja servisa.
Ako se u stupcu Prijava kao navodi "Lokalni sustav" za identitet servisa, servis se izvodi pod identitetom SUSTAVA.
Te podatke možete i upitirati putem komponente PowerShell pomoću cmdleta Get-Service cmdlet. Da biste, primjerice, te podatke upitali za servis pod nazivom MyService, koristite sljedeću naredbu.
(Get-Service MyService).UserName -ieq "LocalSystem"
Ako je servis registriran za pokretanje pod identitetom SUSTAVA, to će ispisati True na konzolu.
Ostali mehanizmi
Alati kao što su Upravitelj zadataka (taskmgr.exe) ili Sysinternals Process Explorer mogu vam reći i izvodi li se aplikacija pod identitetom SUSTAVA.
U upravitelju zadataka pomoću prikaza Pojedinosti navedite sve pokrenute procese u sustavu, zatim pronađite proces interesa i pogledajte unos u stupcu Korisničko ime.
Ako vrijednost Korisničko ime pročita "SUSTAV", postupak se izvodi pod identitetom SUSTAVA.
Ili u alatu Sysinternals Process Explorer pronađite proces koji vas zanima i unesite prikaz Svojstva, a zatim pogledajte polje Korisnik na kartici Slika.
Ako vrijednost korisnika pročita "NT AUTHORITY\SYSTEM", postupak se izvodi pod identitetom SUSTAVA.
Promjena temp puta za procese na razini SUSTAVA
Skripta komponente PowerShell u nastavku pokazuje kako stvoriti novi direktorij C:\NewSystemTemp\ ograničiti pristup direktorija samo procesima koji se izvode pod identitetom SUSTAVA. Nemojte pokušavati promijeniti ACL-ove direktorija koji je već popunjen datotekama.
Ova skripta mora se pokrenuti iz povišene sesije komponente PowerShell.
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
Možete potvrditi da je ova operacija uspjela pokretanjem naredbe
icacls C:\NewSystemTemp\
Koji će proizvesti sljedeći rezultat koji pokazuje uspjeh:
C:\NewSystemTemp\ NT AUTHORITY\SYSTEM:(OI)(CI)(F) BUILTIN\Administrators:(OI)(CI)(F) Successfully processed 1 files; Failed processing 0 files
Kada stvorite direktorij, postavite varijablu %SYSTEMTEMP% okruženja s opsegom na razini sustava. To možete postaviti putem korisničkog sučelja sustava Upravljačka ploča ili ga programski postaviti putem komponente PowerShell:
[Environment]::SetEnvironmentVariable("SYSTEMTEMP", "C:\NewSystemTemp", [EnvironmentVariableTarget]::Machine)
Zatim ponovno pokrenite uređaj.
Promjenom varijable %SYSTEMTEMP% okruženja neće se promijeniti povratna vrijednost System.IO.Path.GetTempPath() za .NET Framework i .NET aplikacije koje se izvode kao identitet koji nije SYSTEM. Te će aplikacije i dalje pratiti istu logiku razlučivosti koju uvijek imaju, uključujući i %TMP% ili %TEMP% varijabli okruženja ako postoje.
Isto tako, postavljanjem varijable %TMP% ili %TEMP% okruženja neće se promijeniti povratna vrijednost System.IO.Path.GetTempPath() za .NET Framework i .NET aplikacije koje se izvode kao identitet sustava.
Dodatne informacije
Dodatne informacije o .NET Framework i .NET ponašanju potražite u dokumentaciji za .NET na servisu Path.GetTempPath.
Dodatne informacije o funkcioniranju operacijskog sustava Windows u pozadini potražite u dokumentaciji sustava Windows o API-ju za Win32 GetTempPath2.