2009-03-05 9 views
0

Ich bin dabei, eine kleine Webanwendung zu schreiben, mit der ich mehrere IIS-Installationen auf verschiedenen Servern in unserem Netzwerk verwalten kann. Wir haben keinen Domänencontroller.ADSI/IIS-Verwaltung und ASP.NET-Identitätswechsel

Ich habe einen kleinen Identitätswechsel-Controller geschrieben, der Win32-API und seine LogonUser-Methode verwendet. Ich verwende dann System.DirectoryServices und den IIS-ADSI-Anbieter, um eine neue Site zu erstellen.

Ich habe die folgende Routine (ausgetauscht einige Werte mit Klartextzeichenfolgen für eine bessere Lesbarkeit):

  if (impersonationSvc.ImpersonateValidUser("[email protected]", String.Empty, "PASSWORD)) 
      { 


      string metabasePath = "IIS://" + server.ComputerName + "/W3SVC"; 
      DirectoryEntry w3svc = new DirectoryEntry(metabasePath, "Administrator", "PASSWORD"); 

      string serverBindings = ":80:" + site.HostName; 
      string homeDirectory = server.WWWRootNetworkPath + "\\" + site.FolderName; 


      object[] newsite = new object[] { site.Name, new object[] { serverBindings }, homeDirectory }; 

      object websiteId = (object)w3svc.Invoke("CreateNewSite", newsite); 
      int id = (int)websiteId; 

      impersonationSvc.UndoImpersonation(); 
     } 

Diese Routine funktioniert, wenn ich den Server der Web-App verwenden, wird auf (SRV6) gehostet. Eine neue Site wird erstellt.

Wenn ich SRV5 zum Beispiel, ein anderer Server in unserem Netzwerk verwenden (ohne Domäne), ImpersonateValidUser arbeitet, wird die Directory erstellt, aber w3svc.Invoke schlägt mit dem folgenden Fehler:

[COMException (0x80070005) : Zugriff verweigert]

System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail) +377678 
System.DirectoryServices.DirectoryEntry.Bind() +36 
System.DirectoryServices.DirectoryEntry.get_NativeObject() +31 
System.DirectoryServices.DirectoryEntry.Invoke(String methodName, Object[] args) +53 

...

Jeder weiß, wie ich dieses Problem lösen könnte?

Antwort

1

Sie können in dieser Situation keinen Identitätswechsel verwenden. Das Konto, für das Sie sich ausgeben, benötigt Login-Privilegien auf dem lokalen Computer.

Wenn Ihre Webserver nicht Teil einer Domain sind, denke ich, dass die Idee von Tant102 von Webservices der einzige Weg ist.

+0

Sie haben Recht .. zu viel Kaffee – kitsune

0

Ich würde in das Ereignisprotokoll von SRV5 schauen, um zu überprüfen, welche Rechte verwendet werden, wenn Sie eine Verbindung zu diesem Server herstellen. Möglicherweise müssen Sie Ihre Gruppenrichtlinien ändern, um Fehler im Sicherheitsprotokoll zu protokollieren.

Es klingt einfacher, Webdienste auf Ihren Servern einzurichten, vorzugsweise durch Logins und/oder IP-Beschränkungen geschützt, die diese Art von Operationen ausführen.

Verwandte Themen