Файл EFS недоступен после перезагрузки

Файл EFS недоступен после перезагрузки

Я зашифровал файл с помощью EFS для пользователя (назовем его "Пользователь X"). Приложение, работающее как "Пользователь X", может получить доступ к зашифрованному файлу. Он продолжает работать нормально при выходе из системы и входе в систему для любого пользователя, входящего через экран входа в UI, до следующей перезагрузки.

После перезагрузки приложение, работающее от имени «Пользователя X», не может получить доступ к зашифрованному файлу.

Но когда я вхожу как "Пользователь X" с экрана входа, он начинает работать. То есть, как только я вхожу как "Пользователь X", выхожу из системы и вхожу как любой другой пользователь и запускаю свое приложение как "Пользователь X", оно может получить доступ к зашифрованному файлу.

Но по замыслу я не хочу, чтобы «Пользователь X» входил в систему с помощью экрана пользовательского интерфейса.

Может ли кто-нибудь подсказать, почему после перезагрузки «Пользователь X» не может получить доступ к зашифрованному файлу EFS, и как решить эту проблему, чтобы мое приложение, работающее от имени «Пользователя X», могло получить доступ к зашифрованному файлу без входа в систему как пользователь X?

Примечание: я использую Windows Embedded Std. 7.

Заранее спасибо.

решение1

Есть процесс под названием lsass.exe, который отвечает за безопасность (аутентификация, вход в систему, шифрование и т. д.). Если я не ошибаюсь, этот процесс запускается только во время интерактивных входов в систему (например, через консоль или RDP). Вы можете попробовать добавить небольшой пакет, который сначала запустит lsass.exe.

решение2

Десять лет спустя вот решение, которое может вам подойти:

Если вы умеете использовать командную строку (пакетный скрипт [.bat]) или написали свое приложение на любом языке, который позволяет запускать внешние exe-файлы, то ответ кроется вPSExec.exeи вам не нужны права администратора.

Я не эксперт в том, как устроена и работает EFS от Microsoft, но, похоже, проблема связана с программами управления сертификатами и закрытыми ключами, которые запускаются в фоновом режиме для каждого пользователя и только после его входа в систему. Я говорю «программы», поскольку при входе в систему другого пользователя (пользователя X) на ПК не запускаются никакие службы (кроме тех, которые уже запущены).

PSExecможет выполнить надлежащий вход пользователя в систему полностью в фоновом режиме, тогда как «запуск от имени пользователя» (или что-то в этом роде) похоже имитирует токен безопасности пользователя (опять же, я не сотрудник 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 лет с момента публикации этого поста у вас будут средства. Надеюсь, это поможет кому-то вроде меня или вас, кто столкнется с этим по пути :).

Связанный контент