Emprunt d’identité Windows à partir de C #

Comment un programme C # exécuté en tant que LocalSystem peut-il emprunter l’identité de l’identité d’un autre utilisateur? Grosso modo, j’ai un service Windows que je voudrais exécuter en tant que LocalSystem mais parfois emprunter l’identité d’un utilisateur XYZ (lors de la connexion à une firebase database en utilisant Windows Integrated Security).

Le plus important: y a-t-il un moyen de le faire sans connaître le mot de passe de l’autre utilisateur?

Remarque: si un mot de passe est obligatoire, existe-t-il une stratégie recommandée pour stocker un mot de passe en toute sécurité (c # et / ou vbscript).

C’est possible, même si cela nécessite beaucoup de code. Voir NtCreateToken et CreateToken . Vous avez besoin de SeCreateTokenPrivilege, bien que cela ne soit pas un problème puisque vous êtes sous NT AUTHORITY \ SYSTEM. Vous pouvez ensuite utiliser le jeton créé pour emprunter l’identité d’un thread.

Réponse courte: vous ne pouvez pas vous passer du mot de passe utilisateur ou de l’utilisateur qui appelle votre service via COM.

Pour emprunter l’identité d’un autre utilisateur dans votre processus, vous devez appeler ImpersonateLoggedOnUser . ImpersonateLoggedOnUser nécessite un handle de jeton. Il y a plusieurs façons d’obtenir une poignée de jeton:

  • en vous connectant en tant qu’utilisateur avec LogonUser . Cela nécessite toutefois de connaître le mot de passe de l’utilisateur.
  • en dupliquant un jeton existant avec CreateRessortingctedToken , DuplicateToken ou DuplicateTokenEx .
  • en ouvrant le jeton d’un autre processus ou thread, qui est déjà connecté en tant qu’utilisateur, avec OpenProcessToken ou OpenThreadToken

Pour la partie de stockage de mot de passe, vous pouvez consulter cette question posée récemment.

C’était ma réponse:

Vous pouvez / devez utiliser DPAPI , l’ API de protection des données qui fournit un chiffrement du stockage.
Il est là juste pour ce type de problème.

Le chiffrement du stockage est basé soit sur:

  • le compte utilisateur, seul l’utilisateur connecté peut accéder aux données. Cela rend les données transférables sur un autre PC avec les mêmes informations d’identification exactes.
  • la machine, rendant les données uniquement accessibles sur cette machine particulière et non transférables sur un autre PC.

Il y a une émission de dnrTV avec Karl Franklin montrant exactement ce qui est nécessaire pour implémenter cela, ainsi que d’autres fonctions de cryptage.
Le code source de l’émission est également disponible sur la page.

Il y a bien sûr beaucoup d’ autres articles sur ce sujet.