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:
LogonUser
. Cela nécessite toutefois de connaître le mot de passe de l’utilisateur. CreateRessortingctedToken
, DuplicateToken
ou DuplicateTokenEx
. 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:
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.