Дата выпуска:25 февраля 2025 г.

Версия:.NET 8 и более поздниеверсии платформа .NET Framework, все версии

Аннотация

Корпорация Майкрософт развернула улучшения безопасности в последних версиях Windows. Эти улучшения безопасности изменяют обработку временных путей и могут привести к тому, что некоторые API платформа .NET Framework и .NET, такие какSystem.IO.Path.GetTempPath(), возвращают другое расположение после применения исправления.

Требуется действие

Никаких действий для платформа .NET Framework или . Приложение на основе NET. Ваше приложение будет автоматически пользоваться любыми улучшениями безопасности, применимыми к вашей среде. Большинство приложений не будут наблюдать никаких изменений в поведении. 

В оставшейся части этой статьи описывается, как определить, могут ли эти улучшения безопасности повлиять на поведение приложения в среде выполнения. В этой статье также перечислены действия по настройке поведения среды выполнения при необходимости.

Применимое программное обеспечение

Эта статья относится к следующему программному обеспечению: 

Только при запуске в следующих версиях обновления Windows: 

  • Windows 10, версия 22H2 при установке KB5052077

  • Windows Server 2019 г. при установке KB5053594 

  • Windows Server 2016 при установке KB5053594 

Эта статья не применяется к платформа .NET Framework или .NET, работающим на Windows 11, Windows Server 2022 или более поздней версии. 

Эта статья не применяется к .NET при запуске на платформах, отличных от Windows. 

Подробное описание и заявление о влиянии

Начиная с упомянутых выше обновлений Windows, корпорация Майкрософт перенаправила API Win32 GetTempPath2 на более старые рыночные версии Windows, чтобы действовать в качестве более безопасной замены более старым API GetTempPath Win32. Внутри платформа .NET Framework и .NET используют эти API Win32 для реализации метода System.IO.Path.GetTempPath() : api Win32 GetTempPath2 является предпочтительным, если он существует; а API Win32 GetTempPath используется в качестве резервного варианта, если GetTempPath2 не существует. 

Так как эти базы знаний делают новый API win32 GetTempPath2 доступным на соответствующих платформах, платформа .NET Framework и .NET начнут использовать GetTempPath2 после установки KB. 

Основное изменение поведения заключается в том, что вызывающие пользователи, работающие в качестве удостоверения SYSTEM, будут наблюдать, как метод System.IO.Path.GetTempPath() возвращает %WINDIR%\SystemTemp по умолчанию, в то время как вызывающие лица, работающие как что-либо, кроме удостоверения SYSTEM, будут наблюдать, как метод продолжает возвращать его существующее значение. 

Если приложение соответствует всем приведенным ниже критериям, это изменение может повлиять на вас: 

  • Ваше приложение использует среду выполнения и платформу ОС, перечисленные в предыдущем разделе "Применимое программное обеспечение"; и

  • Приложение выполняется как удостоверение SYSTEM; и

  • Вы вручную задаете переменную среды %TMP% или %TEMP% , чтобы перенаправить стандартное расположение временного файла. (См. раздел Примечания документации по API GetTempPath Win32.)

Если вы соответствуете всем этим критериям, после установки KB Windows вы можете наблюдать, как приложение записывает данные во временный каталог, отличный от нужного каталога. 

Это изменение поведения может быть видно через любой платформа .NET Framework или . API, предоставляемый NET, который в конечном итоге использует GetTempPath2. Наиболее распространенные точки входа: 

Это не является исчерпывающим списком методов, поведение которых может измениться после установки баз данных. 

Определение того, выполняется ли приложение под удостоверением SYSTEM 

Существует несколько различных механизмов определения удостоверения приложения платформа .NET Framework или .NET.

Веб-приложения на основе IIS 

IIS называет удостоверение SYSTEM "LOCALSYSTEM". В диспетчере IIS (inetmgr.exe) перейдите на вкладку Пулы приложений, чтобы просмотреть все пулы приложений и связанные с ними удостоверения. Вы также можете выбрать "Удостоверение" в раскрывающемся списке Группировать по, чтобы упростить просмотр пулов приложений, которые выполняются в качестве удостоверения LOCALSYSTEM. 

На снимок экрана ниже показан пример пула приложений ("MyAppPool"), который настроен для запуска от имени LOCALSYSTEM. Все приложения, запущенные в этом пуле приложений, будут выполняться как удостоверение SYSTEM. 

На снимку экрана показан пример пула приложений (MyAppPool), который настроен для запуска от имени LOCALSYSTEM. Все приложения, запущенные в этом пуле приложений, будут выполняться как удостоверение SYSTEM.

Вы также можете получить доступ к этой информации программным способом из сеанса PowerShell с повышенными привилегиями с помощью приведенного ниже скрипта. 

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

На компьютере, настроенном с пулом приложений "MyAppPool" уровня SYSTEM, как показано на снимке экрана выше, этот сценарий PowerShell выводит следующее, показывая, что MyAppPool выполняется под удостоверением SYSTEM. 

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

Службы Windows 

Если платформа .NET Framework или . Приложение на основе NET зарегистрировано как служба Windows. Для просмотра связанного удостоверения можно использовать диспетчер служб. 

В командной строке с повышенными привилегиями выполните services.msc. Отобразится пользовательский интерфейс диспетчера служб. 

В командной строке с повышенными привилегиями запустите services.msc. Отобразится пользовательский интерфейс диспетчера служб.

Если в столбце Вход от имени указано "Локальная система" для удостоверения службы, служба выполняется под удостоверением SYSTEM. 

Вы также можете запросить эти данные с помощью PowerShell с помощью командлета Get-Service . Например, чтобы запросить эти сведения для службы с именем MyService, используйте следующую команду. 

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

Если служба зарегистрирована для запуска под удостоверением SYSTEM, в консоли будет выведено значение True. 

Другие механизмы 

Такие средства, как диспетчер задач (taskmgr.exe) или Обозреватель процесса Sysinternals, также могут определить, выполняется ли приложение под удостоверением SYSTEM. 

В диспетчере задач используйте представление Сведения, чтобы получить список всех выполняемых процессов в системе, а затем найдите интересующий процесс и просмотрите запись в столбце Имя пользователя

В диспетчере задач используйте представление Сведения, чтобы получить список всех выполняемых процессов в системе, а затем найдите интересующий процесс и просмотрите запись в столбце Имя пользователя.

Если в значении Имя пользователя указано "SYSTEM", процесс выполняется под удостоверением SYSTEM. 

Или в Обозреватель Sysinternals Process найдите интересующий процесс и введите представление Свойства, а затем просмотрите поле Пользователь на вкладке Изображение

В разделе Sysinternals Process Обозреватель найдите интересующий процесс и введите представление Свойства, а затем просмотрите поле Пользователь на вкладке Изображение.

Если значение User имеет значение "NT AUTHORITY\SYSTEM", процесс выполняется под удостоверением SYSTEM. 

Изменение временного пути для процессов уровня SYSTEM 

В приведенном ниже сценарии PowerShell показано, как создать новый каталог C:\NewSystemTemp\ и ограничить доступ к каталогам только для процессов, выполняемых под удостоверением SYSTEM. Не пытайтесь изменить списки управления доступом каталога, который уже заполнен файлами. 

Этот скрипт должен выполняться из сеанса 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, работающих в качестве удостоверения SYSTEM. 

Дополнительные сведения

Дополнительные сведения о поведении платформа .NET Framework и .NET см. в документации по .NET на path.GetTempPath

Дополнительные сведения о базовом поведении ОС Windows см. в документации по Windows по API GetTempPath2 Win32.

Нужна дополнительная помощь?

Нужны дополнительные параметры?

Изучите преимущества подписки, просмотрите учебные курсы, узнайте, как защитить свое устройство и т. д.