Representação do Windows a partir de c #

Como pode um programa c # em execução como LocalSystem representar a identidade de login de outro usuário temporariamente? Grosso modo, eu tenho um serviço do Windows que gostaria de executar como LocalSystem, mas às vezes representar o usuário XYZ (ao se conectar a um database usando segurança integrada do Windows).

O mais importante de tudo: existe uma maneira de fazer isso sem saber a senha do outro usuário?

Nota: se uma senha é obrigatória, existe uma estratégia recomendada para armazenar uma senha com segurança (c # e / ou vbscript).

   

É possível, embora exija que você faça muito código. Veja NtCreateToken e CreateToken . Você precisa do SeCreateTokenPrivilege, embora isso não seja um problema, já que você está executando com NT AUTHORITY \ SYSTEM. Você pode então usar o token criado para representar dentro de um segmento.

Resposta curta: você não pode sem a senha do usuário ou o usuário chamando seu serviço através do COM.

Para representar outro usuário em seu processo, você precisa chamar ImpersonateLoggedOnUser . ImpersonateLoggedOnUser requer um identificador de token. Existem várias maneiras de obter o identificador de token:

  • fazendo logon como o usuário com o LogonUser . Isso, no entanto, exige que você saiba a senha do usuário.
  • duplicando um token existente com CreateRestrictedToken , DuplicateToken ou DuplicateTokenEx .
  • abrindo o token de outro processo ou thread, que já está loggen on como o usuário, com OpenProcessToken ou OpenThreadToken

Para a parte de armazenamento de senha, você pode querer dar uma olhada nesta pergunta feita recentemente.

Esta foi a minha resposta:

Você poderia / deveria usar o DPAPI , a API de proteção de dados que fornece criptografia de armazenamento.
Está lá apenas para este tipo de problema.

A criptografia do armazenamento é baseada em:

  • a conta do usuário, para que apenas o usuário conectado possa acessar os dados. Isso torna os dados transferíveis para outro PC com as mesmas credenciais de usuário.
  • a máquina, tornando os dados acessíveis apenas nessa configuração específica da máquina e não transferíveis para outro PC.

Há um show dnrTV com Karl Franklin mostrando exatamente o que é necessário para implementar isso, e outras funções de criptografia.
O código-fonte do programa também está disponível na página.

Há, é claro, muitos outros artigos sobre esse assunto.