Datum vydání:25. února 2025

Verze:.NET 8 a novější.NETFramework, všechny verze

Shrnutí

Společnost Microsoft zavedla vylepšení zabezpečení pro nejnovější verze Windows. Tato vylepšení zabezpečení upravují zpracování dočasných cest a mohou způsobit, že některá rozhraní .NET Framework a rozhraní .NET API, jako jeSystem.IO.Path.GetTempPath(), po použití opravy vrátí jiné umístění.

Vyžaduje se akce.

U rozhraní .NET Framework nebo . Aplikace založená na technologii NET. Vaše aplikace bude automaticky využívat všechna vylepšení zabezpečení, která se vztahují na vaše prostředí. Většina aplikací nepozoruje žá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 obsahuje také postup přizpůsobení chování za běhu v případě potřeby.

Příslušný software

Tento článek se vztahuje na následující software: 

Pouze při spuštění v následujících verzích windows update: 

  • 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 rozhraní .NET Framework nebo .NET spuštěné na Windows 11, Windows Server 2022 nebo novější. 

Tento článek se nevztahuje na .NET, pokud běží na jiných platformách než Windows. 

Podrobný popis a prohlášení o dopadu

Od výše uvedených znalostních sad Windows Update Společnost Microsoft zpětně převést rozhraní Win32 GetTempPath2 API na starší verze Windows, aby fungovala jako bezpečnější náhrada staršího rozhraní API Win32 GetTempPath . Rozhraní .NET Framework a .NET se při implementaci metody System.IO.Path.GetTempPath() interně spoléhají na tato rozhraní API Win32: Pokud existuje, je preferované rozhraní API GetTempPath2 Win32; a rozhraní WIN32 GetTempPath API se použije jako záložní řešení, pokud GetTempPath2 neexistuje. 

Vzhledem k tomu, že tyto znalostní báze zpřístupnily nové rozhraní Win32 GetTempPath2 API na příslušných platformách, začnou rozhraní .NET Framework a .NET používat GetTempPath2 po instalaci znalostní báze. 

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

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

  • Vaše aplikace využívá modul runtime a platformu operačního systému uvedené v dřívějším nadpisu "Příslušný software"; a

  • Vaše aplikace běží jako identita SYSTÉMU. a

  • Ručně nastavíte proměnnou prostředí %TMP% nebo %TEMP% tak, aby přesměrovává standardní umístění dočasného souboru. (Viz část Poznámky v dokumentaci k rozhraní WIN32 GetTempPath API.)

Pokud splňujete všechna tato kritéria, pak po instalaci znalostní báze Windows můžete sledovat, jak vaše aplikace píše do jiného dočasného adresáře, než je adresář, který jste zamýšleli. 

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

Toto není zamýšleno jako vyčerpávající seznam metod, jejichž chování se může po instalaci znalostních databází změnit. 

Určení, jestli se aplikace spouští 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 služby IIS (inetmgr.exe) přejděte na kartu Fondy aplikací a zobrazte 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 snadněji viděli fondy aplikací, které běží jako identita LOCALSYSTEM. 

Následující 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í se poběží 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í se poběží jako identita SYSTEM.

K tomuto 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 snímku obrazovky výše, tento skript PowerShellu vytiskne následující skript, který ukazuje, že myAppPool běží pod identitou SYSTEM. 

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

Služby Systému Windows 

Pokud vaše rozhraní .NET Framework nebo . Aplikace založená na technologii NET je zaregistrovaná jako služba systému Windows. K zobrazení přidružené identity můžete použít správce služeb. 

Z příkazového řádku se zvýšenými oprávněními spusťte příkaz services.msc. 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 se jako uvedený seznam "Místní systém" pro identitu služby, služba je spuštěná pod identitou SYSTEM. 

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

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

Pokud je služba zaregistrovaná ke spuštění pod identitou SYSTEM, zobrazí se v konzole true. 

Další mechanismy 

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

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

Pokud má hodnota Uživatelské jméno hodnotu SYSTEM, proces se spouští pod identitou SYSTEM. 

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

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

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

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

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 změnit seznamy ACL adresáře, 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 příkazu můžete ověřit, že tato operace proběhla úspěšně. 

icacls C:\NewSystemTemp\ 

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

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í %SYSTEMTEMP% s oborem na úrovni systému. Můžete to nastavit prostřednictvím uživatelského rozhraní System Ovládací panely nebo můžete nastavit programově prostřednictvím PowerShellu: 

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

Pak počítač restartujte. 

Změna proměnné prostředí %SYSTEMTEMP%nezmění návratovou hodnotu System.IO.Path.GetTempPath() pro aplikace rozhraní .NET Framework a .NET, které běží jako jiná identita než SYSTEM. Tyto aplikace budou i nadále používat stejnou logiku řešení, jakou mají vždy, včetně dodržování %TMP% nebo %TEMP% proměnných prostředí, pokud jsou k dispozici. 

Podobně nastavení proměnné prostředí %TMP% nebo %TEMP% nezmění návratové hodnoty System.IO.Path.GetTempPath() pro aplikace rozhraní .NET Framework a .NET, které běží jako identita SYSTÉMU. 

Další informace

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

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

Potřebujete další pomoc?

Chcete další možnosti?

Prozkoumejte výhody předplatného, projděte si školicí kurzy, zjistěte, jak zabezpečit své zařízení a mnohem více.