![再起動後に EFS ファイルにアクセスできない](https://rvso.com/image/1336292/%E5%86%8D%E8%B5%B7%E5%8B%95%E5%BE%8C%E3%81%AB%20EFS%20%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84.png)
あるユーザー (「ユーザー X」と名付けます) のファイルを EFS で暗号化しました。「ユーザー X」として実行されているアプリケーションは、暗号化されたファイルにアクセスできます。次回の再起動まで、UI ログイン画面からログインしているすべてのユーザーに対して、ログオフとログインをまたいで正常に動作し続けます。
再起動すると、「ユーザー X」として実行されているアプリケーションは暗号化されたファイルにアクセスできなくなります。
しかし、ログイン画面から「ユーザー X」でログインすると、動作し始めます。つまり、「ユーザー X」としてログインし、ログオフして他のユーザーとしてログインし、「ユーザー X」としてアプリケーションを実行すると、暗号化されたファイルにアクセスできます。
しかし、設計上、「ユーザー X」が UI 画面を使用してログインすることは望ましくありません。
再起動時に「ユーザー X」が EFS 暗号化ファイルにアクセスできないのはなぜか、また「ユーザー X」として実行されているアプリケーションがユーザー X としてログインせずに暗号化ファイルにアクセスできるようにするにはどうすればいいのか、どなたかアドバイスをいただけませんか?
注: Windows Embedded Std. 7 を使用しています。
よろしくお願いします。
答え1
セキュリティ部分 (認証、ログオン、暗号化など) を担当する lsass.exe というプロセスがあります。私の記憶が正しければ、このプロセスは対話型ログオン (コンソールや RDP など) 中にのみ実行されます。最初に lsass.exe を起動する小さなバッチを追加してみてください。
答え2
10年後、あなたにとって役立つかもしれない解決策がここにあります:
コマンドプロンプト(バッチスクリプト[.bat])を使用できる場合、または外部exeを実行できる言語でアプリケーションを作成した場合、答えは次のようになります。実行ファイル管理者権限は必要ありません。
私は Microsoft の EFS がどのようにコード化されているか、または内部でどのように動作しているかについての専門家ではありませんが、問題は、各ユーザーのサインイン時にのみバックグラウンドで実行される証明書と秘密キーの管理プログラムに関係しているようです。プログラムと言うのは、PC 上の他のユーザー (ユーザー 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 年が経ち、皆さんもきっと自分の手段を見つけられるでしょう。この投稿が、私や皆さんのように、このことに遭遇した人のお役に立てば幸いです :)。