“Accès Refusé” lorsque vous essayez de vous connecter à distance serveur IIS - C#
Je reçois un "Accès Deined" COMException quand j'essaie de me connecter à distance à un serveur IIS 6 à partir de mon application en C# qui est en cours d'exécution sous IIS 5.1.
Des idées? J'en fais l'expérience tous les mêmes problèmes avec les questions originales.
mise à Jour - 4/1/09
J'ai trouvé cette solution (http://www.codeproject.com/KB/cs/Start_Stop_IIS_Website.aspx) qui consiste en une application de la fenêtre de la connexion à un serveur IIS pour démarrer et arrêter des sites web. Je suis capable de le faire tourner sur mon poste de travail et de se connecter au serveur IIS.
Pouah....pourquoi ne puis-je exécuter cette application autonome, mais pas mon ASP.NET application?
Origine
Je reçois un "Accès Refusé" COMException quand j'essaie de me connecter à IIS à partir d'un ordinateur distant à l'aide de la DirectoryEntry.Existe méthode pour vérifier si le serveur IIS est valide.
string path = string.Format("IIS://{0}/W3SVC", server);
if(DirectoryEntry.Exist(path))
{
//do something is valid....
}
Je suis membre d'un groupe active directory a été ajouté au groupe Administrateurs sur le serveur IIS, je suis en train d'essayer de vous connecter.
Quelqu'un a rencontrer ce problème et sait comment le résoudre?
mise à JOUR:
@Kev - C'est un ASP.NET application. Aussi, je peux me connecter sans un nom d'utilisateur et mot de passe pour le serveur distant par le biais IIS6 Manager.
@Chris - je suis en train d'essayer de se connecter au serveur distant pour afficher le nombre de répertoires virtuels et de déterminer l' .NET framework version de chaque répertoire. Voir cette DONC, la question.
@dautzenb - Mon ASP.NET l'application est en cours d'exécution sous IIS 5.1 essayez de vous connecter à un serveur IIS 6. Je peux voir la faute à des audits dans le journal de sécurité pour mon compte ASPNET local sur le serveur distant. Quand j'ai essayer de déboguer l'application, je suis en cours d'exécution en vertu de mon compte de domaine et toujours obtenir l'Accès vous est refusé.
mise à JOUR 2:
@Kev - j'ai été en mesure d'établir pour créer un objet DirectoryEntry à l'aide de la surcharge suivante:
public DirectoryEntry
(
string path,
string username,
string password
)
Mais, toutes les propriétés contiennent un " a jeté une exception de type 'System.Moment de l'exécution.InteropServices.COMException'" alors que je déboguer l'application.
Aussi, le AuthenticationType propriété est Sécurisé.
mise à JOUR 3:
Les deux suivantes à l'échec de la vérification des entrées ont été dans l'IIS distant du serveur de journal des événements de sécurité à chaque fois que j'ai essayé d'établir une connexion:
Premier événement:
Catégorie De L'Événement: Ouverture De Session De Compte
ID de l'événement: 680
Tentative de connexion par: MICROSOFT_AUTHENTICATION_PACKAGE_V1_0
Compte d'ouverture de session: ASPNET
Source De Station De Travail:
Code d'erreur: 0xC0000234
Deuxième événement:
Catégorie De L'Événement: Ouverture/Fermeture De Session
ID de l'événement: 529
Échec D'Ouverture De Session:
Motif: nom d'utilisateur Inconnu ou mot de passe incorrect
Nom d'utilisateur: ASPNET
Domaine: (Mondomaine)
Type D'Ouverture De Session: 3
Processus D'Ouverture De Session: NtLmSsp
Package d'authentification: NTLM
Nom De Station De Travail: (MyWorkstationId)
Nom D'Utilisateur Appelant: -
Domaine Appelant: -
Caller ID d'ouverture de session: -
L'appelant ID de Processus: -
A Transité Par Les Services De: -
Source De L'Adresse Réseau: 10.12.13.35
Port Source: 1708
L'usurpation d'identité est définie sur true et le nom d'utilisateur et mot de passe sont vides. C'est en utilisant le compte ASPNET sur la télécommande serveur IIS.
- Est-ce une console/application windows ou ASP.NET?
- Aussi ce qui se passe lorsque vous vous connectez au serveur distant à l'aide de la console MMC IIS sur votre PC à l'aide de "Connecter" à partir du click droit menu contextuel? Pouvez-vous vous connecter sans l'aide d'un nom d'utilisateur et le mot de passe (se Connecter en tant que)?
- J'ai mis à jour ma question à poser vos questions.
- Savez-vous que vous sont en cours d'exécution en vertu de votre compte de domaine lorsque le débogage? Êtes-vous à l'aide de Visual Studio serveur web pour le débogage ou IIS? si vous vous attachez à IIS à l'aide du débogueur vous êtes encore sous IIS utilisateur, ce qui est probablement le RÉSEAU de SERVICE ou à la MACHINE\iusr_ machine ou de la MACHINE\ASPNET
- Je suis à l'aide de Visual Studio pour déboguer mon application (F5).
- si vous n'Réponse.Écrire(Système D'.De sécurité.Principal.WindowsIdentity.GetCurrent().Nom); sur une page de test dans votre application web, ce fait-il que lorsque le débogage?
- C'est mon nom d'utilisateur et de domaine.
Vous devez vous connecter pour publier un commentaire.
Si c'est un problème d'identité, vous pouvez essayer le réglage de votre IIS 5.1 application à utiliser L'Authentification Intégrée De Windows, puis ajoutez les lignes suivantes à vous web.config sur votre IIS5.1 site web sous système.web pour permettre l'usurpation d'identité.
Puisque c'est une ASP.NET demande, il fonctionne dans un Pool d'Applications IIS. Ce Pool d'Applications s'exécute à l'aide d'un utilisateur spécifique (le"Système Local", "Service Réseau" ou un autre utilisateur).
Cet utilisateur les droits suffisants pour se connecter à un serveur distant ?
Voir MSDN pour plus d'info.
Cela ressemble, il peut être un double-saut problème. Si vous usurpant l'identité de l'utilisateur actuel d'un site web à l'aide de l'authentification NTLM, que l'usurpation d'identité est valide uniquement sur le serveur (IIS 5.1 serveur dans ce cas). Si vous essayez de vous connecter à un autre serveur en utilisant le site web, vous allez réellement à avoir des problèmes car il ne peut pas passer le jeton à un autre serveur qui a été utilisé lors de l'emprunt d'identité. La même chose est vraie si vous êtes le débogage de votre site par le biais de votre machine, d'aller vers une autre boîte. Votre machine locale est de vous authentifier, mais il ne peut pas se faire passer pour vous pour un autre serveur.
Toutes les solutions que j'ai utilisé dans le passé vous obliger à coder en dur le pool d'applications pour utiliser un compte qui dispose des autorisations, l'ensemble de la annony. compte à un compte de domaine avec des autorisations sur l'autre machine, ou d'utiliser un service windows en cours d'exécution sur le IIS 5.1 de la machine, sous un compte de domaine pour se connecter à l'autre serveur.
Si vous utilisez Kerberos, cela ne devrait pas s'appliquer, mais le PUBLICITAIRE utilise le protocole NTLM par défaut.
Exactement où êtes-vous essayer de lire trop? Est-il dans sous le même chemin que votre application?
Quand j'ai eu ce problème, j'ai trouvé que, tout simplement, l'authentification de mon auto sur un partage de fichiers Windows résolu le problème. Par expérience, je pense que WMI/ADSI/COM ne dispose pas d'un grand soutien pour les pas-déjà-les utilisateurs authentifiés. Je crois que ce problème se produit lorsque vous n'êtes pas associé à un domaine Windows.
Si c'est en effet un NTLM doublehop problème vous pouvez utiliser l'utilitaire SETSPN de créer le service principal instances nommées pour votre cible, les serveurs IIS.
Ensuite, vous pouvez aller dans Active Directory, puis permettre à l'ordinateur de l'objet (en gros le SERVICE de RÉSEAU ou de SERVICE LOCAL directeurs), de déléguer ses pouvoirs à un correctement enregistré SPN.
Alors vous pourriez hop-hop-hop tous sur la place! Mais, soyez avertis! Les gens peuvent se blesser sur les choses pointues et aiguisées lorsque vous activer le double-hop!
Bonne KB articles à lire:
http://support.microsoft.com/kb/929650
Je crois que DirectoryEntry.Existe ignore silencieusement toutes les informations d'identification fournies et utilise les creds de l'utilisateur authentifié. Cela semble correspondre au comportement que vous avez décrit. ANNONCE de travail, nous n'avons jamais l'utiliser pour cette raison.
Je suis un peu perplexe pour le moment pourquoi vous ne pouvez pas obtenir ce travail. Il y a un travail temporaire autour de vous pourriez essayer. Lors de l'instanciation de la
DirectoryEntry
objet, on peut utiliser le constructeur suivant les surcharges:Documenté à: MSDN: Constructeur DirectoryEntry (String, String, String)
...ou...
Documenté à: MSDN: Constructeur DirectoryEntry (String, String, String, AuthenticationTypes)
Il se trouve que je suis en train de construire un test environnement AD sur mon serveur virtuel box pour un nouveau projet à faire les mêmes choses. Quand j'ai commencer je vais avoir un jeu autour pour voir si je peux reproduire le problème auquel vous faites face. En attendant, laissez-nous savoir ce qui se passe si vous essayez ces surcharges de constructeur référencé ci-dessus.
Mise à jour (En réponse à Michaels commentaire):
Pour des raisons qui échappent moi tout à l'heure, nous ne pouvions pas utiliser
DirectoryEntry.Exists()
dans un scénario particulier, il y a cet extrait de code qui est appelé maintenant et à nouveau dans l'une de nos applications:Vous pouvez remplacer le constructeur avec l'un de ceux d'en haut. Certes c'est un coup de poignard dans le noir :).