2009-02-18 6 views
29

Comment un programme C# s'exécutant en tant que LocalSystem peut-il emprunter l'identité de connexion d'un autre utilisateur temporairement? Grosso modo, j'ai un service Windows que je voudrais lancer en tant que LocalSystem, mais parfois usurper l'identité de l'utilisateur XYZ (lors de la connexion à une base de données en utilisant 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?Windows Usurpation d'identité à partir de C#

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

+0

Pour le code d'emprunt d'identité, voir les deux articles de Code Project suivants: [http://www.codeproject.com/KB/cs/cpimpersonation1.aspx](http://www.codeproject.com/KB/cs/cpimpersonation1 .aspx) [http://www.codeproject.com/KB/cs/zetaimpersonator.aspx] (http://www.codeproject.com/KB/cs/zetaimpersonator.aspx) et l'article Microsoft KB sur lequel ils sont basés: [http://support.microsoft.com/default.aspx?scid=kb; fr-fr; Q306158] (http://support.microsoft.com/default.aspx?scid=kb;en-us;Q306158) – mundeep

Répondre

18

Il est possible, bien qu'il vous oblige à faire beaucoup de code. Voir NtCreateToken et CreateToken. Vous avez besoin de SeCreateTokenPrivilege, bien que ce ne soit pas un problème puisque vous utilisez NT AUTHORITY \ SYSTEM. Vous pouvez ensuite utiliser le jeton créé pour emprunter l'identité d'un thread.

+0

Merci. Pas beaucoup d'exemples de code disponibles pour cela :) – user53794

+7

Notez qu'il n'est pas recommandé d'exécuter des services sous LocalSystem, et les administrateurs système voient d'un mauvais œil cette pratique. –

+27

Sur stackoverflow, je préfère faire/répondre à ce qui est demandé. – wj32

5

Pour la partie de stockage de mot de passe, vous pouvez jeter un oeil à this question demandé récemment.

Ce fut ma réponse:

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

chiffrement du stockage est basée soit sur:

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

Il existe un dnrTV show with Karl Franklin indiquant exactement ce qui est nécessaire pour implémenter cette fonction et 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 other articles sur ce sujet.

10

Réponse courte: vous ne pouvez pas sans le mot de passe de l'utilisateur ou l'utilisateur appelant votre service via COM.

Pour usurper l'identité d'un autre utilisateur dans votre processus, vous devez appeler ImpersonateLoggedOnUser. ImpersonateLoggedOnUser requiert un handle de jeton. Il existe plusieurs façons d'obtenir un handle de jeton:

Questions connexes