![重啟後無法存取 EFS 文件](https://rvso.com/image/1336292/%E9%87%8D%E5%95%9F%E5%BE%8C%E7%84%A1%E6%B3%95%E5%AD%98%E5%8F%96%20EFS%20%E6%96%87%E4%BB%B6.png)
我已使用 EFS 為使用者加密了一個檔案(讓我們將此命名為「使用者 X」)。以「使用者 X」身分運行的應用程式能夠存取加密檔案。對於透過 UI 登入畫面登入的任何用戶,它在登出和登入過程中都能保持正常運作,直到下次重新啟動。
重新啟動後,以「使用者 X」身分執行的應用程式無法存取加密檔案。
但是當我從登入畫面登入“使用者 X”時,它開始工作。這意味著一旦我以“用戶 X”身份登入並登出並以任何其他用戶身份登入並以“用戶 X”身份運行我的應用程序,它就可以訪問加密文件。
但根據設計,我不希望「使用者 X」使用 UI 螢幕登入。
任何人都可以建議,為什麼重新啟動後“用戶 X”無法訪問 EFS 加密文件以及如何解決它,以便我的應用程式以“用戶 X”身份運行,應該能夠訪問加密文件而無需登錄為用戶X?
注意:我使用的是 Windows Embedded Std。 7.
先感謝您。
答案1
有一個名為 lsass.exe 的進程負責安全性部分(身份驗證、登入、加密等...)如果我沒記錯的話,該進程僅在互動式登入(如控制台或 RDP)期間運行。您可以嘗試新增一小批,先啟動 lsass.exe。
答案2
十年後,這裡有一個可能適合您的解決方案:
如果您能夠使用命令提示字元(批次腳本 [.bat]),或者您已經使用允許您運行外部 exe 的任何語言編寫了應用程序,那麼答案就在於執行程式並且您不需要管理員權限。
我不是 Microsoft EFS 如何編碼或在後台工作的專家,但問題似乎與每個用戶在後台運行的證書和私鑰管理程序有關,僅在用戶登錄時運行。 PC 上的其他使用者(使用者X)來啟動的(除了已經執行的服務之外)。
執行程式能夠完全在後台執行用戶的正確登錄,而「以用戶身份運行」(或類似的任何內容)似乎是在模仿用戶的安全令牌(同樣,我不是 Windows 員工)類似於登入用戶功能。
無論如何,這是一勞永逸地解決問題的程式碼(請記住,使用者 X 是首先加密檔案的使用者):
批次腳本:
cd [PSExec Extracted Directory]
PSExec -accepteula -d -u "User X" -p "P455W0RD" cipher /c "C:\path\to\any\encrypted.file"
批次檔執行後,代表使用者 X 執行您的應用程式。任務調度程序。
上面發生了什麼事:
前往 PSExec 目錄。
使用以下選項執行 PSExec。
(-accepteula) 如果沒有此 PSExec 會彈出同意其軟體許可證的提示。
(-d) 不要啟動互動式命令提示字元。
(-u & -p) 最初會加密您要執行的應用程式的使用者的使用者名稱和密碼,也必須是您要為其執行應用程式的使用者(使用者 X)。
(cipher /c [filePath]) 使用 EFS 代表使用者 X 檢查檔案(一旦 PSExec 以使用者 X 身分正確登錄,就會啟動使用者的憑證和私鑰程式)。
C# 腳本:
//Register a process context for PSExec to initialize a real user logon & relevant EFS programs
ProcessStartInfo execution = new ProcessStartInfo
{
CreateNoWindow = true,
RedirectStandardError = true,
RedirectStandardOutput = true,
RedirectStandardInput = true,
WindowStyle = ProcessWindowStyle.Hidden,
UseShellExecute = false,
FileName = "C:\\path\\to\\PSExec.exe",
Arguments = "-accepteula -d -u \"User X\" -p \"P455W0RD\" cipher /c \"C:\\path\\to\\any\encrypted.file\""
};
//Run user & EFS initialization
Process.Start(execution).WaitForExit();
//Initialize execution of an encrypted program on behalf of a user
execution.FileName = directory + "\\Test\\Router\\AppController.exe";
execution.UserName = "User X";
execution.Password = new NetworkCredential("", "P455W0RD").SecurePassword;
//Run the specified user's exclusive application
Process.Start(execution);
//Terminate thread
return;
就您的密碼而言,這不是最安全的,但我確信在這篇文章發表 9 年後,您將有辦法。希望這對像我或你這樣遇到這個問題的人有所幫助:)。