Дата випуску:25 лютого 2025 р.

Версія:.NET 8 і новіші.NET Framework, усі версії

Загальні відомості

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

Потрібна дія

Жодних дій з .NET Framework або . Net-based application. Ваша програма автоматично виграє від будь-яких покращень безпеки, що застосовуються до вашого середовища. У більшості програм не спостерігатимуться будь-які зміни поведінки. 

В решті цієї статті пояснюється, як визначити, чи можуть ці покращення безпеки вплинути на поведінку середовища виконання програми. У цій статті також наведено вказівки з настроювання поведінки середовища виконання, якщо потрібно

Застосовне програмне забезпечення

Ця стаття стосується такого програмного забезпечення: 

Лише в таких версіях Windows Update: 

  • 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 Win32 GetTempPath . Внутрішньо .NET Framework та .NET використовують ці інтерфейси API Win32, щоб забезпечити реалізацію методу System.IO.Path.GetTempPath() : API GetTempPath2 Win32 краще використовувати, якщо він існує; а API GetTempPath Win32 використовується як недолік, якщо GetTempPath2 не існує. 

Оскільки ці KBs роблять новий інтерфейс API Win32 GetTempPath2 доступним на відповідних платформах, .NET Framework та .NET почнуть використовувати GetTempPath2 після інсталяції KBs. 

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

Якщо ваша програма відповідає всім наведеним нижче умовам, на вас може вплинути така зміна: 

  • Програма використовує середовище виконання та платформу ОС, указану під попереднім заголовком "Застосовне програмне забезпечення"; і

  • Програма запускається як посвідчення СИСТЕМИ; і

  • Ви вручну встановити змінну середовища %TMP% або %TEMP% , щоб переспрямувати стандартне тимчасове розташування файлу. (Див . розділ Примітки в документації Win32 GetTempPath API.)

Якщо ви відповідаєте всім цим умовам, після інсталяції KBs Windows ви можете спостерігати, як програма пише в тимчасовому каталозі, відмінному від потрібного каталогу. 

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

Це не вичерпний список методів, поведінка яких може змінитися після інсталяції KBs. 

Визначення того, чи програма запускається під посвідченням SYSTEM 

Існує кілька різних механізмів визначення ідентичності програми .NET Framework або .NET

Веб-застосунки на основі IIS 

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

На знімку екрана нижче показано приклад пулу програм ("MyAppPool"), який налаштовано на запуск як LOCALSYSTEM. Усі програми, запущені в цьому пулі програм, працюватимуть як посвідчення СИСТЕМИ. 

На знімку екрана показано приклад пулу програм ("MyAppPool"), який настроєно для запуску як LOCALSYSTEM. Усі програми, запущені в цьому пулі програм, працюватимуть як посвідчення СИСТЕМИ.

Ви також можете отримати доступ до цієї інформації програмно під час сеансу PowerShell у режимі адміністратора за допомогою наведеного нижче сценарію. 

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

На комп'ютері, настроєному з системним пулом програм "MyAppPool", як показано на знімку екрана вище, цей сценарій PowerShell друкує наведений нижче сценарій, показуючи, що "MyAppPool" запущено під посвідченням SYSTEM. 

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

Служби Windows 

Якщо .NET Framework або . Net-based application is registered as a Windows Service, you can use the Services manager to view its associated identity. 

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

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

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

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

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

Якщо службу зареєстровано для запуску під посвідченням СИСТЕМИ, буде надруковано true на консолі. 

Інші механізми 

Такі засоби, як Диспетчер завдань (taskmgr.exe) або Sysinternals Process Explorer , також можуть визначити, чи запущено програму під посвідченням СИСТЕМИ. 

У диспетчері завдань у поданні Відомості можна перелічити всі запущені процеси в системі, знайти потрібний процес і переглянути запис у стовпці Ім'я користувача

У диспетчері завдань у поданні Відомості можна перелічити всі запущені процеси в системі, знайти потрібний процес і переглянути запис у стовпці Ім'я користувача.

Якщо значення "Ім'я користувача " читає слово "SYSTEM", процес виконується під посвідченням SYSTEM. 

Або в Sysinternals Process Explorer знайдіть потрібний процес і відкрийте подання Властивості, а потім погляньте на поле User (Користувач) на вкладці Image (Зображення). 

у Sysinternals Process Explorer знайдіть потрібний процес і введіть подання Властивості, а потім погляньте на поле Користувач на вкладці Зображення.

Якщо значення користувача читає "NT AUTHORITY\SYSTEM", процес виконується під посвідченням СИСТЕМИ. 

Змінення тимчасового шляху для процесів на рівні СИСТЕМИ 

Наведений нижче сценарій PowerShell демонструє, як створити новий каталог C:\NewSystemTemp\ і обмежити доступ до каталогу лише процесами, запущеними в ідентичності SYSTEM. Не намагайтеся змінити списки 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% за допомогою області на рівні системи. Ви можете налаштувати цю настройку за допомогою системного Панель керування інтерфейсу користувача або налаштувати програмно за допомогою 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 Win32 GetTempPath2.

Потрібна додаткова довідка?

Потрібні додаткові параметри?

Ознайомтеся з перевагами передплати, перегляньте навчальні курси, дізнайтесь, як захистити свій пристрій тощо.