重啟後無法存取 EFS 文件

重啟後無法存取 EFS 文件

我已使用 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 執行您的應用程式。任務調度程序

上面發生了什麼事:

  1. 前往 PSExec 目錄。

  2. 使用以下選項執行 PSExec。

  3. (-accepteula) 如果沒有此 PSExec 會彈出同意其軟體許可證的提示。

  4. (-d) 不要啟動互動式命令提示字元。

  5. (-u & -p) 最初會加密您要執行的應用程式的使用者的使用者名稱和密碼,也必須是您要為其執行應用程式的使用者(使用者 X)。

  6. (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 年後,您將有辦法。希望這對像我或你這樣遇到這個問題的人有所幫助:)。

相關內容