ネイティブ コード (C++) を使用して単純な FTP ログ プロバイダーを作成する方法
公開日: 2009 年 3 月 18 日 (作業者: iisteam (英語))
更新日: 2009 年 9 月 11 日 (作業者: iisteam (英語))
マイクロソフトでは、Windows Server® 2008 用に完全に書き換えた新しい FTP サービスを作成しました。この新しい FTP サービスでは多くの新機能が追加され、Web サイト作成者は簡単にコンテンツを発行でき、Web 管理者は多くのセキュリティ オプションと展開オプションを使用できます。
この新しい FTP 7.5 サービスでは、FTP サービスに付属の組み込み機能の拡張を可能にする拡張機能がサポートされます。具体的には、FTP 7.5 で、独自の認証プロバイダーおよび承認プロバイダーの作成がサポートされます。さらに、カスタム FTP ログ作成および FTP ユーザーのホーム ディレクトリ情報の判定を行うためのプロバイダーを作成することもできます。
このチュートリアルでは、ネイティブ コードを使用して単純な FTP ログ プロバイダーを作成するステップを説明します。
必要条件
この記事の手順を完了するには、以下の項目が必須です。
- 1. Windows Server 2008 サーバーに IIS 7 がインストールされている必要があります。また、インターネット インフォメーション サービス (IIS) マネージャーもインストールされている必要があります。
- 新しい FTP 7.5 サービスがインストールされている必要があります。FTP 7.5 サービスは、Web サイト (https://www.iis.net/(英語)) からダウンロードしてインストールできます。次のいずれかのリンクを使用してください。
- FTP 発行用のルート フォルダーを作成する必要があります。
- Visual Studio 2008 を使用する必要があります。
- メモ: Visual Studio の旧バージョンを使用すると、このチュートリアルのステップの一部が不正確になる可能性があります。
- メモ: Windows の 64 ビット バージョン用のカスタム FTP プロバイダーを作成する場合は、Visual Studio 用の 64 ビット ツールおよびコンパイラをインストールする必要があります。64 ビット開発についての追加情報は、Microsoft MSDN Web サイトのトピック「Visual Studio 64 ビット コンポーネントのインストール」に記載されています。
- ログ用のフォルダーを作成する必要があります。このコード サンプルでは C:\logfiles\myftpsite を使用していますが、必要に応じて変更できます。
ステップ 1: プロジェクト環境のセットアップ
このステップでは、デモ プロバイダー用のプロジェクトを Visual Studio 2008 で作成します。
- Microsoft Visual Studio 2008 を開きます。
- [ファイル] メニューの [新規作成] をクリックし、[プロジェクト] をクリックします。
- [新しいプロジェクト] ダイアログ ボックスで以下の操作を行います。
- プロジェクトの種類として [Visual C++] を選択します。
- テンプレートとして [ATL プロジェクト] を選択します。
- プロジェクト名として「FtpLoggingDemo」と入力します。
- [OK] をクリックします。
- [ATL プロジェクト ウィザード] ダイアログ ボックスで以下の操作を行います。
- [次へ] をクリックします。
- [ダイナミック リンク ライブラリ (DLL)] のみがオンになっていることを確認します。
- [完了] をクリックします。
- プロジェクトが開いたら、プロジェクトに ATL クラスを追加します。
- [プロジェクト] メニューの [クラスの追加] をクリックします。
- テンプレートとして [ATL シンプル オブジェクト] を選択します。
- [追加] をクリックします。
- [ATL シンプル オブジェクト ウィザード] が表示されたら、以下の操作を行います。
- 短い名前として「FtpLogDemo」と入力し、他の値は既定値のままにします。
- [次へ] をクリックします。
- 以下のオプションを選択します。
- [スレッド モデル] に [アパートメント] を選択します (メモ: これはアプリケーションのニーズに合わせてカスタマイズできます)。
- [アグリゲーション] で [いいえ] を選択します (メモ: これはアプリケーションのニーズに合わせてカスタマイズできます)。
- [インターフェイス] で [カスタム] を選択します。
- [完了] をクリックします。
- 拡張機能インターフェイスを追加します。
[表示] メニューの [クラス ビュー] をクリックします。
[クラス ビュー] ウィンドウで、[FtpLoggingDemo] を展開します。
[CFtpLogDemo] を右クリックし、[追加] をクリックしてから、[インターフェイスの実装] をクリックします。
インターフェイスの実装に [ファイル] を選択します。
[場所] には、FTP 拡張機能タイプ ライブラリのフル パスを入力します。次に例を示します。
C:\Windows\System32\inetsrv\ftpext.tlb
メモ: 64 ビット コンピューター上で開発している場合は、FTP 拡張機能タイプ ライブラリを次の 32 ビット パスにコピーして、その場所を使用する必要があります。次に例を示します。
C:\Windows\SysWOW64\inetsrv\ftpext.tlb
実装する以下のインターフェイスを選択します。
- IFtpLogProvider
[完了] をクリックします。
- DLL が自動的に登録されないようにプロジェクトを構成します。
- [プロジェクト] メニューの [FtpLoggingDemo のプロパティ] をクリックします。
- [構成プロパティ] を展開し、[リンカ] をクリックします。
- [出力の登録] を選択し、ドロップダウン メニューの [いいえ] をクリックします。
- [OK] をクリックします。
- オプション: Windows の 32 ビット バージョン上でカスタム プロバイダーを開発している場合は、カスタム ビルド イベントを追加して、開発コンピューターに DLL が自動的に展開され登録されるようにすることもできます(メモ: これらのステップは Windows の 64 ビット バージョンには適用できません)。カスタム ビルド イベントを追加するには、以下のステップに従います。
[プロジェクト] メニューの [FtpLoggingDemo のプロパティ] をクリックします。
[構成プロパティ] を展開し、さらに [ビルド イベント] を展開してから、[ビルド後のイベント] をクリックします。
[コマンド ライン] テキスト ボックスの右側にある省略記号 [...] をクリックします。
[コマンド ライン] ダイアログ ボックスに、次を入力します。
net stop ftpsvc copy /y "$(TargetPath)" "%WINDIR%\System32\inetsrv" regsvr32.exe /s "%WINDIR%\System32\inetsrv\$(TargetFileName)" net start ftpsvc
[OK] をクリックして [コマンド ライン] ダイアログ ボックスを閉じます。
[OK] をクリックして [FtpLoggingDemo プロパティ ページ] ダイアログ ボックスを閉じます。
- Windows の 64 ビット バージョン用のプロバイダーを開発している場合は、64 ビット コンパイル用のビルド構成を追加する必要があります。
- [ビルド] メニューの [構成マネージャ] をクリックします。
- [アクティブ ソリューション プラットフォーム] ドロップダウン メニュー の [<新規作成>] をクリックします。
- [新しいプラットフォームを入力または選択してください] ドロップダウン メニュー の [x64] をクリックします。
- [OK] をクリックします。
- [閉じる] をクリックします。
- プロジェクトを保存します。
ステップ 2: 拡張機能インターフェイスの実装
このステップでは、デモ プロバイダー用の拡張機能インターフェイスを実装します。
IFtpLogProvider インターフェイスを実装します。
[クラス ビュー] で、[Log] メソッドをダブルクリックします。
既存の実装を以下のコードで置き換えます。
// IFtpLogProvider メソッドpublic: STDMETHOD(Log)(LOGGING_PARAMETERS * pLoggingParameters) { // メモ: 独自のカスタム ロジックをここに追加できます。 HRESULT hr = S_OK; DWORD dwResult; HANDLE hFile; char szLogEntry[256]=""; const DWORD FILE_WRITE_TO_END_OF_FILE = 0xffffffff; OVERLAPPED Overlapped = { 0 }; Overlapped.Offset = FILE_WRITE_TO_END_OF_FILE; Overlapped.OffsetHigh = -1; // このログ エントリのために現在の日時を取得します。 SYSTEMTIME CurrentTime; GetSystemTime(&CurrentTime); // 出力用のログ ファイルを開きます。 hFile = CreateFile( L"\\\\?\\C:\\logfiles\\myftpsite\\myftplog.log", GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH, NULL); // 失敗した場合にエラーを返します。if (hFile == INVALID_HANDLE_VALUE) { hr = HRESULT_FROM_WIN32(GetLastError()); goto EXIT; } // ログ エントリの形式を整えます。 hr = StringCchPrintfA( szLogEntry,256, "%04d-%02d-%02d\t%02d:%02d:%02d\t%S\t%d\r\n", CurrentTime.wYear,CurrentTime.wMonth,CurrentTime.wDay, CurrentTime.wHour,CurrentTime.wMinute,CurrentTime.wSecond, pLoggingParameters->pszCommand, pLoggingParameters->FtpStatus); // エラー テスト。if (FAILED(hr)) { // 失敗した場合にエラーを返します。 hr = HRESULT_FROM_WIN32(GetLastError()); goto EXIT; } // ログ エントリをログ ファイルに書き込みます。if(!WriteFile(hFile, szLogEntry, strlen(szLogEntry), &dwResult, &Overlapped)) { // 失敗した場合にエラーを返します。 hr = HRESULT_FROM_WIN32(GetLastError()); goto EXIT; } EXIT: // ログ ファイルが開かれている場合は閉じます。if(CloseHandle(hFile)==0) { // 失敗した場合にエラーを返します。 hr = HRESULT_FROM_WIN32(GetLastError()); } return hr; }
FtpLogDemo.h ファイルの先頭に、strsafe.h に対するインクルード ファイル参照を追加します。
#include "strsafe.h"
プロジェクトを保存してビルドします。
ステップ 3: FTP へのログ プロバイダーの追加
このステップでは、デモ プロバイダーを FTP サービスおよび既定の Web サイトに追加します。
- FTP 認証プロバイダーのグローバル リストに拡張機能プロバイダーを追加します。
- インターネット インフォメーション サービス (IIS) マネージャーを開きます。
- [接続] ウィンドウで、コンピューターの名前をクリックします。
- メイン ウィンドウで [FTP 認証] をダブルクリックします。
- [操作] ウィンドウで、[カスタム プロバイダー] をクリックします。
- [登録] をクリックします。
- プロバイダーの [名前] に「FtpLoggingDemo」と入力します。
- [ネイティブ プロバイダー (COM)] をクリックします。
- 拡張機能プロバイダーのクラス名に「FtpLoggingDemo.FtpLogDemo」と入力します。
- [OK] をクリックします。
- プロバイダーの一覧の [FtpLoggingDemo] チェック ボックスをオフにします。
- [OK] をクリックします。
- サイトにカスタム プロバイダーを追加します。
サイトにカスタム機能を追加するための UI がないので、次のコマンド ラインを使用する必要があります。
AppCmd set site "Default Web Site" /+ftpServer.customFeatures.providers.[name='FtpLoggingDemo',enabled='true'] /commit:apphost
まとめ
このチュートリアルでは、次について学びました。
- カスタム FTP ログ プロバイダー用に Visual Studio 2008 でプロジェクトを作成する方法
- カスタム FTP ログ用の拡張機能インターフェイスの実装方法
- FTP サービスへのカスタム認証プロバイダーの追加方法
ユーザーが FTP サイトに接続したときに、FTP サービスはデモ プロバイダーに指定されているパスにログ ファイルを作成します。