ネイティブ コード (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 ホーム ディレクトリ プロバイダーを作成するステップを説明します。
必要条件
この記事の手順を完了するには、以下の項目が必須です。
- 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:\Ftpusers\%**UserDomain%\%**UserName% を使用していますが、必要に応じて変更できます。
ステップ 1: プロジェクト環境のセットアップ
このステップでは、デモ プロバイダー用のプロジェクトを Visual Studio 2008 で作成します。
- Microsoft Visual Studio 2008 を開きます。
- [ファイル] メニューの [新規作成] をクリックし、[プロジェクト] をクリックします。
- [新しいプロジェクト] ダイアログ ボックスで以下の操作を行います。
- プロジェクトの種類として [Visual C++] を選択します。
- テンプレートとして [ATL プロジェクト] を選択します。
- プロジェクト名として「FtpHomeDirectoryDemo」と入力します。
- [OK] をクリックします。
- [ATL プロジェクト ウィザード] ダイアログ ボックスで以下の操作を行います。
- [次へ] をクリックします。
- [ダイナミック リンク ライブラリ (DLL)] のみがオンになっていることを確認します。
- [完了] をクリックします。
- プロジェクトが開いたら、プロジェクトに ATL クラスを追加します。
- [プロジェクト] メニューの [クラスの追加] をクリックします。
- テンプレートとして [ATL シンプル オブジェクト] を選択します。
- [追加] をクリックします。
- [ATL シンプル オブジェクト ウィザード] が表示されたら、以下の操作を行います。
- 短い名前として「FtpHomeDirDemo」と入力し、他の値は既定値のままにします。
- [次へ] をクリックします。
- 以下のオプションを選択します。
- [スレッド モデル] に [アパートメント] を選択します (メモ: これはアプリケーションのニーズに合わせてカスタマイズできます)。
- [アグリゲーション] で [いいえ] を選択します (メモ: これはアプリケーションのニーズに合わせてカスタマイズできます)。
- [インターフェイス] で [カスタム] を選択します。
- [完了] をクリックします。
- 拡張機能インターフェイスを追加します。
[表示] メニューの [クラス ビュー] をクリックします。
[クラス ビュー] ウィンドウで、[FtpHomeDirectoryDemo] を展開します。
[CFtpHomeDirDemo] を右クリックし、[追加] をクリックしてから、[インターフェイスの実装] をクリックします。
インターフェイスの実装に [ファイル] を選択します。
[場所] には、FTP 拡張機能タイプ ライブラリのフル パスを入力します。次に例を示します。
C:\Windows\System32\inetsrv\ftpext.tlb
メモ: 64 ビット コンピューター上で開発している場合は、FTP 拡張機能タイプ ライブラリを次の 32 ビット パスにコピーして、その場所を使用する必要があります。次に例を示します。
C:\Windows\SysWOW64\inetsrv\ftpext.tlb
実装する以下のインターフェイスを選択します。
- IFtpHomeDirectoryProvider
[完了] をクリックします。
- DLL が自動的に登録されないようにプロジェクトを構成します。
- [プロジェクト] メニューの [FtpHomeDirectoryDemo のプロパティ] をクリックします。
- [構成プロパティ] を展開し、[リンカ] をクリックします。
- [出力の登録] を選択し、ドロップダウン メニューの [いいえ] をクリックします。
- [OK] をクリックします。
- オプション: Windows の 32 ビット バージョン上でカスタム プロバイダーを開発している場合は、カスタム ビルド イベントを追加して、開発コンピューターに DLL が自動的に展開され登録されるようにすることもできます(メモ: これらのステップは Windows の 64 ビット バージョンには適用できません)。カスタム ビルド イベントを追加するには、以下のステップに従います。
[プロジェクト] メニューの [FtpHomeDirectoryDemo のプロパティ] をクリックします。
[構成プロパティ] を展開し、さらに [ビルド イベント] を展開してから、[ビルド後のイベント] をクリックします。
[コマンド ライン] テキスト ボックスの右側にある省略記号 [...] をクリックします。
[コマンド ライン] ダイアログ ボックスに、次を入力します。
net stop ftpsvc copy /y "$(TargetPath)" "%WINDIR%\System32\inetsrv" regsvr32.exe /s "%WINDIR%\System32\inetsrv\$(TargetFileName)" net start ftpsvc
[OK] をクリックして [コマンド ライン] ダイアログ ボックスを閉じます。
[OK] をクリックして [FtpHomeDirectoryDemo プロパティ ページ] ダイアログ ボックスを閉じます。
- Windows の 64 ビット バージョン用のプロバイダーを開発している場合は、64 ビット コンパイル用のビルド構成を追加する必要があります。
- [ビルド] メニューの [構成マネージャ] をクリックします。
- [アクティブ ソリューション プラットフォーム] ドロップダウン メニュー の [<新規作成>] をクリックします。
- [新しいプラットフォームを入力または選択してください] ドロップダウン メニュー の [x64] をクリックします。
- [OK] をクリックします。
- [閉じる] をクリックします。
- プロジェクトを保存します。
ステップ 2: 拡張機能インターフェイスの実装
このステップでは、デモ プロバイダー用の拡張機能インターフェイスを実装します。
IFtpHomeDirectoryProvider を実装します。
[クラス ビュー] で、[GetUserHomeDirectoryData] メソッドをダブルクリックします。
既存の実装を以下のコードで置き換えます。
// IFtpHomeDirectoryProvider メソッド public: STDMETHOD(GetUserHomeDirectoryData)( LPWSTR pszSessionId, LPWSTR pszSiteName, LPWSTR pszUserName, LPWSTR * ppszHomeDirectoryData) { // メモ: 独自のカスタム ロジックをここに追加できます。 HRESULT hr = S_OK; WCHAR wszPath[MAX_PATH] = L""; // ユーザー名に基づいてユーザーのホーム ディレクトリを決定します。 hr = StringCchPrintf(wszPath,_countof(wszPath), L"\\\\?\\C:\\ftpusers\\%s",pszUserName); // 失敗した場合にエラーを返します。 if (FAILED(hr)) { return hr; } // ユーザーのホーム ディレクトリ用にメモリー ブロックを割り当てます。 LPWSTR wszHomeDirectoryData = (LPWSTR)CoTaskMemAlloc(_countof(wszPath) * sizeof(WCHAR)); // 失敗した場合にエラーを返します。 if (wszHomeDirectoryData == NULL) { return E_OUTOFMEMORY; } // ユーザーのホーム ディレクトリをメモリー ブロックにコピーします。 hr = StringCchCopy(wszHomeDirectoryData, _countof(wszPath), wszPath); // 失敗した場合にエラーを返します。 if (FAILED(hr)) { return hr; } // ユーザーのホーム ディレクトリを返します。 (*ppszHomeDirectoryData) = wszHomeDirectoryData; return S_OK; }
FtpHomeDirDemo.h ファイルの先頭に、strsafe.h に対するインクルード ファイル参照を追加します。
#include "strsafe.h"
プロジェクトを保存してビルドします。
ステップ 3: FTP へのホーム ディレクトリ プロバイダーの追加
このステップでは、デモ プロバイダーを FTP サービスおよび既定の Web サイトに追加します。
- FTP 認証プロバイダーのグローバル リストに拡張機能プロバイダーを追加します。
- インターネット インフォメーション サービス (IIS) マネージャーを開きます。
- [接続] ウィンドウで、コンピューターの名前をクリックします。
- メイン ウィンドウで [FTP 認証] をダブルクリックします。
- [操作] ウィンドウで、[カスタム プロバイダー] をクリックします。
- [登録] をクリックします。
- プロバイダーの [名前] に「FtpHomeDirectoryDemo」と入力します。
- [ネイティブ プロバイダー (COM)] をクリックします。
- 拡張機能プロバイダーのクラス名に「FtpHomeDirectoryDemo.FtpHomeDirDemo」と入力します。
- [OK] をクリックします。
- プロバイダーの一覧の [FtpHomeDirectoryDemo] チェック ボックスをオフにします。
- [OK] をクリックします。
- サイトにカスタム プロバイダーを追加します。
この時点では、サイトにカスタム機能を追加するための UI がないので、次のコマンド ラインを使用する必要があります。
AppCmd set site "Default Web Site" /+ftpServer.customFeatures.providers.[name='FtpHomeDirectoryDemo',enabled='true']
- カスタム プロバイダーを使用するために、ユーザーの分離を構成します。
この時点では、ユーザーの分離用にカスタム機能を指定するための UI がないので、次のコマンド ラインを使用する必要があります。
AppCmd set site "Default Web Site" /ftpServer.userIsolation.mode:Custom
まとめ
このチュートリアルでは、次について学びました。
- カスタム FTP ホーム ディレクトリ プロバイダー用に Visual Studio 2008 でプロジェクトを作成する方法
- カスタム FTP ホーム ディレクトリ参照用の拡張機能インターフェイスの実装方法
- FTP サービスへのカスタム ホーム ディレクトリ プロバイダーの追加方法
ユーザーが FTP サイトに接続したときに、FTP サービスはデモ プロバイダーに指定したパスに基づいて、各ユーザーのホーム ディレクトリを設定します。