Scripting

Windows Server 2019 阻止將新編譯的 DLL 保存在使用者文件中

  • November 29, 2021

讀取 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 的目前值。“目前”被突出顯示,因為“目前”可能與“設置”有很大不同(例如在我的帳戶、環境中)。

引用自:https://serverfault.com/questions/1028686