Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
von Robert McMurray
[Diese Dokumentation ist vorläufig. Änderungen vorbehalten.]
Kompatibilität
Version | Hinweise |
---|---|
IIS 8.0 | Der FTP 8.0-Dienst ist für die benutzerdefinierte FTP-Ereignisbehandlung erforderlich. |
IIS 7.5 | Die benutzerdefinierte FTP-Ereignisbehandlung wird in FTP 7.5 für IIS 7.5 nicht unterstützt. |
IIS 7.0 | Die benutzerdefinierte FTP-Ereignisbehandlung wird in FTP 7.0 für IIS 7.0 nicht unterstützt. |
Hinweis: Der FTP 8.0-Dienst wird als Funktion für IIS 8.0 in Windows 8 und Windows 8 Server ausgeliefert.
Einführung
Microsoft hat einen neuen FTP 8.0-Dienst für Windows Server® 2012 erstellt, der auf den umfangreichen Features basiert, die in FTP 7.0 und FTP 7.5 eingeführt wurden. Darüber hinaus erweitert dieser neue FTP-Dienst die Liste der Anwendungsprogrammierschnittstellen (APPLICATION Programming Interfaces, APIs) für FTP mit neuen Erweiterungsfunktionen wie Unterstützung für benutzerdefinierte Autorisierung und einfache Ereignisverarbeitung.
In diesem Sinne führt Sie diese Anleitung durch die Schritte zur Verwendung von verwaltetem Code, um einen einfachen FTP-Provider zu erstellen, der verhindert, dass Benutzer mehr Dateien pro Sitzung herunterladen, als Sie zulassen möchten, ein Verhalten, das in der Internetsprache als „Leeching“ bekannt ist. Der FTP-Anbieter in dieser exemplarischen Vorgehensweise implementiert die IFtpPreprocessProvider.HandlePreprocess()
- und IFtpPostprocessProvider.HandlePostprocess()
-Methoden, um einen Benutzer auf eine maximale Anzahl von Downloads zu beschränken, die Sie im Eintrag Ihres Anbieters in der Datei ApplicationHost.config angeben.
Voraussetzungen
Die folgenden Elemente sind erforderlich, um die Verfahren in diesem Artikel abzuschließen:
- IIS 8.0 oder höher muss auf Ihrem Windows Server 2012 Server installiert sein, und der Internetinformationsdienste (IIS)-Manager muss ebenfalls installiert sein.
- Der neue FTP 8.0-Dienst muss installiert sein.
- Sie müssen Visual Studio installieren.
Hinweis: Diese exemplarische Vorgehensweise wurde mithilfe von Visual Studio 2010 geschrieben. Wenn Sie andere Versionen von Visual Studio verwenden, sind einige der Schritte in dieser exemplarischen Vorgehensweise möglicherweise nicht exakt.
Schritt 1: Einrichten der Projektumgebung
In diesem Schritt erstellen Sie ein Projekt in Visual Studio 2010 für den Demoanbieter.
Öffnen Sie Microsoft Visual Studio 2010.
Klicken Sie auf das Menü Datei, dann auf Neu und dann auf Projekt.
Im Dialogfeld Neues Projekt:
- Wählen Sie Visual C# als Projekttyp aus.
- Wählen Sie Klassenbibliothek als Vorlage aus.
- Geben Sie FtpLeechPrevention als Namen des Projekts ein.
- Klicken Sie auf OK.
Fügen Sie dem Projekt einen Schlüssel mit einem starken Namen hinzu:
- Klicken Sie auf Projekt, und klicken Sie dann auf FtpLeechPrevention-Eigenschaften.
- Klicken Sie auf die Registerkarte Signierung.
- Aktivieren Sie das Kontrollkästchen Assembly signieren.
- Wählen Sie aus dem Dropdownfeld mit starkem Schlüsselnamen <Neu …> aus.
- Geben Sie FtpLeechPreventionKey für den Schlüsseldateinamen ein.
- Geben Sie bei Bedarf ein Kennwort für die Schlüsseldatei ein; deaktivieren Sie andernfalls das Kontrollkästchen Meine Schlüsseldatei mit einem Kennwort schützen.
- Klicken Sie auf OK.
Fügen Sie ein benutzerdefiniertes Build-Ereignis hinzu, um die DLL automatisch dem globalen Assemblycache (GAC) auf Ihrem Entwicklungscomputer hinzuzufügen:
Klicken Sie auf Projekt, und klicken Sie dann auf FtpLeechPrevention-Eigenschaften.
Klicken Sie auf die Registerkarte Buildereignisse.
Geben Sie im Dialogfeld Befehlszeile für Postbuildereignis Folgendes ein:
net stop ftpsvc call "%VS100COMNTOOLS%\vsvars32.bat">nul gacutil.exe /if "$(TargetPath)" net start ftpsvc
Speichern Sie das Projekt.
Schritt 2: Erstellen der Erweiterbarkeitsklasse
In diesem Schritt implementieren Sie die Erweiterbarkeitsschnittstelle für den Demoanbieter.
Fügen Sie einen Verweis auf die FTP-Erweiterbarkeitsbibliothek für das Projekt hinzu:
- Klicken Sie auf Projekt, und klicken Sie dann auf Verweis hinzufügen...
- Klicken Sie auf die Registerkarte Durchsuchen.
- Navigieren Sie zu Ihrem
%ProgramFiles(x86)%\Reference Assemblies\Microsoft\IIS
-Ordner. - Klicken Sie auf Microsoft.Web.FtpServer und dann auf OK.
Fügen Sie den Code für die Authentifizierungsklasse hinzu:
Doppelklicken Sie im Projektmappen-Explorer auf die Datei Class1.cs.
Entfernen Sie den vorhandenen Code.
Fügen Sie den folgenden Code in den Editor ein:
using System; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using Microsoft.Web.FtpServer; public class FtpLeechPrevention : BaseProvider, IFtpPreprocessProvider, IFtpPostprocessProvider, IFtpLogProvider { private static Dictionary<string, int> _sessionList = null; private static int _maxDownloads = 1; protected override void Initialize(StringDictionary config) { // Test if the dictionary has been created. if (_sessionList == null) { // Create the dictionary if it hasn't been created. _sessionList = new Dictionary<string, int>(); } // Retrieve the max downloads from configuration. if (string.IsNullOrEmpty(config["MaxDownloads"]) == false) _maxDownloads = Convert.ToInt16(config["MaxDownloads"]); } public FtpProcessStatus HandlePreprocess( FtpPreprocessParameters preProcessParameters) { // Test if the command was a RETR command. if (preProcessParameters.Command.Equals( "RETR", StringComparison.InvariantCultureIgnoreCase)) { // Test if the max download count was exceeded. if (_sessionList[preProcessParameters.SessionId].Equals(_maxDownloads)) { // Reject the command if the max download count was exceeded. return FtpProcessStatus.FtpProcessRejectCommand; } } return FtpProcessStatus.FtpProcessContinue; } public FtpProcessStatus HandlePostprocess( FtpPostprocessParameters postProcessParameters) { // Test if the command was a successful RETR command. if (postProcessParameters.Command.Equals( "RETR", StringComparison.InvariantCultureIgnoreCase) && postProcessParameters.FtpStatus == 226) { // Increment the download count. _sessionList[postProcessParameters.SessionId]++; } return FtpProcessStatus.FtpProcessContinue; } public void Log(FtpLogEntry logEntry) { // Test if the control channel was opened. if (logEntry.Command.Equals( "ControlChannelOpened", StringComparison.InvariantCultureIgnoreCase)) { // Add the current session to the dictionary. _sessionList.Add(logEntry.SessionId, 0); } // Test if the control channel was closed. if (logEntry.Command.Equals( "ControlChannelClosed", StringComparison.InvariantCultureIgnoreCase)) { // Remove the current session from the dictionary. _sessionList.Remove(logEntry.SessionId); } } }
Speichern und kompilieren Sie das Projekt.
Hinweis
Wenn Sie die optionalen Schritte zur Registrierung der Assemblys im GAC nicht verwendet haben, müssen Sie die Assemblys manuell auf Ihren IIS 8.0-Computer kopieren und die Assemblys mit dem Tool Gacutil.exe zum GAC hinzufügen. Weitere Informationen finden Sie im folgenden Artikel:
Schritt 3: Hinzufügen des benutzerdefinierten Anbieters zu FTP
In diesem Schritt fügen Sie den Demoanbieter zu Ihrem FTP-Dienst sowie eine FTP-Site hinzu.
Ermitteln Sie die Assembly-Informationen für den Erweiterbarkeitsanbieter:
Öffnen Sie eine Eingabeaufforderung, und geben Sie die folgenden Befehle ein:
call "%VS100COMNTOOLS%\vsvars32.bat" gacutil.exe /l FtpLeechPrevention
Kopieren Sie die Informationen für die FtpLeechPrevention-Assembly; zum Beispiel:
FtpLeechPrevention, Version=1.0.0.0, Culture=neutral, PublicKeyToken=426f62526f636b73
Schließen Sie .
Fügen Sie den Erweiterbarkeitsanbieter zur globalen Liste der FTP-Anbieter hinzu:
Derzeit gibt es keine Benutzeroberfläche, mit der Sie einen benutzerdefinierten Anbieter mit den zugehörigen Konfigurationseinstellungen zu IIS hinzufügen können. Daher müssen Sie eine Befehlszeilensyntax wie im folgenden Beispiel verwenden:
cd /d "%WinDir%\System32\Inetsrv" appcmd.exe set config -section:system.ftpServer/providerDefinitions /+"[name='FtpLeechPrevention',type='FtpLeechPrevention,FtpLeechPrevention,version=1.0.0.0,Culture=neutral,PublicKeyToken=426f62526f636b73']" /commit:apphost appcmd.exe set config -section:system.ftpServer/providerDefinitions /+"activation.[name='FtpLeechPrevention']" /commit:apphost appcmd.exe set config -section:system.ftpServer/providerDefinitions /+"activation.[name='FtpLeechPrevention'].[key='MaxDownloads',value='5']" /commit:apphost
Hinweis
Sie müssen die oben genannte Syntax mithilfe der verwalteten Typinformationen für Ihren Anbieter und die gewünschte Anzahl von Downloads aktualisieren.
Hinzufügen des benutzerdefinierten Anbieters zu einer Site:
Derzeit gibt es keine Benutzeroberfläche, mit der Sie einer Website benutzerdefinierte Features hinzufügen können. Daher müssen Sie eine Befehlszeilensyntax wie das folgende Beispiel verwenden, das die Standardwebsite konfiguriert:
cd /d "%WinDir%\System32\Inetsrv" appcmd.exe set site "Default Web Site" /+ftpServer.customFeatures.providers.[name='FtpLeechPrevention',enabled='true'] /commit:apphost
Zusammenfassung
In dieser Anleitung haben Sie folgendes gelernt:
- Ein Projekt in Visual Studio 2010 für einen benutzerdefinierten FTP-Anbieter zu erstellen.
- Die Erweiterbarkeitsschnittstelle für benutzerdefinierte FTP-Funktionen zu implementieren.
- Ihrem FTP-Dienst einen benutzerdefinierten Anbieter hinzuzufügen.
Wenn ein FTP-Client eine Verbindung zum FTP-Dienst herstellt, zählt der FTP-Anbieter, wie oft ein FTP-Client eine Datei herunterlädt, und verhindert, dass der Benutzer mehr Dateien pro Sitzung herunterlädt, als Sie in Ihren Konfigurationseinstellungen erlaubt haben.