GetTempPath changes in Windows February cumulative update preview

Lưu ý

  • Ngày Phát hành:
    Ngày 25 tháng 2 năm 2025
  • Phiên bản:
    .NET 8 trở lên
    .NET Framework, tất cả các phiên bản

Tóm tắt

Microsoft đã triển khai các cải tiến bảo mật cho các phiên bản Windows gần đây. Những cải tiến bảo mật này sửa đổi xử lý đường dẫn tạm thời và có thể khiến cho một số .NET Framework và .NET API System.IO.Path.GetTempPath()nhất định muốn trả về một vị trí khác sau khi áp dụng bản vá.

Yêu cầu hành động

Mọi .NET Framework hoặc . Ứng dụng dựa trên NET. Ứng dụng của bạn sẽ tự động hưởng lợi từ mọi cải tiến bảo mật áp dụng cho môi trường của bạn. Hầu hết các ứng dụng sẽ không quan sát bất kỳ thay đổi hành vi nào.

Phần còn lại của bài viết này chi tiết cách xác định xem những cải tiến bảo mật này có thể ảnh hưởng đến hành vi thời gian chạy của ứng dụng của bạn. Bài viết này cũng liệt kê các bước để tùy chỉnh hành vi thời gian chạy nếu muốn

Phần mềm Áp dụng

Bài viết này áp dụng cho phần mềm sau đây:

  • .NET 8 trở lên
  • .NET Framework, tất cả các phiên bản, kể từ bản cập nhật bảo mật tháng 7 năm 2024 và các bản cập nhật tiếp theo

Chỉ khi chạy trên các phiên bản Windows update sau:

  • Windows 10, phiên bản 22H2 khi KB5052077 được cài đặt
  • Windows Server 2019, khi KB5053594 được cài đặt
  • Windows Server 2016, khi KB5053594 được cài đặt

Bài viết này không áp dụng cho .NET Framework hoặc .NET chạy trên Windows 11, Windows Server 2022 trở lên.

Bài viết này không áp dụng cho .NET khi chạy trên các nền tảng không phải của Windows.

Mô tả chi tiết và điều khoản tác động

Kể từ bản cập nhật Windows KBs nêu trên, Microsoft đã hỗ trợ API Win32 GetTempPath2 cho các phiên bản windows cũ hơn trên thị trường để đóng vai trò thay thế an toàn hơn cho API Win32 GetTempPath cũ hơn. Trong nội bộ, .NET Framework và .NET dựa vào các API Win32 System.IO.Path.GetTempPath() này để cung cấp việc thực hiện phương pháp: API Win32 GetTempPath2 được ưa thích nếu API tồn tại; và API Win32 GetTempPath được sử dụng làm bản dự phòng nếu GetTempPath2 không tồn tại.

Vì các KBs này giúp API Win32GetTempPath2mới sẵn dùng trên các nền tảng có thể áp dụng nên .NET Framework và .NET sẽ bắt đầu sử dụng GetTempPath2 sau khi các API đã được cài đặt.

Thay đổi hành vi chính là người gọi đang chạy với danh tính HỆ System.IO.Path.GetTempPath()%WINDIR%\SystemTemp THỐNG sẽ thấy phương pháp trả về theo mặc định, trong khi người gọi đang chạy như bất kỳ điều gì khác ngoài danh tính HỆ THỐNG sẽ thấy phương pháp tiếp tục trả về giá trị hiện có.

Nếu ứng dụng của bạn đáp ứng tất cả các tiêu chí dưới đây, bạn có thể bị ảnh hưởng bởi thay đổi này:

  • Ứng dụng của bạn sử dụng thời gian chạy và nền tảng HĐH được liệt kê trong tiêu đề "Phần mềm Áp dụng" trước đó; Và
  • Ứng dụng của bạn chạy dưới dạng danh tính HỆ THỐNG; Và
  • Bạn đặt biến môi trường %TMP% hoặc biến %TEMP% đổi theo cách thủ công để chuyển hướng vị trí tệp tạm thời tiêu chuẩn. ( Xem phần Nhận xét của Win32 GetTempPath Tài liệu API.)

Nếu bạn đáp ứng tất cả các tiêu chí này, sau đó một khi windows KBs được cài đặt, bạn có thể quan sát ứng dụng của bạn bằng văn bản vào một thư mục tạm thời khác với thư mục bạn dự kiến.

Thay đổi hành vi này có thể hiển thị thông qua bất kỳ .NET Framework hoặc . NET-provided API mà cuối cùng phụ thuộc vào GetTempPath2. Các điểm tham gia phổ biến nhất là:

Đây không phải là nhằm mục đích là một danh sách đầy đủ các phương pháp có hành vi có thể thay đổi sau khi các KBs được cài đặt.

Xác định xem một ứng dụng có chạy theo định danh HỆ THỐNG hay không

Có một số cơ chế khác nhau để xác định danh tính của ứng dụng .NET Framework hoặc .NET

Các ứng dụng web dựa trên IIS

IIS đề cập đến nhận dạng HỆ THỐNG là "LOCALSYSTEM". Trong Trình quản lý IIS (inetmgr.exe), đi tới tab Vùng Ứng dụng để xem tất cả các vùng ứng dụng và danh tính liên quan của chúng. Bạn cũng có thể chọn "Danh tính" từ danh sách thả xuống Nhóm theo để dễ dàng xem các vùng ứng dụng đang chạy dưới dạng danh tính LOCALSYSTEM.

Ảnh chụp màn hình dưới đây hiển thị ví dụ về vùng ứng dụng ("MyAppPool") được đặt cấu hình để chạy dưới dạng LOCALSYSTEM. Mọi ứng dụng chạy trong vùng ứng dụng này sẽ chạy dưới dạng danh tính HỆ THỐNG.

Ảnh chụp màn hình hiển thị ví dụ về vùng ứng dụng (MyAppPool) được đặt cấu hình để chạy dưới dạng LOCALSYSTEM. Mọi ứng dụng chạy trong vùng ứng dụng này sẽ chạy dưới dạng danh tính HỆ THỐNG.

Bạn cũng có thể truy nhập thông tin này theo chương trình từ phiên PowerShell nâng cao bằng cách sử dụng tập lệnh dưới đây.

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

Trong một máy được đặt cấu hình với vùng ứng dụng "MyAppPool" cấp HỆ THỐNG như minh họa trong ảnh chụp màn hình ở trên, tập lệnh PowerShell này sẽ in nội dung sau đây, cho thấy rằng "MyAppPool" đang chạy dưới định danh HỆ THỐNG.

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

Dịch vụ Windows

Nếu .NET Framework hoặc . Ứng dụng dựa trên NET được đăng ký là Dịch vụ Windows, bạn có thể sử dụng trình quản lý Dịch vụ để xem danh tính liên quan của ứng dụng đó.

Từ lời nhắc chỉ lệnh mức cao, hãy chạy services.msc. Thao tác này sẽ hiển thị giao diện người dùng trình quản lý Dịch vụ.

Từ lời nhắc chỉ lệnh mức cao, hãy chạy services.msc. Thao tác này sẽ hiển thị giao diện người dùng trình quản lý Dịch vụ.

Nếu cột Đăng nhập Dưới dạng liệt kê "Hệ thống Cục bộ" cho danh tính dịch vụ thì dịch vụ đang chạy dưới danh tính HỆ THỐNG.

Bạn cũng có thể truy vấn dữ liệu này thông qua PowerShell bằng cách sử dụng Get-Service lệnh ghép ngắn. Ví dụ: để truy vấn thông tin này cho một dịch vụ có tên MyService, hãy sử dụng lệnh sau đây.

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

Nếu dịch vụ được đăng ký chạy theo danh tính HỆ THỐNG, điều này sẽ in True vào bảng điều khiển.

Các cơ chế khác

Các công cụ như Trình quản lý Tác vụ (taskmgr.exe) hoặc Trình khám phá Tiến trình Sysinternals cũng có thể cho bạn biết liệu một ứng dụng có đang chạy trong danh tính HỆ THỐNG hay không.

Trong Trình quản lý Tác vụ, sử dụng dạng xem Chi tiết để liệt kê tất cả các quy trình đang chạy trong hệ thống, sau đó xác định vị trí quy trình quan tâm và xem mục nhập bên dưới cột Tên người dùng.

Trong Trình quản lý Tác vụ, sử dụng dạng xem Chi tiết để liệt kê tất cả các quy trình đang chạy trong hệ thống, sau đó xác định vị trí quy trình quan tâm và xem mục nhập bên dưới cột Tên người dùng.

Nếu giá trị Tên người dùng đọc "HỆ THỐNG", quy trình đang chạy trong danh tính HỆ THỐNG.

Hoặc trong Trình khám phá Tiến trình Sysinternals, định vị quy trình quan tâm và nhập dạng xem Thuộc tính, sau đó xem trường Người dùng bên dưới tab Hình ảnh.

trong Trình khám phá Tiến trình Sysinternals, định vị quy trình quan tâm, rồi nhập dạng xem Thuộc tính, rồi xem trường Người dùng bên dưới tab Hình ảnh.

Nếu giá trị Người dùng đọc "NT AUTHORITY\SYSTEM", quy trình đang chạy trong danh tính HỆ THỐNG.

Thay đổi đường dẫn tạm thời cho các quy trình cấp HỆ THỐNG

Tập lệnh PowerShell dưới đây sẽ minh họa cách C:\NewSystemTemp\ tạo thư mục mới và hạn chế truy nhập thư mục chỉ cho các quy trình chạy theo danh tính HỆ THỐNG. Không cố gắng để thay đổi các ACLs của một thư mục đã được dân cư với tập tin.

Tập lệnh này phải được chạy từ phiên PowerShell nâng cao.

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 

Bạn có thể xác nhận rằng thao tác này đã thành công bằng cách chạy lệnh

icacls C:\NewSystemTemp\ 

Điều này sẽ tạo ra đầu ra sau đây cho thấy sự thành công:

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

Sau khi thư mục được tạo, đặt biến môi %SYSTEMTEMP% trường với phạm vi mức hệ thống. Bạn có thể đặt giao diện người dùng này thông qua giao diện người Panel điều khiển hệ thống hoặc bạn có thể đặt giao diện người dùng theo chương trình thông qua PowerShell:

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

Sau đó khởi động lại máy.

Việc thay đổi %SYSTEMTEMP% biến môi trường sẽ không thay đổi System.IO.Path.GetTempPath() giá trị trả về của các ứng dụng .NET Framework và .NET đang chạy dưới dạng danh tính khác với HỆ THỐNG. Những ứng dụng đó sẽ tiếp tục tuân theo lô-gic độ phân giải tương tự mà họ luôn có, %TMP%%TEMP% bao gồm cả việc vinh danh các biến môi trường hoặc nếu chúng xuất hiện.

Tương tự, việc đặt biến %TMP% môi %TEMP%System.IO.Path.GetTempPath() trường hoặc sẽ không thay đổi giá trị trả về của .NET Framework và các ứng dụng .NET đang chạy dưới dạng danh tính HỆ THỐNG.

Để biết thêm thông tin

Để biết thêm thông tin về hành vi .NET Framework và .NET, hãy xem tài liệu .NET trên Path.GetTempPath.

Để biết thêm thông tin về hành vi HĐH Windows cơ bản, hãy xem hướng dẫn sử dụng Windows trên API Win32 GetTempPath2.