ネイティブ コード (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. 1. Windows Server 2008 サーバーに IIS 7 がインストールされている必要があります。また、インターネット インフォメーション サービス (IIS) マネージャーもインストールされている必要があります。
  2. 新しい FTP 7.5 サービスがインストールされている必要があります。FTP 7.5 サービスは、Web サイト (https://www.iis.net/(英語)) からダウンロードしてインストールできます。次のいずれかのリンクを使用してください。
  3. FTP 発行用のルート フォルダーを作成する必要があります。
  4. Visual Studio 2008 を使用する必要があります。
    • メモ: Visual Studio の旧バージョンを使用すると、このチュートリアルのステップの一部が不正確になる可能性があります。
    • メモ: Windows の 64 ビット バージョン用のカスタム FTP プロバイダーを作成する場合は、Visual Studio 用の 64 ビット ツールおよびコンパイラをインストールする必要があります。64 ビット開発についての追加情報は、Microsoft MSDN Web サイトのトピック「Visual Studio 64 ビット コンポーネントのインストール」に記載されています。
  5. ログ用のフォルダーを作成する必要があります。このコード サンプルでは C:\logfiles\myftpsite を使用していますが、必要に応じて変更できます。

ステップ 1: プロジェクト環境のセットアップ

このステップでは、デモ プロバイダー用のプロジェクトを Visual Studio 2008 で作成します。

  1. Microsoft Visual Studio 2008 を開きます。
  2. [ファイル] メニューの [新規作成] をクリックし、[プロジェクト] をクリックします。
  3. [新しいプロジェクト] ダイアログ ボックスで以下の操作を行います。
    • プロジェクトの種類として [Visual C++] を選択します。
    • テンプレートとして [ATL プロジェクト] を選択します。
    • プロジェクト名として「FtpLoggingDemo」と入力します。
    • [OK] をクリックします。
  4. [ATL プロジェクト ウィザード] ダイアログ ボックスで以下の操作を行います。
    • [次へ] をクリックします。
    • [ダイナミック リンク ライブラリ (DLL)] のみがオンになっていることを確認します。
    • [完了] をクリックします。
  5. プロジェクトが開いたら、プロジェクトに ATL クラスを追加します。
    • [プロジェクト] メニューの [クラスの追加] をクリックします。
    • テンプレートとして [ATL シンプル オブジェクト] を選択します。
    • [追加] をクリックします。
  6. [ATL シンプル オブジェクト ウィザード] が表示されたら、以下の操作を行います。
    • 短い名前として「FtpLogDemo」と入力し、他の値は既定値のままにします。
    • [次へ] をクリックします。
    • 以下のオプションを選択します。
      • [スレッド モデル] に [アパートメント] を選択します (メモ: これはアプリケーションのニーズに合わせてカスタマイズできます)。
      • [アグリゲーション] で [いいえ] を選択します (メモ: これはアプリケーションのニーズに合わせてカスタマイズできます)。
      • [インターフェイス] で [カスタム] を選択します。
    • [完了] をクリックします。
  7. 拡張機能インターフェイスを追加します。
    • [表示] メニューの [クラス ビュー] をクリックします。

    • [クラス ビュー] ウィンドウで、[FtpLoggingDemo] を展開します。

    • [CFtpLogDemo] を右クリックし、[追加] をクリックしてから、[インターフェイスの実装] をクリックします。

    • インターフェイスの実装に [ファイル] を選択します。

    • [場所] には、FTP 拡張機能タイプ ライブラリのフル パスを入力します。次に例を示します。

      C:\Windows\System32\inetsrv\ftpext.tlb
      

      メモ: 64 ビット コンピューター上で開発している場合は、FTP 拡張機能タイプ ライブラリを次の 32 ビット パスにコピーして、その場所を使用する必要があります。次に例を示します。

      C:\Windows\SysWOW64\inetsrv\ftpext.tlb
      
    • 実装する以下のインターフェイスを選択します。

      • IFtpLogProvider
    • [完了] をクリックします。

  8. DLL が自動的に登録されないようにプロジェクトを構成します。
    • [プロジェクト] メニューの [FtpLoggingDemo のプロパティ] をクリックします。
    • [構成プロパティ] を展開し、[リンカ] をクリックします。
    • [出力の登録] を選択し、ドロップダウン メニューの [いいえ] をクリックします。
    • [OK] をクリックします。
  9. オプション: 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 プロパティ ページ] ダイアログ ボックスを閉じます。

  10. Windows の 64 ビット バージョン用のプロバイダーを開発している場合は、64 ビット コンパイル用のビルド構成を追加する必要があります。
    • [ビルド] メニューの [構成マネージャ] をクリックします。
    • [アクティブ ソリューション プラットフォーム] ドロップダウン メニュー の [<新規作成>] をクリックします。
    • [新しいプラットフォームを入力または選択してください] ドロップダウン メニュー の [x64] をクリックします。
    • [OK] をクリックします。
    • [閉じる] をクリックします。
  11. プロジェクトを保存します。

ステップ 2: 拡張機能インターフェイスの実装

このステップでは、デモ プロバイダー用の拡張機能インターフェイスを実装します。

  1. 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;
      }
      
  2. FtpLogDemo.h ファイルの先頭に、strsafe.h に対するインクルード ファイル参照を追加します。

    #include "strsafe.h"
    
  3. プロジェクトを保存してビルドします。

ステップ 3: FTP へのログ プロバイダーの追加

このステップでは、デモ プロバイダーを FTP サービスおよび既定の Web サイトに追加します。

  1. FTP 認証プロバイダーのグローバル リストに拡張機能プロバイダーを追加します。
    • インターネット インフォメーション サービス (IIS) マネージャーを開きます。
    • [接続] ウィンドウで、コンピューターの名前をクリックします。
    • メイン ウィンドウで [FTP 認証] をダブルクリックします。
    • [操作] ウィンドウで、[カスタム プロバイダー] をクリックします。
    • [登録] をクリックします。
    • プロバイダーの [名前] に「FtpLoggingDemo」と入力します。
    • [ネイティブ プロバイダー (COM)] をクリックします。
    • 拡張機能プロバイダーのクラス名に「FtpLoggingDemo.FtpLogDemo」と入力します。
    • [OK] をクリックします。
    • プロバイダーの一覧の [FtpLoggingDemo] チェック ボックスをオフにします。
    • [OK] をクリックします。
  2. サイトにカスタム プロバイダーを追加します。
    • サイトにカスタム機能を追加するための UI がないので、次のコマンド ラインを使用する必要があります。

      AppCmd set site "Default Web Site" /+ftpServer.customFeatures.providers.[name='FtpLoggingDemo',enabled='true'] /commit:apphost
      

まとめ

このチュートリアルでは、次について学びました。

  • カスタム FTP ログ プロバイダー用に Visual Studio 2008 でプロジェクトを作成する方法
  • カスタム FTP ログ用の拡張機能インターフェイスの実装方法
  • FTP サービスへのカスタム認証プロバイダーの追加方法

ユーザーが FTP サイトに接続したときに、FTP サービスはデモ プロバイダーに指定されているパスにログ ファイルを作成します。

関連コンテンツ

記事