Změny GetTempPath ve Windows Náhled kumulativní aktualizace z února

Poznámka

  • Datum vydání:
    25 února, 2025
  • Verze:
    .NET 8 a novější
    .NET Framework, všechny verze

Souhrn

Společnost Microsoft zavedla vylepšení zabezpečení do nejnovějších verzí systému Windows. Tato vylepšení zabezpečení upravují zpracování dočasných cest a můžou způsobit, že některá rozhraní .NET Framework a .NET API System.IO.Path.GetTempPath()po provedení opravy vrátí jiné umístění.

Vyžaduje se akce.

Od rozhraní .NET Framework nebo rozhraní .NET Framework není vyžadována žádná akce. Aplikace založená na síti. Vaše aplikace bude automaticky využívat všech vylepšení zabezpečení platných pro vaše prostředí. Většina aplikací nebude pozorovat žádné změny chování.

Zbývající část tohoto článku podrobně popisuje, jak zjistit, jestli tato vylepšení zabezpečení mohou ovlivnit chování aplikace za běhu. Tento článek také obsahuje kroky pro případné přizpůsobení chování modulu runtime

Použitelný software

Tento článek se týká následujícího softwaru:

Jenom při spuštění s následujícími verzemi aktualizací Windows:

  • Windows 10, verze 22H2 při instalaci KB5052077
  • Windows Server 2019 při instalaci KB5053594
  • Windows Server 2016 při instalaci KB5053594

Tento článek se nevztahuje na .NET Framework nebo .NET běžící v systému Windows 11, Windows Server 2022 nebo novějším.

Tento článek se nevztahuje na rozhraní .NET při spuštění na jiných platformách než Windows.

Podrobný popis a prohlášení o dopadu

Od výše zmíněných aktualizací KB pro Windows Microsoft zpětně portoval rozhraní API Win32 GetTempPath2 do starších tržních verzí Windows, aby fungoval jako bezpečnější náhrada staršího rozhraní API Win32 GetTempPath . Interně rozhraní .NET Framework a .NET spoléhají na tato rozhraní API Win32 k zajištění implementace System.IO.Path.GetTempPath() metody: rozhraní API Win32 GetTempPath2 je upřednostňováno, pokud existuje; a rozhraní API Win32 GetTempPath je používáno jako záložní řešení, pokud GetTempPath2 neexistuje.

Vzhledem k tomu, že tyto aktualizace KB zpřístupňují nové rozhraní API Win32GetTempPath2na příslušných platformách, začnou rozhraní .NET Framework a .NET po instalaci aktualizací používat funkci GetTempPath2.

Primární změna chování spočívá v tom, že volající, kteří jsou spuštěni jako SYSTEM identita, budou ve výchozím nastavení pozorovat System.IO.Path.GetTempPath() vrácení %WINDIR%\SystemTemp metody, zatímco volající, kteří jsou spuštěni jako cokoli jiného než SYSTEM identita, uvidí, že metoda nadále vrací její existující hodnotu.

Pokud vaše aplikace splňuje všechna následující kritéria, může se vás tato změna dotknout:

  • Vaše aplikace využívá modul runtime a platformu operačního systému uvedenou ve výše uvedeném oddílu "Příslušný software"; a dále
  • Vaše aplikace běží jako identita SYSTEM. a dále
  • Ručně nastavíte proměnnou %TMP% prostředí or %TEMP% tak, aby přesměrovala standardní umístění dočasného souboru. (Viz část Poznámky ve Win32 GetTempPath Dokumentace k rozhraní API.)

Pokud splňujete všechna tato kritéria, pak po instalaci Windows KB můžete pozorovat, že vaše aplikace zapisuje do jiného dočasného adresáře, než jste zamýšleli.

Tato změna chování může být viditelná prostřednictvím libovolného rozhraní .NET Framework nebo rozhraní . rozhraní API poskytované sítí, které se nakonec spoléhá na GetTempPath2. Nejběžnější vstupní body jsou:

Tento článek nelze chápat jako vyčerpávající seznam metod, jejichž chování se může po instalaci KB změnit.

Určení, jestli aplikace běží pod identitou SYSTEM

Existuje několik různých mechanismů pro určení identity rozhraní .NET Framework nebo aplikace .NET

Webové aplikace založené na službě IIS

Služba IIS označuje identitu SYSTEM jako LOCALSYSTEM. Ve Správci IIS (inetmgr.exe) přejděte na kartu Fondy aplikací a zobrazte si všechny fondy aplikací a jejich přidružené identity. Můžete také vybrat možnost Identita z rozevíracího seznamu Seskupit podle, abyste usnadnili zobrazení fondů aplikací, které běží pod identitou LOCALSYSTEM.

Snímek obrazovky níže ukazuje příklad fondu aplikací ("MyAppPool"), který je nakonfigurovaný tak, aby běžel jako LOCALSYSTEM. Všechny aplikace spuštěné v tomto fondu aplikací budou spuštěny jako identita SYSTEM.

Snímek obrazovky ukazuje příklad fondu aplikací (MyAppPool), který je nakonfigurovaný tak, aby běžel jako LOCALSYSTEM. Všechny aplikace spuštěné v tomto fondu aplikací budou spuštěny jako identita SYSTEM.

K těmto informacím můžete přistupovat také programově z relace PowerShellu se zvýšenými oprávněními pomocí následujícího skriptu.

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

Na počítači nakonfigurovaném s fondem aplikací "MyAppPool" na úrovni systému, jak je znázorněno na výše uvedeném snímku obrazovky, tento skript PowerShellu vytiskne následující a zobrazí, že "MyAppPool" běží pod identitou SYSTEM.

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

Služby Windows

Pokud vaše rozhraní .NET Framework nebo rozhraní . Aplikace založená na síti je registrována jako služba systému Windows, můžete použít Správce služeb k zobrazení její přidružené identity.

Z příkazového řádku se zvýšenými oprávněními spusťte services.mscpříkaz . Zobrazí se uživatelské rozhraní Správce služeb.

Z příkazového řádku se zvýšenými oprávněními spusťte services.msc. Zobrazí se uživatelské rozhraní Správce služeb.

Pokud je ve sloupci Přihlásit jako pro identitu služby uveden "Místní systém", služba běží pod identitou SYSTEM.

Na tato data se můžete také dotazovat prostřednictvím PowerShellu pomocí rutiny Get-Service . Chcete-li například na tyto informace zadat dotaz na službu s názvem MyService, použijte následující příkaz.

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

Pokud je služba registrovaná ke spuštění pod identitou SYSTEM, vytiskne se tato možnost do konzoly jako True.

Další mechanismy

Nástroje, jako je Správce úloh (taskmgr.exe) nebo Průzkumník procesů Sysinternals , vám také můžou sdělit, jestli je aplikace spuštěná pod identitou SYSTEM.

Ve Správci úloh použijte zobrazení podrobností k zobrazení seznamu všech spuštěných procesů v systému, pak vyhledejte proces, který vás zajímá, a podívejte se na položku ve sloupci Uživatelské jméno .

Ve Správci úloh použijte zobrazení podrobností k zobrazení seznamu všech spuštěných procesů v systému, pak vyhledejte proces, který vás zajímá, a podívejte se na položku ve sloupci Uživatelské jméno.

Pokud je v poli Uživatelské jméno uvedeno "SYSTEM", proces běží pod identitou SYSTEM.

Nebo v Průzkumníku procesů Sysinternals vyhledejte proces, který vás zajímá, přejděte do zobrazení Vlastnosti a pak se podívejte na pole Uživatel na kartě Obrázek .

v Průzkumníku procesů Sysinternals vyhledejte proces, který vás zajímá, přejděte do zobrazení Vlastnosti a pak se podívejte na pole Uživatel na kartě Obrázek.

Pokud hodnota User je "NT AUTHORITY\SYSTEM", proces běží pod identitou SYSTEM.

Změna dočasné cesty pro procesy na úrovni systému

Následující skript PowerShellu ukazuje, jak vytvořit nový adresář C:\NewSystemTemp\ a omezit přístup k adresáři jenom na procesy spuštěné pod identitou SYSTEM. Nepokoušejte se měnit seznamy řízení přístupu v adresáři, který je již naplněn soubory.

Tento skript se musí spustit z relace PowerShellu se zvýšenými oprávněními.

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 

Spuštěním tohoto příkazu můžete potvrdit, že tato operace proběhla úspěšně

icacls C:\NewSystemTemp\ 

Výsledkem bude následující úspěšný výstup:

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

Po vytvoření adresáře nastavte proměnnou prostředí s oborem %SYSTEMTEMP% na úrovni systému. Můžete to nastavit pomocí uživatelského rozhraní systému v Ovládací panely systému nebo programově pomocí PowerShellu:

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

Pak restartujte počítač.

Změna proměnné %SYSTEMTEMP% prostředí nezmění návratovou hodnotu System.IO.Path.GetTempPath() pro .NET Framework a .NET aplikace, které běží jako jiná identita než SYSTEM. Tyto aplikace se budou dál řídit stejnou logikou rozlišení, jakou měly vždycky, včetně respektování %TMP% proměnných prostředí nebo %TEMP% , pokud jsou přítomné.

Podobně nastavení proměnné %TMP% prostředí or %TEMP% nezmění návratovou hodnotu System.IO.Path.GetTempPath() pro aplikace .NET Framework a .NET, které běží jako identita SYSTEM.

Další informace

Další informace o rozhraní .NET Framework a chování .NET najdete v dokumentaci k rozhraní .NET na Path.GetTempPath.

Další informace o základním chování operačního systému Windows najdete v dokumentaci k rozhraní API Win32 GetTempPath2.