Microsoft 创建了一个新的 FTP 服务,该服务针对 Windows Server® 2008 完全重新编写。 这种新的 FTP 服务包含许多新功能,使 Web 作者能够比以前更轻松地发布内容,并为 Web 管理员提供了更多的安全性和部署选项。
新的 FTP 7.5 服务支持扩展性,让你扩展 FTP 服务随附的内置功能。 更具体地说,FTP 7.5 支持创建你自己的身份验证和授权提供程序。 你还可以创建用于自定义 FTP 日志记录和确定 FTP 用户的主目录信息的提供程序。
本演练将引导你完成使用本机代码创建简单的 FTP 主目录提供程序的步骤。
先决条件
必须准备好以下各项才能完成本文中的过程:
IIS 7.0 或更高版本必须安装在 Windows Server 2008 服务器上,并且必须安装 Internet Information Services (IIS) 管理器。
必须安装新的 FTP 7.5 服务。
你必须创建用于 FTP 发布的根文件夹。
你必须使用 Visual Studio 2008。
注意
如果你使用早期版本的 Visual Studio,则本演练中的某些步骤可能不正确。
注意
如果计划为使用 64 位版本的 Windows 的计算机开发自定义 FTP 提供程序,需要安装适用于 Visual Studio 的 64 位工具和编译器。 有关 64 位开发的更多信息,请参阅 Microsoft MSDN 网站中的安装 Visual Studio 64 位组件主题。
必须为每个用户创建一个主目录;代码示例使用
C:\Ftpusers\%*UserDomain*%\%*UserName*%
,但你可以根据需要更改它。
步骤 1:设置项目环境
在此步骤中,你将在 Visual Studio 2008 中为演示提供程序创建一个项目。
打开 Microsoft Visual Studio 2008。
依次单击“文件”菜单、“新建”、“项目”。
在“新建项目”对话框中执行以下操作:
- 选择“Visual C++”作为项目类型。
- 选择“ATL 项目”作为模板。
- 键入“FtpHomeDirectoryDemo”作为项目的名称。
- 单击“确定”。
出现“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 不会自动注册:
- 单击“项目”,然后单击“FtpHomeDirectoryDemoProperties”。
- 展开“配置属性”,然后单击“链接器”。
- 选择“注册输出”,然后从下拉菜单中选择“否”。
- 单击“确定”。
可选:如果要在 32 位版本的 Windows 上开发自定义提供程序,可以选择添加自定义生成事件以自动在开发计算机上部署和注册 DLL。
注意
这些步骤不适用于 64 位版本的 Windows。
要添加自定义生成事件,请执行以下步骤:
单击“项目”,然后单击“FtpHomeDirectoryDemo 属性”。
依次展开“配置属性”和“生成事件”,然后单击“生成后事件”。
单击“命令行”文本框右侧的省略号 (...)。
在“命令行”对话框中输入以下内容:
net stop ftpsvc copy /y "$(TargetPath)" "%WINDIR%\System32\inetsrv" regsvr32.exe /s "%WINDIR%\System32\inetsrv\$(TargetFileName)" net start ftpsvc
单击“确定”关闭“命令行”对话框。
单击“确定”以关闭“FtpHomeDirectoryDemo 属性页”对话框。
如果要为 64 位版本的 Windows 开发提供程序,需要添加生成配置以进行 64 位编译:
- 单击“生成”,然后单击“配置管理器...”。
- 在“活动解决方案平台”下拉菜单中选择“新建...”<>。
- 在“键入或选择新平台”下拉菜单中选择“x64”。
- 单击“确定”。
- 单击“关闭” 。
保存该项目。
步骤 2:实现扩展性接口
在此步骤中,你将实现演示提供程序的扩展性接口。
实现 IFtpHomeDirectoryProvider:
在“类视图”窗口中,双击“GetUserHomeDirectoryData”方法。
将现有实现替换为以下代码:
// IFtpHomeDirectoryProvider Methods public: STDMETHOD(GetUserHomeDirectoryData)( LPWSTR pszSessionId, LPWSTR pszSiteName, LPWSTR pszUserName, LPWSTR * ppszHomeDirectoryData) { // Note: You would add your own custom logic here. HRESULT hr = S_OK; WCHAR wszPath[MAX_PATH] = L""; // Calculate the user's home directory based on their user name. hr = StringCchPrintf(wszPath,_countof(wszPath), L"\\\\?\\C:\\ftpusers\\%s",pszUserName); // Return an error if a failure occurs. if (FAILED(hr)) { return hr; } // Allocate a block of memory for the user's home directory. LPWSTR wszHomeDirectoryData = (LPWSTR)CoTaskMemAlloc(_countof(wszPath) * sizeof(WCHAR)); // Return an error if a failure occurs. if (wszHomeDirectoryData == NULL) { return E_OUTOFMEMORY; } // Copy the user's home directory into the memory block. hr = StringCchCopy(wszHomeDirectoryData, _countof(wszPath), wszPath); // Return an error if a failure occurs. if (FAILED(hr)) { return hr; } // Return the user's home directory. (*ppszHomeDirectoryData) = wszHomeDirectoryData; return S_OK; }
将 strsafe.h 的 include 文件引用添加到 FtpHomeDirDemo.h 文件的开头:
#include "strsafe.h"
保存并编译项目。
步骤 3:将主目录提供程序添加到 FTP
在此步骤中,你将向 FTP 服务和默认网站添加演示提供程序。
将扩展性提供程序添加到 FTP 身份验证提供程序的全局列表中:
- 打开“Internet Information Services (IIS)管理器”。
- 在“连接”窗格中单击计算机名称。
- 双击主窗口中的“FTP 身份验证”。
- 单击“操作”窗格中的“自定义提供程序...”。
- 单击“注册”。
- 输入“FtpHomeDirectoryDemo”作为提供程序“名称”。
- 单击“本机提供程序(COM)”。
- 输入扩展性提供程序的类名 FtpHomeDirectoryDemo.FtpHomeDirDemo。
- 单击“确定”。
- 清除提供程序列表中的“FtpHomeDirectoryDemo”复选框。
- 单击“确定”。
将自定义提供程序添加到站点:
目前没有 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
总结
在此演练中,你了解了如何执行以下操作:
- 在 Visual Studio 2008 中为自定义 FTP 主目录提供程序创建项目。
- 实现用于自定义 FTP 主目录查找的扩展性接口。
- 将自定义主目录提供程序添加到 FTP 服务。
当用户连接到 FTP 站点时,FTP 服务会将每个用户的主目录设置为已在演示提供程序中指定的路径。