Criptografei um arquivo com EFS para um usuário (vamos chamá-lo de "Usuário X"). Um aplicativo executado como "Usuário X" é capaz de acessar o arquivo criptografado. Ele continua funcionando bem durante o logoff e login para qualquer usuário que efetue login na tela de login da interface do usuário até a próxima reinicialização.
Após a reinicialização, o aplicativo executado como "Usuário X" não consegue acessar o arquivo criptografado.
Mas quando eu faço login no "Usuário X" na tela de login, ele começa a funcionar. Ou seja, quando eu fizer login como "Usuário X", fizer logoff e fazer login como qualquer outro usuário e executar meu aplicativo como "Usuário X", ele poderá acessar o arquivo criptografado.
Mas, de acordo com o design, não quero que o "Usuário X" faça login usando a tela da interface do usuário.
Alguém pode sugerir por que, ao reiniciar, o "Usuário X" não consegue acessar o arquivo criptografado EFS e como resolvo isso, para que meu aplicativo em execução como "Usuário X" possa acessar o arquivo criptografado sem fazer login como usuário X?
Nota: estou usando o Windows Embedded Std. 7.
Agradeço antecipadamente.
Responder1
Existe um processo chamado lsass.exe que é responsável pela parte de segurança (autenticação, logon, criptografia, etc...). Se não me engano, esse processo é executado apenas durante logons interativos (como console ou RDP). Você pode tentar adicionar um pequeno lote que iniciaria primeiro o lsass.exe.
Responder2
Uma década depois, aqui está uma solução que pode funcionar para você:
Se você conseguir usar o prompt de comando (script em lote [.bat]) ou tiver escrito seu aplicativo em qualquer linguagem que permita executar exe externos, a resposta está emPSExec.exee você não precisa de privilégios de administrador.
Não sou especialista em como o EFS da Microsoft é codificado ou funciona nos bastidores, mas parece que o problema tem algo a ver com os programas de gerenciamento de certificados e chaves privadas executados em segundo plano para cada usuário, somente após o login do usuário. Digo programas porque nenhum serviço é iniciado (além dos que já estão em execução) ao fazer login no outro usuário (Usuário X) no PC.
PSExecé capaz de realizar um login adequado de um usuário inteiramente em segundo plano, enquanto 'executar como usuário' (ou algo parecido) parece imitar o token de segurança do usuário (novamente, não sou funcionário do Windows) com algo semelhante aoUsuário de logonfunção.
De qualquer forma, aqui está o código que corrige o problema de uma vez por todas (lembre-se de que o usuário X é o usuário que criptografou os arquivos em primeiro lugar):
Script em lote:
cd [PSExec Extracted Directory]
PSExec -accepteula -d -u "User X" -p "P455W0RD" cipher /c "C:\path\to\any\encrypted.file"
Depois que o arquivo em lote for executado, execute o aplicativo em nome do usuário X. Você pode fazer o arquivo em lote iniciar na inicialização usando o recurso integrado do Windowsagendador de tarefas.
O que aconteceu acima:
Vá para o diretório PSExec.
Execute PSExec com as seguintes opções.
(-accepteula) Sem isso, o PSExec exibe um prompt para concordar com a licença do software.
(-d) Não inicie um prompt de comando interativo.
(-u & -p) Nome de usuário e senha do usuário que criptografou originalmente o aplicativo que você deseja executar e eles também devem ser o usuário para o qual você deseja executar o aplicativo (Usuário X).
(cipher /c [filePath]) Use EFS para verificar um arquivo em nome do usuário X (é isso que inicia o certificado e os programas de chave privada no usuário depois que o PSExec estiver conectado corretamente como usuário X).
Script 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;
Não é o mais seguro em termos de senhas, mas tenho certeza que após 9 anos deste post você terá seus meios. Espero que isso ajude alguém como eu ou você que se depara com isso ao longo do caminho :).