Lors de la connexion à un partage réseau pour lequel l'utilisateur actuel (dans mon cas, un utilisateur de service activé par le réseau) n'a aucun droit, le nom et le mot de passe doivent être fournis.
Je sais comment faire cela avec les fonctions Win32 (la WNet*
famille de mpr.dll
), mais j'aimerais le faire avec la fonctionnalité .Net (2.0).
Quelles options sont disponibles?
Peut-être que quelques informations supplémentaires peuvent vous aider:
- Le cas d'utilisation est un service Windows, pas une application Asp.Net.
- Le service s'exécute sous un compte qui n'a aucun droit sur le partage.
- Le compte utilisateur requis pour le partage n'est pas connu côté client.
- Le client et le serveur ne sont pas membres du même domaine.
Réponses:
Vous pouvez modifier l'identité du thread ou P / Invoke WNetAddConnection2. Je préfère ce dernier, car j'ai parfois besoin de conserver plusieurs informations d'identification pour différents endroits. Je l'enveloppe dans un IDisposable et j'appelle WNetCancelConnection2 pour supprimer les creds par la suite (en évitant l'erreur de plusieurs noms d'utilisateur):
la source
J'ai tellement aimé la réponse de Mark Brackett que j'ai fait ma propre mise en œuvre rapide. Le voici si quelqu'un d'autre en a besoin rapidement:
la source
throw new Win32Exception(result);
, puisque WNetAddConnection2 renvoie les codes d'erreur win32 (ERROR_XXX
)NetworkCredential
objet, l'application a pu se connecter une fois au lecteur réseau. Après cela, nous avons obtenu un ERROR_LOGON_FAILURE à chaque tentative jusqu'au redémarrage de l'application. Nous avons ensuite essayé de fournir le domaine sur l'NetworkCredential
objet également, et du coup cela a fonctionné! Je ne sais pas pourquoi cela a résolu le problème, en particulier le fait que cela fonctionnait pour se connecter une fois sans le domaine.Aujourd'hui 7 ans plus tard, je suis confronté au même problème et j'aimerais partager ma version de la solution.
Il est prêt pour le copier-coller :-) Le voici:
Étape 1
Dans votre code (chaque fois que vous devez faire quelque chose avec des autorisations)
Étape 2
Le fichier Helper qui fait de la magie
la source
J'ai cherché beaucoup de méthodes et je l'ai fait à ma manière. Vous devez ouvrir une connexion entre deux machines via l'invite de commande NET USE et après avoir terminé votre travail, effacez la connexion avec l'invite de commande NET USE "myconnection" / delete.
Vous devez utiliser le processus d'invite de commande à partir du code derrière comme ceci:
L'utilisation est simple:
Voici les fonctions:
Et aussi la fonction ExecuteCommand est:
Cette fonction a fonctionné très rapidement et de manière stable pour moi.
la source
La solution Luke Quinane semble bonne, mais n'a fonctionné que partiellement dans mon application ASP.NET MVC. Ayant deux partages sur le même serveur avec des informations d'identification différentes, je ne pourrais utiliser l'emprunt d'identité que pour le premier.
Le problème avec WNetAddConnection2 est également qu'il se comporte différemment sur différentes versions de Windows. C'est pourquoi j'ai cherché des alternatives et trouvé la fonction LogonUser . Voici mon code qui fonctionne également dans ASP.NET:
Usage:
la source
Pour les amateurs de VB, l'équivalent VB.NET du code de Luke Quinane (merci Luke!)
la source
Une option qui pourrait fonctionner consiste à utiliser
WindowsIdentity.Impersonate
(et à modifier le principal du thread) pour devenir l'utilisateur souhaité, comme cela . De retour à p / invoke, j'ai bien peur ...Une autre option effrontée (et tout aussi loin d'être idéale) pourrait être de créer un processus pour faire le travail ...
ProcessStartInfo
accepte un.UserName
,.Password
et.Domain
.Enfin - peut-être exécuter le service dans un compte dédié qui y a accès?(supprimé car vous avez précisé que ce n'est pas une option).la source
OK ... je peux répondre ...
Avertissement: Je viens de passer une journée de plus de 18 heures (à nouveau) .. Je suis vieux et oublieux .. Je ne peux pas épeler .. J'ai une capacité d'attention courte, donc je ferais mieux de répondre rapidement .. :-)
Question:
Est-il possible de changer le principal du thread en un utilisateur sans compte sur la machine locale?
Répondre:
Oui, vous pouvez modifier un principal de thread même si les informations d'identification que vous utilisez ne sont pas définies localement ou sont en dehors de la «forêt».
Je viens de rencontrer ce problème en essayant de me connecter à un serveur SQL avec l'authentification NTLM à partir d'un service. Cet appel utilise les informations d'identification associées au processus, ce qui signifie que vous avez besoin d'un compte local ou d'un compte de domaine pour vous authentifier avant de pouvoir emprunter l'identité. Bla, bla ...
Mais...
L'appel de LogonUser (..) avec l'attribut ???? _ NEW_CREDENTIALS renverra un jeton de sécurité sans essayer d'authentifier les informations d'identification. Kewl .. Pas besoin de définir le compte dans la "forêt". Une fois que vous avez le jeton, vous devrez peut-être appeler DuplicateToken () avec l'option d'activer l'emprunt d'identité résultant en un nouveau jeton. Appelez maintenant SetThreadToken (NULL, token); (Cela peut être & token?) .. Un appel à ImpersonateLoggedonUser (token); pourrait être nécessaire, mais je ne pense pas. Cherchez-le..
Faites ce que vous devez faire.
Appelez RevertToSelf () si vous avez appelé ImpersonateLoggedonUser () puis SetThreadToken (NULL, NULL); (Je pense ... cherchez-le), puis CloseHandle () sur les poignées créées ..
Aucune promesse mais cela a fonctionné pour moi ... C'est du dessus de ma tête (comme mes cheveux) et je ne peux pas épeler !!!
la source
Si vous ne pouvez pas créer un jeton de sécurité localement valide, il semble que vous ayez exclu toutes les barres d'options API Win32 et WNetAddConnection *.
Des tonnes d'informations sur MSDN à propos de WNet - Informations PInvoke et exemple de code qui se connecte à un chemin UNC ici:
Référence MSDN ici:
la source
Également porté en F # pour être utilisé avec FAKE
la source
Vous devriez envisager d'ajouter un comme celui-ci:
Dans votre web.config.
Plus d'information.
la source