重启后无法访问 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 的语言编写了应用程序,那么答案就在执行程序&您不需要管理员权限。

我不是微软 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 运行你的应用程序。你可以使用 Windows 内置的任务调度程序

上面发生了什么:

  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 年后,你会找到自己的方法。希望这对像我这样的人或遇到这种情况的人有所帮助 :)。

相关内容