任務計劃程序寫入名為 %LOCALAPPDATA% 的文字資料夾

任務計劃程序寫入名為 %LOCALAPPDATA% 的文字資料夾

我有一個 .NET 執行檔(我建立的),它使用 Microsoft 的Active Directory 服務介面(透過 System.DirectoryServices.AccountManagement)執行 LDAP 查詢。 ADSI 內部,它下載 Active Directory 架構並將其儲存在本機。它應該將此架構儲存在位於 的資料夾中%LOCALAPPDATA%\Microsoft\Windows\SchCache\

當我將此可執行檔安排在任務調度程序在 Windows Server 2012 R2 上並將其設定為以「UserA」身分執行即使該用戶沒有登入,程式運行,但它嘗試將上述快取檔案寫入資料夾按字面意思命名%LOCALAPPDATA%\Microsoft\Windows\SchCache\開始計劃任務的資料夾(故意設定為我的可執行檔的資料夾)。換句話說,它正在寫入類似C:\MyApp\%LOCALAPPDATA%\Microsoft\Windows\SchCache\.我必須向 UserA 授予對此資料夾的明確寫入權限,以允許程式正常運作。

我已經使用 Process Monitor 觀察了任務的進程,它立即轉到該資料夾。這並不是說它第一次嘗試某些東西C:\Users\但失敗了。

當我以自己的使用者身分登入伺服器並使用 UserA 手動執行可執行檔時以不同使用者身分執行,可執行檔案運行並成功將快取檔案寫入C:\Users\UserA\AppData\Local\Microsoft\Windows\SchCache\

為什麼任務計劃程序會發生這種情況?我想這可能與任務計劃程序在 UserA 的上下文中執行程序有關,但沒有初始化%LOCALAPPDATA%為環境變數。一時興起我嘗試設置以最高權限運行任務,但這並沒有改變結果。

答案1

這是Windows Server 2012 R2和8.1中的錯誤;微軟已將其記錄在知識庫 2968540

該問題已修復並進行熱修復知識庫 3133689可用。此修補程式確實解決了該問題。

使用 UBPM 運行的計劃任務在啟動相應進程時沒有足夠的環境變量,例如 APPDATA、USERPROFILE 或 TEMP。

答案2

我相信 Windows 7 / 2012 排程任務中存在一個錯誤,因此它們看不到執行使用者的正確環境變數:

https://stackoverflow.com/questions/32589381/

若要確認這種情況是否發生,您可以SET>test.txt在相同使用者上下文中的排程任務中的批次檔中執行。當我嘗試這個時,確實如此不是顯示指定使用者的正確、完整的環境變數集;即,如果您在實際以該使用者身分登入時執行相同的命令(或批次檔),那麼您看到的設定與您看到的設定不一樣。 (更令人困惑的是,這取決於計劃任務運行時用戶當前是否登入;如果他們登入了,則任務查看正確的變數。

我認為這種行為沒有記錄或有意為之,並且是 Windows Server 2012(也許只是 R2?)處理計劃任務的方式中的錯誤。

注意PATH也適用於變量,因此計劃任務只能看到位於預設路徑,或在目前目錄中,或使用完全指定的路徑。呼叫指定使用者路徑上但不在預設路徑上的任何內容都會產生難以偵錯的錯誤(因為它在測試中有效!)。

答案3

這是 Windows 處理使用者帳戶方式的結果。當使用者帳戶未登入時,其使用者註冊表設定單元(HKEY_USERS通常對應為該註冊表項下的鍵HKEY_CURRENT_USER)不會安裝。此設定單元(儲存在每個使用者的設定檔中的一個檔案中,稱為NTUSER.DAT)儲存幾乎所有每個使用者的數據,包括每個使用者的環境變數。 Windows 也有系統環境變數 - 一些變數(例如 PATH)同時存在於兩個位置並被合併 - 因此即使未安裝使用者的註冊表配置單元,這些變數也會顯示。但是,沒有一個特定於用戶的。

我不知道任務計劃程式在其他 Windows 版本中是否以不同的方式處理這種情況。它可以在以該使用者身分執行任務之前,請聰明地安裝該使用者的設定單元。在Win7 / 2012R2中,顯然不是。

要解決此問題,您需要確保安裝了使用者的註冊表配置單元。最簡單的方法就是確保使用者已登錄,因為登入使用者的設定單元始終已安裝。如果沒有的話,你可以嘗試自己掛載hive(API是RegLoadKey但我從未嘗試過為此調用它)。

相關內容