![Файл EFS недоступен после перезагрузки](https://rvso.com/image/1336292/%D0%A4%D0%B0%D0%B9%D0%BB%20EFS%20%D0%BD%D0%B5%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B5%D0%BD%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%20%D0%BF%D0%B5%D1%80%D0%B5%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B8.png)
Я зашифровал файл с помощью 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.Планировщик заданий.
Что произошло выше:
Перейдите в каталог 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 лет с момента публикации этого поста у вас будут средства. Надеюсь, это поможет кому-то вроде меня или вас, кто столкнется с этим по пути :).