Scripting
Windows Server 2019 阻止將新編譯的 DLL 保存在使用者文件中
讀取 C# 原始碼並將其編譯為 DLL 的應用程序在嘗試將此 DLL 保存到使用者文件文件夾中的磁碟時拋出錯誤,例如“c:\Users<user>\Documents\myapplication\some-folder\ new.DLL”,應用程序拋出一個異常,該異常是由 Windows Server 2019 聲稱“路徑不存在”引起的。
讓我向你保證,路徑確實存在:
- 有時有效:將使用者添加到“高級使用者”組
- 什麼總是有效:將使用者添加到“管理員”組
後者是(不應該)不是一種選擇。
- 視窗伺服器 2019
- 該應用程序由擁有“文件”文件夾的使用者執行
- 該應用程序可以創建、重命名、刪除、讀取、寫入任何其他文件或文件夾
- 有問題的文件夾免於防病毒、防御者等。
我有根據的猜測,應用程序的行為可以被視為惡意的(它不是!,它是一個允許在 c# 中編寫任務腳本並使用該技術來提高速度的遊戲)並且某些東西試圖在這裡保護其他東西。但我不知道是什麼以及如何阻止它。
這個問題的真正原因是創建 DLL 文件的程序是由遠端訪問伺服器的使用者啟動的(例如使用 RDP)。只有這樣一個不起眼的 Windows 組策略模板設置才會出現:“為每個會話使用單獨的臨時文件夾”(請參閱:https ://devblogs.microsoft.com/oldnewthing/20110125-00/?p=11673 )。
所以,拋出的異常
> System.Exception: (0,0): error CS0016: Could not write to output file > "c:\Users\theuser\Documents\somefolder\new.dll" -- "The directory name is invalid."
完全誤導:無效的目錄名稱不在要創建 DLL 的路徑中,而實際上是在 TEMP 或 TMP 環境變數中設置的臨時文件路徑的一部分(例如“TMP=C 中的“2”: \Users…\AppData\Local\Temp\2”)。
您可以在命令行視窗中使用 set 命令檢查 TEMP 和 TMP 的目前值。“目前”被突出顯示,因為“目前”可能與“設置”有很大不同(例如在我的帳戶、環境中)。