Дата на издаване:25 февруари 2025 г.
Версия:.NET 8 и по-нова.NET Framework (платформа), всички версии
Обобщена информация
Microsoft пусна подобрения на защитата в последните версии на Windows. Тези подобрения на защитата променят временното управление на пътя и може да доведат до това определени .NET Framework (платформа) и .NET API, като напримерSystem.IO.Path.GetTempPath(), да връщат различно местоположение след прилагането на корекцията.
Изисква се действие
Не се изисква никакво действие за .NET Framework (платформа) или . Базирано на NET приложение. Вашето приложение автоматично ще се възползва от всички подобрения на защитата, приложими за вашата среда. Повечето приложения няма да наблюдават промяна в поведението.
Останалата част от тази статия описва подробно как да определите дали тези подобрения на защитата могат да повлияят на поведението по време на изпълнение на вашето приложение. Тази статия описва също стъпките за персонализиране на поведението по време на изпълнение, ако желаете
Приложим софтуер
Тази статия се отнася за следния софтуер:
-
.NET 8 и по-нова версия
-
.NET Framework (платформа) всички версии от юли 2024 г. актуализации на защитата и последващи актуализации
Само когато се изпълнява на следните версии на Актуализация на Windows:
-
Windows 10, версия 22H2, когато KB5052077 е инсталиран
-
Windows Server 2019 г., когато KB5053594 е инсталиран
-
Windows Server 2016 г., когато KB5053594 е инсталиран
Тази статия не се отнася за .NET Framework (платформа) или .NET, които се изпълняват на Windows 11, Windows Server 2022 или по-нова версия.
Тази статия не се отнася за .NET, когато се изпълнява на платформи, които не са на Windows.
Подробно описание и декларация за въздействието
Считано от КБ за актуализация на Windows, споменати по-горе, Microsoft поддържа API на Win32 GetTempPath2 към по-стари пазарни версии на Windows, за да действа като по-сигурна замяна за по-старите Win32 GetTempPath API. Вътрешно .NET Framework (платформа) и .NET разчитат на тези API на Win32, за да предоставят изпълнението на метода на System.IO.Path.GetTempPath() : Api на Win32 GetTempPath2 е предпочитан, ако съществува; и Win32 GetTempPath API се използва като резервен, ако GetTempPath2 не съществува.
Тъй като тези KB предоставят новия Win32 GetTempPath2 API на приложимите платформи, .NET Framework (платформа) и .NET ще започнат да използват GetTempPath2, след като KB бъдат инсталирани.
Основната промяна в поведението е, че повикващите, които се изпълняват като самоличност на СИСТЕМАТА, ще наблюдават метода на System.IO.Path.GetTempPath() , който връща %WINDIR%\SystemTemp по подразбиране, докато повикващите, които се изпълняват като нещо различно от самоличността на СИСТЕМАТА, ще спазват метода, който продължава да връща съществуващата стойност.
Ако вашето приложение отговаря на всички критерии по-долу, може да бъдете засегнати от тази промяна:
-
Вашето приложение използва платформа за изпълнение и операционна система, посочена под заглавието "Приложим софтуер"; и
-
Вашето приложение се изпълнява като системна самоличност; и
-
Можете ръчно да зададете променливата %TMP% или %TEMP% среда за пренасочване на стандартното temp местоположение на файла. (Вижте раздела Забележки в документацията за Win32 GetTempPath API.)
Ако отговаряте на всички тези критерии, след инсталирането на KB на Windows можете да наблюдавате записването на приложението в временна директория, различна от директорията, която сте възнамерявали.
Тази промяна в поведението може да е видима чрез всеки .NET Framework (платформа) или . Предоставен от NET API, който в крайна сметка разчита на GetTempPath2. Най-често срещаните входни точки са:
Това не е предназначено да бъде изчерпателен списък с методи, чието поведение може да се промени, след като KB са инсталирани.
Определяне дали дадено приложение се изпълнява под системната самоличност
Съществуват няколко различни механизми за определяне на самоличността на приложение на .NET Framework (платформа) или .NET
Уеб приложения, базирани на IIS
IIS се отнася до системната идентичност като "LOCALSYSTEM". В IIS manager (inetmgr.exe) отидете на раздела Набори приложения, за да видите всички набори приложения и техните свързани самоличности. Можете също да изберете "Самоличност" от групата по падащ списък, за да улесните преглеждането на набори приложения, които се изпълняват като самоличност на LOCALSYSTEM.
Екранната снимка по-долу показва пример за набор приложения ("MyAppPool"), който е конфигуриран да се изпълнява като LOCALSYSTEM. Всички приложения, които се изпълняват в рамките на този набор приложения, ще се изпълняват като системна самоличност.
Можете също да получите програмен достъп до тази информация от сесия на PowerShell с администраторски права, като използвате скрипта по-долу.
Import-Module IISAdministration Get-IISAppPool | where {$_.ProcessModel.IdentityType -eq "LocalSystem"}
В компютър, конфигуриран с набор приложения на ниво СИСТЕМА "MyAppPool", както е показано на екранната снимка по-горе, този скрипт на PowerShell отпечатва следното, показвайки, че "MyAppPool" се изпълнява под системната самоличност.
Name Status CLR Ver Pipeline Mode Start Mode ---- ------ ------- ------------- ---------- MyAppPool Started v4.0 Integrated OnDemand
Услуги на Windows
Ако вашият .NET Framework (платформа) или . Базираното на NET приложение е регистрирано като услуга на Windows, можете да използвате диспечера на услугите, за да видите свързаната с него самоличност.
От команден прозорец с администраторски права изпълнете services.msc. Това показва потребителския интерфейс на диспечера на услугите.
Ако колоната Влизане като съдържа "Локална система" за самоличност на услугата, услугата се изпълнява под системната самоличност.
Можете също да направите заявка за тези данни чрез PowerShell с помощта на кратката команда Get-Service . Например за да подадете заявка до тази информация за услуга с име MyService, използвайте следната команда:
(Get-Service MyService).UserName -ieq "LocalSystem"
Ако услугата е регистрирана да се изпълнява под системната самоличност, това ще отпечата True на конзолата.
Други механизми
Инструменти като диспечера на задачите (taskmgr.exe) или Sysinternals Process Explorer също могат да ви кажат дали дадено приложение се изпълнява под самоличността на СИСТЕМАТА.
В диспечера на задачите използвайте изгледа По-подробно, за да изброите всички изпълнявани процеси в системата, след което намерете процеса, който ви интересува, и погледнете записа под колоната Потребителско име .
Ако стойността за Потребителско име гласи "СИСТЕМА", процесът се изпълнява под самоличността на СИСТЕМАТА.
Или в Sysinternals Process Explorer намерете процеса, който ви интересува, и въведете изгледа Свойства , след което погледнете полето Потребител под раздела Изображение .
Ако стойността на Потребителя прочита "NT AUTHORITY\SYSTEM", процесът се изпълнява под самоличността на системата.
Промяна на временния път за процеси на ниво СИСТЕМА
Скриптът на PowerShell по-долу показва как да създадете нова директория C:\NewSystemTemp\ и да ограничите достъпа до справочния указател само до процесите, които се изпълняват под самоличността на системата. Не се опитвайте да променяте ACL на указател, който вече е попълнен с файлове.
Този скрипт трябва да се изпълни от сесия на 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
Можете да потвърдите, че тази операция е успешна, като изпълните командата
icacls C:\NewSystemTemp\
Което ще доведе до следния резултат, показващ успех:
C:\NewSystemTemp\ NT AUTHORITY\SYSTEM:(OI)(CI)(F) BUILTIN\Administrators:(OI)(CI)(F) Successfully processed 1 files; Failed processing 0 files
След като директорията бъде създадена, задайте променливата на %SYSTEMTEMP% среда с обхват на системно ниво. Можете да зададете това чрез потребителския интерфейс на system Контролен панел или можете да го настроите програмно чрез PowerShell:
[Environment]::SetEnvironmentVariable("SYSTEMTEMP", "C:\NewSystemTemp", [EnvironmentVariableTarget]::Machine)
След това рестартирайте машината.
Промяната на променливата на средата на %SYSTEMTEMP%няма да промени върнатата стойност на System.IO.Path.GetTempPath() за .NET Framework (платформа) и .NET приложения, които се изпълняват като самоличност, различна от SYSTEM. Тези приложения ще продължат да следват същата логика за разделителна способност, която винаги имат, включително спазвайки променливите на средата на %TMP% или %TEMP% , ако са налични.
По същия начин задаването на променливата на %TMP% или %TEMP% среда няма да промени върнатата стойност на System.IO.Path.GetTempPath() за приложения на .NET Framework (платформа) и .NET, които се изпълняват като самоличност на СИСТЕМАТА.
За допълнителна информация
За повече информация относно .NET Framework (платформа) и .NET поведения вж. документацията за .NET в Path.GetTempPath.
За повече информация относно поведението на ос Windows вижте документацията на Windows за Win32 GetTempPath2 API.