2009-03-12 9 views
2

Ich erhalte eine COMException "Zugriff auf bestimmte Objekte", wenn ich eine Verbindung mit einem Remote-IIS 6-Server über meine C# -Anwendung unter IIS 5.1 herstelle."Zugriff verweigert" beim Versuch, eine Verbindung mit einem Remote-IIS-Server herzustellen - C#

Irgendwelche Ideen? Ich habe die gleichen Probleme mit den ursprünglichen Fragen.

Update - 4/1/09

fand ich diese Lösung (http://www.codeproject.com/KB/cs/Start_Stop_IIS_Website.aspx), die auf einem IIS-Server Verbinden einer Fensteranwendung besteht zu starten und Web-Sites zu stoppen. Ich kann es auf meiner Arbeitsstation ausführen und eine Verbindung mit dem IIS-Server herstellen.

Ugh .... warum kann ich diese eigenständige Anwendung ausführen, aber nicht meine ASP.NET-Anwendung?

Original-

Ich erhalte einen „Zugriff verweigert“ COMException wenn ich versuche, von einem entfernten Rechner zu IIS verbinden die DirectoryEntry.Exist Methode zu überprüfen, um zu sehen, ob der IIS-Server gültig ist.

Ich bin Mitglied einer Active Directory-Gruppe, die den Administratorengruppen zu dem IIS-Server hinzugefügt wurde, mit dem ich mich verbinden möchte.

Hat jemand dieses Problem erlebt und weiß, wie man es löst?

UPDATE:

@Kev - Es ist eine ASP.NET-Anwendung. Außerdem kann ich über den IIS6-Manager eine Verbindung ohne Benutzernamen und Kennwort zum Remote-Server herstellen.

@Chris - Ich versuche eine Verbindung mit dem Remote-Server herzustellen, um die Anzahl der virtuellen Directorys anzuzeigen und die .NET Framework-Version jedes Verzeichnisses zu bestimmen. Siehe this SO Frage.

@dautzenb - Meine ASP.NET-Anwendung wird unter IIS 5.1 ausgeführt, um eine Verbindung mit einem IIS 6-Server herzustellen. Ich kann Fehlerprüfungen im Sicherheitsprotokoll für mein lokales ASPNET-Konto auf dem Remote-Server sehen. Wenn ich versuche, die Anwendung zu debuggen, laufe ich unter meinem Domain-Account und bekomme trotzdem Zugriff verweigert.

UPDATE 2:

@Kev - konnte ich ein Directory Objekt mit der folgenden Überlastung schaffen zu schaffen:

public DirectoryEntry 
( 
    string path,  
    string username,  
    string password 
) 

Aber alle Eigenschaften enthalten eine "eine Ausnahme ausgelöst vom Typ 'System.Runtime.InteropServices.COMException' ", während ich die App debugge.

Außerdem ist die AuthenticationType-Eigenschaft auf Secure festgelegt.

UPDATE 3:

Die folgenden zwei Fehlerüberwachungseinträge wurden in der Remote-Sicherheitsereignis der IIS-Server jedes Mal, melde ich mich um eine Verbindung herzustellen versucht:

Erste Veranstaltung:

Event Kategorie : Kontoanmeldung
Ereignis-ID: 680
Protokollversuch von: MICROSOFT_AUTHENTICATION_PACKAGE_V1_0
Anmeldung acco unt: ASPNET
Quelle Workstation:
Fehlercode: 0xC0000234

Zweite Veranstaltung:

Event Kategorie: Anmelden/Abmelden
Ereignis-ID: 529
Anmeldung fehlgeschlagen:
Grund: Unbekannter Benutzername oder falsches Kennwort
Benutzername: ASPNET
Domäne: (MyDomain)
Anmeldungstyp: 3
Anmeldeprozess: NtLmSsp
Authentifizierungspaket: NTLM
Workstation Name: (MyWorkstationId)
Caller Benutzername: -
Aufruferdomäne: -
Aufruferanmeldekennung: -
ID Caller-Prozess: -
Übertragene Dienstleistungen: -
Quellnetzwerkadresse: 10.12.13.35
Source Port: 1708

Der Identitätswechsel ist auf "wahr" gesetzt und der Benutzername und das Passwort sind leer. Es verwendet das ASPNET-Konto auf dem Remote-IIS-Server.

+0

Ist dies eine Konsole/Windows App oder ASP.NET? – Kev

+0

Was geschieht auch, wenn Sie über den IIS MMC auf Ihrem PC eine Verbindung zum Remote-Server herstellen, indem Sie im Kontextmenü den Befehl "Verbinden ..." wählen? Können Sie ohne Benutzername und Passwort verbinden (Connect as)? – Kev

+0

@Kev - Ich habe meine Frage aktualisiert, um Ihre Fragen zu stellen. –

Antwort

0

Wo genau versuchen Sie auch zu lesen? Ist es auf dem gleichen Weg wie Ihre Bewerbung?

+0

@Chris - Ich habe meine Frage aktualisiert, um Ihre Antwort zu beantworten –

1

Da dies eine ASP.NET-Anwendung ist, wird sie in einem Anwendungspool von IIS ausgeführt. Dieser Anwendungspool wird mit einem bestimmten Benutzer ("Lokales System", "Netzwerkdienst" oder einem anderen Benutzer) ausgeführt.

Verfügt dieser Benutzer über ausreichende Rechte zum Herstellen einer Verbindung mit einem Remoteserver?

See MSDN for more info.

+0

@dautzenb - Ich habe meine Frage basierend auf Ihrer Antwort aktualisiert –

0

Ich bin irgendwie im Moment ratlos, warum Sie diese Arbeit nicht bekommen kann. Es gibt eine temporäre Arbeit, die du ausprobieren könntest. Wenn Instanziieren des DirectoryEntry Objekt können Sie eine der folgenden Konstruktorüberladungen verwenden:

public DirectoryEntry(
    string path, 
    string username, 
    string password 
) 

Dokumentierte an: MSDN: DirectoryEntry Constructor (String, String, String)

... oder ...

public DirectoryEntry(
    string path, 
    string username, 
    string password, 
    AuthenticationTypes authenticationType 
) 

bei Dokumentiert: MSDN: DirectoryEntry Constructor (String, String, String, AuthenticationTypes)

Wie baue ich einen Test AD-Umgebung auf meiner virtuellen Server-Box für ein neues Projekt geschieht ähnliche Dinge zu tun. Wenn ich es in Gang setze, werde ich ein wenig herumspielen, um zu sehen, ob ich das Problem reproduzieren kann, dem Sie begegnen. In der Zwischenzeit lassen Sie uns wissen, was passiert, wenn Sie diese oben genannten Konstruktorüberladungen versuchen.

Update (In Antwort auf Michaels Kommentar):

Aus Gründen, die mich gerade ausweichen, wir nicht DirectoryEntry.Exists() in einem bestimmten Szenario verwenden könnten, gibt es diesen Code-Schnipsel, die hin und wieder aufgerufen werden in einer unserer Apps:

Sie könnten den Konstruktor durch einen der oben genannten ersetzen. Zugegeben, es ist ein Stich in die Dunkelheit :).

+0

Ich habe kein DirectoryEntry-Objekt erstellt, bevor ich die DirectoryEntry.Exists-Methoden aufruft. Sollte ich mich vor der Überprüfung am Remote-IIS-Server anmelden? –

+0

@Kev - Ich erhalte eine 'Zugriff verweigert' COMExcption, wenn ich die Name-Eigenschaft des DirectoryEntry-Objekts überprüfen. –

0

Als ich dieses Problem hatte, stellte ich fest, dass die einfache Authentifizierung meiner selbst auf einer Windows-Datei Freigabe das Problem gelöst. Aus Erfahrung denke ich, dass WMI/ADSI/COM keine Unterstützung für nicht bereits authentifizierte Benutzer bietet. Ich glaube, dieses Problem tritt auf, wenn Sie keiner Windows-Domäne zugeordnet sind.

2

Wenn es sich um ein Identitätsproblem handelt, können Sie versuchen, Ihre IIS 5.1-Anwendung auf Integrated Windows Authentication zu setzen und dann das folgende web.conf auf Ihrer IIS5.1-Website unter system.web hinzuzufügen, um impersonation zu aktivieren.

<identity impersonate="true"/> 
<authentication mode="Windows" /> 
+0

Ich habe das schon versucht und es hat nicht funktioniert. Ich habe sogar versucht, meine Anmeldeinformationen explizit zu verwenden, und es hat immer noch nicht funktioniert. –

1

Das sieht wie ein Doppel-Hop-Problem aus. Wenn Sie sich als der aktuelle Benutzer einer Website ausgeben, die NTLM verwendet, ist dieser Identitätswechsel nur auf diesem Server (in diesem Fall Ihrem IIS 5.1-Server) gültig. Wenn Sie versuchen, über die Website eine Verbindung mit einem anderen Server herzustellen, treten Probleme auf, da das Token nicht an einen anderen Server übergeben werden kann, der während des Identitätswechsels verwendet wurde. Das gleiche gilt, wenn Sie Ihre Website über Ihren Computer debuggen und in eine andere Box wechseln. Ihr lokaler Computer authentifiziert Sie, aber Sie können sich nicht für einen anderen Server ausgeben.

Alle Lösungen, die ich in der Vergangenheit verwendet habe, erfordern, dass Sie den App-Pool fest codieren, um ein Konto zu verwenden, das über Berechtigungen verfügt, und legen Sie die annony fest. Melden Sie sich bei einem Domänenkonto mit Berechtigungen auf dem anderen Computer an, oder verwenden Sie einen Windows-Dienst, der auf dem IIS 5.1-Computer unter einem Domänenkonto ausgeführt wird, um eine Verbindung mit dem anderen Server herzustellen.

Wenn Sie Kerberos verwenden, gilt dies nicht, aber AD verwendet standardmäßig NTLM.

0

Wenn es sich tatsächlich um ein NTLM-Doublehop-Problem handelt, können Sie mit dem SETSPN-Dienstprogramm benannte Instanzen des Dienstprinzipalnamen für Ihre IIS-Zielserver erstellen.

Dann könnten Sie in Active Directory gehen und dann das Computerobjekt (im Grunde die NETWORK SERVICE- oder LOCAL SERVICE-Principals) erlauben, seine Anmeldeinformationen an einen korrekt registrierten SPN zu delegieren.

Dann könnten Sie überall Hop-Hop-Hop! Aber sei gewarnt! Menschen können sich an scharfen spitzen Dingen verletzen, wenn Sie Double-Hop aktivieren!

Gut KB-Artikel zu lesen:

http://support.microsoft.com/kb/929650

0

Ich glaube, dass DirectoryEntry.Exists ignoriert stumm keine Anmeldeinformationen geliefert und verwendet die creds des authentifizierten Benutzers. Dies scheint mit dem von Ihnen beschriebenen Verhalten übereinzustimmen. Für AD arbeiten wir nie aus diesem Grund.