Файл EFS недоступен после перезагрузки
Я зашифровал файл с EFS для пользователя (назовем его "Пользователь X"). Приложение, которое работает как "Пользователь X", может получить доступ к зашифрованному файлу. Он продолжает нормально работать через выход из системы и вход в систему для любого пользователя, входящего через экран входа в систему пользовательского интерфейса до следующей перезагрузки.
После перезагрузки приложение, работающее как "Пользователь X", не может получить доступ к зашифрованному файлу.
Но когда я вхожу в "Пользователь X" с экрана входа, он начинает работать. Это означает, что как только я войду в систему как "Пользователь X", выйду из системы и войду в систему как любой другой пользователь, а мое приложение будет работать как "Пользователь Х", и он сможет получить доступ к зашифрованному файлу.
Но, согласно дизайну, я не хочу, чтобы "Пользователь Х" входил в систему с помощью экрана пользовательского интерфейса.
Может кто-нибудь подсказать, почему после перезагрузки "Пользователь Х" не может получить доступ к зашифрованному файлу EFS и как мне его разрешить, чтобы мое приложение, работающее как "Пользователь Х", получило доступ к зашифрованному файлу без входа в систему как пользователь X?
Примечание. Я использую Windows Embedded Std. 7.
Заранее спасибо.
2 ответа
Есть процесс с именем lsass.exe, который отвечает за безопасность (авторизация, вход в систему, шифрование и т. Д.). Если я не ошибаюсь, этот процесс выполняется только во время интерактивного входа в систему (например, консоль или RDP). Вы можете попробовать добавить небольшой пакет, который сначала запустит lsass.exe.
Десять лет спустя, вот решение, которое может вам подойти:
Если вы можете использовать командную строку (пакетный сценарий [.bat]) или написали свое приложение на любом языке, позволяющем запускать внешние exe-файлы, ответ кроется в PSExec.exe, и вам не нужны права ..
Я не эксперт в том, как EFS Microsoft закодирована или работает под капотом, но, похоже, проблема связана с программами управления сертификатами и закрытыми ключами, которые запускаются в фоновом режиме для каждого пользователя только после входа пользователя в систему. Я говорю программы, потому что никакие службы не запускаются (кроме уже запущенных) при входе в систему другого пользователя (Пользователя X) на ПК.
администратораPSExec может выполнить правильный вход пользователя в систему полностью в фоновом режиме, тогда как «запуск от имени пользователя» (или что-то в этом роде), похоже, имитирует токен безопасности пользователя (опять же, я не сотрудник Windows) с что-то вроде функции LogonUser .
В любом случае, вот код, который решает проблему раз и навсегда (имейте в виду, что пользователь 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).
С#-скрипт:
//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 лет после публикации этого поста у вас будут средства. Надеюсь, это поможет кому-то вроде меня или вас, кто столкнется с этим по пути :).