Data wydania:25 lutego 2025 r.

Wersja:.NET 8 i nowsze.NET Framework, wszystkie wersje

Podsumowanie

Firma Microsoft wdrożyła ulepszenia zabezpieczeń w najnowszych wersjach systemu Windows. Te ulepszenia zabezpieczeń modyfikują obsługę ścieżek tymczasowych i mogą powodować, że niektóre interfejsy API .NET Framework i .NET, takie jakSystem.IO.Path.GetTempPath(), zwracają inną lokalizację po zastosowaniu poprawki.

Wymagane działanie

Nie jest wymagane żadne działanie w przypadku żadnych .NET Framework ani . Aplikacja oparta na usłudze NET. Twoja aplikacja automatycznie skorzysta z wszelkich ulepszeń zabezpieczeń mających zastosowanie do Twojego środowiska. Większość aplikacji nie będzie obserwować żadnych zmian behawioralnych. 

W dalszej części tego artykułu opisano, jak ustalić, czy te ulepszenia zabezpieczeń mogą mieć wpływ na zachowanie aplikacji w czasie wykonywania. W tym artykule wymieniono również kroki dostosowywania zachowania środowiska uruchomieniowego w razie potrzeby

Odpowiednie oprogramowanie

Ten artykuł dotyczy następującego oprogramowania: 

Tylko w następujących wersjach aktualizacji systemu Windows: 

  • Windows 10, wersja 22H2 po zainstalowaniu KB5052077

  • Windows Server 2019 r. po zainstalowaniu KB5053594 

  • Windows Server 2016 po zainstalowaniu KB5053594 

Ten artykuł nie dotyczy .NET Framework ani programu .NET działającego w Windows 11, Windows Server 2022 lub nowszym. 

Ten artykuł nie dotyczy programu .NET działającego na platformach innych niż Windows. 

Szczegółowy opis i instrukcja wpływu

W związku z wymienionymi powyżej aktualizacjami systemu Windows firma Microsoft przywróciła interfejs API Win32 GetTempPath2 do starszych wersji systemu Windows na rynku, aby działać jako bezpieczniejszy zamiennik starszego interfejsu API GetTempPath win32. Wewnętrznie .NET Framework i .NET korzystają z tych interfejsów API win32, aby zapewnić implementację metody System.IO.Path.GetTempPath() : preferowany jest interfejs API usługi Win32 GetTempPath2 , jeśli istnieje; a interfejs API GetTempPath win32 jest używany jako rezerwowy interfejs api, jeśli nie istnieje program GetTempPath2. 

Ponieważ te kb udostępnić nowy interfejs API win32 GetTempPath2 na odpowiednich platformach, .NET Framework i .NET zacznie używać GetTempPath2 po zainstalowaniu kb. 

Podstawowa zmiana behawioralna polega na tym, że osoby dzwoniące działające jako tożsamość SYSTEM będą domyślnie obserwować metodę System.IO.Path.GetTempPath() zwracaną %WINDIR%\SystemTemp , natomiast osoby wywołujące działające jako dowolne inne elementy niż tożsamość SYSTEM będą obserwować metodę, która będzie nadal zwracać jej istniejącą wartość. 

Jeśli aplikacja spełnia wszystkie poniższe kryteria, ta zmiana może mieć wpływ na Ciebie: 

  • Aplikacja korzysta z środowiska uruchomieniowego i platformy systemu operacyjnego wymienionej pod wcześniejszym nagłówkiem "Odpowiednie oprogramowanie". i

  • Aplikacja działa jako tożsamość SYSTEM; i

  • Ręcznie ustawiasz zmienną środowiskową %TMP% lub %TEMP% w celu przekierowania standardowej lokalizacji pliku tymczasowego. (Zobacz sekcję Uwagi w dokumentacji interfejsu API GetTempPath Win32).

Jeśli spełniasz wszystkie te kryteria, po zainstalowaniu plików KB systemu Windows możesz obserwować zapisywanie aplikacji w katalogu tymczasowym innym niż katalog, który został zamierzony. 

Ta zmiana behawioralna może być widoczna w dowolnym .NET Framework lub . Interfejs API dostarczany przez sieć NET, który ostatecznie korzysta z programu GetTempPath2. Najpopularniejsze punkty wejścia to: 

Nie jest to pełna lista metod, których zachowania mogą ulec zmianie po zainstalowaniu kb. 

Określanie, czy aplikacja działa w ramach tożsamości SYSTEM 

Istnieje kilka różnych mechanizmów określania tożsamości aplikacji .NET Framework lub .NET

Aplikacje sieci Web oparte na systemie IIS 

Usługa IIS określa tożsamość systemu jako "LOCALSYSTEM". W menedżerze IIS (inetmgr.exe) przejdź do karty Pule aplikacji, aby wyświetlić wszystkie pule aplikacji i skojarzone z nimi tożsamości. Możesz również wybrać pozycję "Tożsamość" z listy rozwijanej Grupuj według, aby ułatwić wyświetlanie pul aplikacji działających jako tożsamość LOCALSYSTEM. 

Poniższy zrzut ekranu przedstawia przykład puli aplikacji ("MyAppPool"), która jest skonfigurowana do uruchamiania jako LOCALSYSTEM. Wszystkie aplikacje uruchomione w tej puli aplikacji będą uruchamiane jako tożsamość SYSTEM. 

Zrzut ekranu przedstawia przykład puli aplikacji ("MyAppPool"), która jest skonfigurowana do uruchamiania jako LOCALSYSTEM. Wszystkie aplikacje uruchomione w tej puli aplikacji będą uruchamiane jako tożsamość SYSTEM.

Dostęp do tych informacji można również uzyskać programowo z poziomu sesji programu PowerShell z podwyższonym poziomem uprawnień przy użyciu poniższego skryptu. 

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

Na komputerze skonfigurowanym przy użyciu puli aplikacji "MyAppPool" na poziomie systemowym, jak pokazano na powyższym zrzucie ekranu, ten skrypt programu PowerShell drukuje następujące elementy, pokazując, że aplikacja "MyAppPool" jest uruchomiona w ramach tożsamości systemu. 

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

Usługi systemu Windows 

Jeśli .NET Framework lub . Aplikacja oparta na sieci jest zarejestrowana jako usługa systemu Windows. Menedżer usług może wyświetlać skojarzoną tożsamość tej aplikacji. 

W wierszu polecenia z podwyższonym poziomem uprawnień uruchom services.msc. Spowoduje to wyświetlenie interfejsu użytkownika menedżera usług. 

W wierszu polecenia z podwyższonym poziomem uprawnień uruchom plik services.msc. Spowoduje to wyświetlenie interfejsu użytkownika menedżera usług.

Jeśli kolumna Zaloguj jako zawiera listę "System lokalny" dla tożsamości usługi, usługa jest uruchomiona w ramach tożsamości SYSTEM. 

Za pomocą polecenia cmdlet Get-Service można również wykonywać zapytania dotyczące tych danych za pośrednictwem programu PowerShell. Aby na przykład wykonać zapytanie dotyczące usługi o nazwie MyService, użyj następującego polecenia. 

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

Jeśli usługa jest zarejestrowana do uruchomienia pod tożsamością SYSTEM, spowoduje to wydrukowanie na konsoli wartości True. 

Inne mechanizmy 

Narzędzia, takie jak Menedżer zadań (taskmgr.exe) lub Eksplorator procesów Sysinternals , mogą również określić, czy aplikacja jest uruchomiona w ramach tożsamości SYSTEMU. 

W Menedżerze zadań użyj widoku Szczegóły, aby wyświetlić listę wszystkich uruchomionych procesów w systemie, a następnie znajdź interesujący proces i spójrz na wpis w kolumnie Nazwa użytkownika

W Menedżerze zadań użyj widoku Szczegóły, aby wyświetlić listę wszystkich uruchomionych procesów w systemie, a następnie znajdź interesujący proces i spójrz na wpis w kolumnie Nazwa użytkownika.

Jeśli wartość Nazwa użytkownika brzmi "SYSTEM", proces jest uruchamiany w ramach tożsamości SYSTEM. 

Ewentualnie w Eksploratorze procesów firmy Sysinternals znajdź interesujący cię proces i wprowadź widok Właściwości , a następnie spójrz na pole Użytkownik na karcie Obraz

w Eksploratorze procesów Sysinternals znajdź interesujący cię proces i wprowadź widok Właściwości, a następnie spójrz na pole Użytkownik na karcie Obraz.

Jeśli wartość User (Użytkownik ) ma wartość "NT AUTHORITY\SYSTEM", proces jest uruchamiany w ramach tożsamości SYSTEM. 

Zmienianie ścieżki tymczasowej dla procesów na poziomie systemu 

Poniższy skrypt programu PowerShell pokazuje, jak utworzyć nowy katalog C:\NewSystemTemp\ i ograniczyć dostęp do katalogu tylko do procesów uruchamianych w ramach tożsamości SYSTEM. Nie próbuj zmieniać list ACL katalogu, który jest już wypełniony plikami. 

Ten skrypt musi być uruchamiany z poziomu sesji programu PowerShell z podwyższonym poziomem uprawnień. 

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 

Możesz potwierdzić, że ta operacja zakończyła się pomyślnie, uruchamiając polecenie 

icacls C:\NewSystemTemp\ 

Co spowoduje uzyskanie następujących wyników pokazujących sukces: 

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

Po utworzeniu katalogu ustaw zmienną środowiskową %SYSTEMTEMP% z zakresem na poziomie systemu. Można to ustawić za pomocą interfejsu użytkownika Panel sterowania systemowego lub programowo za pomocą programu PowerShell: 

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

Następnie uruchom ponownie komputer. 

Zmiana zmiennej środowiskowej %SYSTEMTEMP%nie spowoduje zmiany zwracanej wartości System.IO.Path.GetTempPath() dla aplikacji .NET Framework i .NET działających jako tożsamość inna niż SYSTEM. Te aplikacje będą nadal przestrzegać tej samej logiki rozdzielczości, które zawsze mają, w tym uwzględniania %TMP% lub %TEMP% zmiennych środowiskowych, jeśli istnieją. 

Podobnie ustawienie zmiennej środowiskowej %TMP% lub %TEMP% nie spowoduje zmiany zwracanej wartości System.IO.Path.GetTempPath() dla aplikacji .NET Framework i .NET uruchomionych jako tożsamość SYSTEM. 

Aby uzyskać więcej informacji

Aby uzyskać więcej informacji na temat zachowań .NET Framework i .NET, zobacz dokumentację programu .NET w witrynie Path.GetTempPath

Aby uzyskać więcej informacji na temat zachowania systemu operacyjnego Windows, zobacz dokumentację systemu Windows dotyczącą interfejsu API Win32 GetTempPath2.

Potrzebujesz dalszej pomocy?

Chcesz uzyskać więcej opcji?

Poznaj korzyści z subskrypcji, przeglądaj kursy szkoleniowe, dowiedz się, jak zabezpieczyć urządzenie i nie tylko.