web-dev-qa-db-fra.com

Usurpation d'identité Windows à partir de C #

Comment un programme C # exécuté en tant que LocalSystem peut-il emprunter l'identité de connexion d'un autre utilisateur temporairement? En gros, j'ai un service Windows que je voudrais exécuter en tant que LocalSystem, mais parfois usurper l'identité de l'utilisateur XYZ (lors de la connexion à une base de données à l'aide de la sécurité intégrée de Windows).

Le plus important de tous: existe-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).

30
user53794

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

18
wj32

Réponse courte: vous ne pouvez pas vous passer du mot de passe utilisateur ou de l'utilisateur appelant 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 existe plusieurs façons d'obtenir un descripteur de jeton:

11
Franci Penov

Pour la partie de stockage de mot de passe, vous voudrez peut-être jeter un œil à cette question posée récemment.

C'était ma réponse:

Vous pouvez/devez utiliser le DPAPI , le Data Protection API qui fournit le chiffrement du stockage.
Il est là juste pour ce type de problème.

Le chiffrement du stockage est basé sur:

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

Il y a émission dnrTV avec Karl Franklin montrant exactement ce qui est nécessaire pour l'implémenter, 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 de autres articles à ce sujet.

5
Renaud Bompuis