WAS高级管理:使用数据库域和安全元素
2007-05-20 16:22:06 来源:WEB开发网IBM® WebSphere® Application Server Community Edition 大大简化了密钥存储库、安全域和数据库池的创建,它可让您在管理控制台中执行这些高级管理任务,而无需手动输入命令。
引言
IBM WebSphere Application Server Community Edition(以下称为 Community Edition)是基于 Apache Geronimo 的开源 Java™ Platform, Enterprise Edition (Java EE) 应用服务器。Community Edition 的资源占用量非常小,并且可以免费使用。
Community Edition 的基于 JSR-168 的管理控制台本质上是 Community Edition 中部署的一个 Web 应用程序,它为管理本地或远程服务器的许多方面提供了基于 Web 的用户友好的界面。如果您是第一次使用 Community Edition 和管理控制台,则文章 使用 WebSphere Application Server Community Edition 中的 Web 控制台 是一篇很好的入门文章,其中介绍了可以在控制台中执行的许多常见的管理任务。
使用 DB2 Express-C 数据库
文章 使用 WebSphere Application Server Community Edition 中的 Web 控制台 阐述了如何使用嵌入在 Community Edition 中的 IBM Cloudscape™ 数据库,以及如何创建数据库池。这里我们将介绍如何使用数据库池以及为 DB2 Express-C 创建数据库池。
DB2 Express-C 是一种先进的混合型数据服务器,可以支持关系数据库和纯 XML 存储。DB2 Express-C 是一种免费的数据服务器,用于开发和部署使用 XML、C/C++、Java、.NET®、PHP 等创建的应用程序。它可以运行多达两个双核 CPU 服务器、多达 4 GB 的内存、任何存储系统设置,而且无任何数据库大小限制和其他人为限制。
DB2 Express-C 和 Cloudscape 都是用于生产和开发的高价值数据服务器,而且免费提供。Cloudscape 非常适合于需要完全不可见的嵌入式 Java 应用程序数据服务器的应用程序。在应用程序需要具有高级功能(如增强的可扩展性、可管理性和 SQL 支持)的高性能和高可扩展数据服务器时,可以使用 DB2 Express-C。DB2 Express-C 非常适合于所有那些使用 PHP、.NET、C/C++、Java 和其他非 Java 编程语言创建的数据服务器应用程序。
您可以使用基于命令的用户界面工具(称为 DB2 Express-C 命令编辑器,请参见图 1)方便地与 DB2 Express-C 数据库进行交互,该工具包括两个窗格:
用于输入命令的命令窗格。
用于查看命令执行结果的结果窗格。
要打开 DB2 Express-C 命令编辑器,请导航到 Select Programs => IBM DB2 => Command Line tools => Command Editor。
图 1. DB2 Express-C 命令编辑器
创建数据库和表
下面是一个简短的练习,可帮助您获得一些 DB2 Express-C 实际操作体验。在本练习中,您将使用命令编辑器为 DB2 Express-C 创建一个数据库和表。然后,您将了解如何从管理控制台为下面要创建的示例数据库创建数据库池:
要创建一个名为“student”的新数据库,请在命令窗格中输入此命令,并单击 Execute(绿色箭头)按钮:
Create db student
在成功创建之后,结果窗格中将显示以下消息:
The CREATE DATABASE command completed successfully
要创建到数据库的 JDBC 连接,以便我们可以使用它,请执行以下命令:
Connect to student
要创建一个名为“student”的表,请在命令窗格中输入此命令,并单击 Execute 按钮:
Create table student(rollno VARCHAR(30), name VARCHAR(50), dob VARCHAR(40))
如果看到以下错误消息:
SQL1032N No start database manager command was issued
则表示没有启动您的数据库管理器。请在命令编辑器中执行以下命令启动数据库管理器:
db2start
创建 DB2 Express-C 数据库池
数据库池是一个数据结构,它包含 JDBC 驱动程序为连接特定数据库所需的信息。Community Edition 提供数据库连接池,您可以通过连接池将特定数据库绑定到 JNDI,并可以从应用程序访问它。
文章 U使用 WebSphere Application Server Community Edition 中的 Web 控制台 详细介绍了如何为嵌入到 Community Edition 中的 Cloudscape 数据库创建数据库池。这里,您可以为 DB2 Express-C 创建数据库池。对于任何其他 databases that are supported by Community Edition,您可以使用相同的方法。
要为 DB2 Express-C 数据库创建数据库池:
从 Console Navigation 窗格中,选择 Services category 下面的 Database Pools。数据库池 Portlet 将出现(图 2)。
图 2. 数据库池 Portlet
选择 Using the Geronimo database pool wizard。
在数据库池创建向导(图 3)中,输入或选择以下值:
Pool Name: studentpool
Pool Type:选择 DB2 XA 以使用 DB2 Express C 中可用的数据库
Driver JAR:选择 com.ibm.db2/db2jcc/8.2/jar 和 com.ibm.db2/db2jcc_license_cu/8.2/jar
Database Name:student(这是我们以前创建的数据库)
User and Password:输入任何有效值
Port Number:50000 是 DB2 Express-C 的缺省值。如果在安装过程中更改了该值,请指定实际的端口号。
将其余字段保留为原样。
单击 Deploy 以便将该池部署到服务器。
单击 Show Plan 可以看到池的部署计划(将在下面介绍)。
图 3. 数据库池创建
数据库池部署计划
Community Edition 使用特定于 Geronimo 的部署描述符,以下称为 Geronimo 部署计划。此 Geronimo 部署计划格式类似于 Java EE 1.4 中的 Java EE 部署描述符,但不同的是前者特定于应用服务器。它是基于 XML 框架的 XML 文件,该文件具有与应用程序模块或服务相关的配置信息。
作为在控制台中使用数据库池创建 Portlet 的替代方法,您还可以通过部署相应的部署计划为任何数据库创建新数据库池,这将是一个 .xml 文件。不过,您需要手动使用正确的 XML 框架创建计划,该框架在 <WASCE_HOME>schema 目录中指定。此步骤可以方便地在控制台中执行,只需在一些字段中选择一些值即可,请参见上文。
清单 1 显示了在前一部分中创建的数据库池的部署计划。这是在选择 Show Plan 时显示的计划(图 3)。
清单 1. 数据库池部署计划
|
您将看到所有与 DB2 Express-C 数据库相关的配置信息(如数据库名称、连接信息、JDBC 驱动程序依赖项等)都已在上面的计划中指定。这适用于任何数据库,无论是用于 DB2 Express-C、Cloudscape 的数据库,还是任何其他受支持的数据库。您只需指定 JDBC 驱动程序依赖项和相应的连接信息。
使应用程序访问数据库池
根据规范,应用程序模块使用数据库连接池需要两个步骤:
模块的部署信息必须声明一个资源引用,并将其映射到可用于该模块的特定连接池。
该模块的代码必须通过 JNDI 查找连接池。
在部署描述符中指定数据库池
您需要在两个文件中为数据库池指定资源参考。一个是 Java EE 1.4 规范中的标准部署描述符文件,另一个是特定于 Geronimo 的部署计划。表 1 显示了与应用程序存档类型相对应的实际文件。
表 1. 部署描述符文件
部署的存档文件 | Java EE 1.4 规范中的标准部署描述符文件 | 特定于 Geronimo 的部署计划 |
Web 应用程序存档 (WAR) 文件 | web.xml | geronimo-web.xml |
包含 EJB 的 JAR | ejb-jar.xml | openejb-jar.xml |
企业应用程序 (EAR) 文件 | application.xml | geronimo-application.xml |
Java EE 连接器资源存档 (RAR) | ra.xml | geronimo-ra.xml |
Java EE 客户机应用程序存档 (JAR) | application-client.xml | geronimo-application-client.xml |
例如,让我们了解一下如何在 Web 应用程序的部署计划中指定资源参考。
在 WEB-INF/web.xml 中
在部署数据库池之后,应用程序模块可以使用在配置过程中指定的名称来引用它。为此,您应在其标准 Java EE 部署描述符 (web.xml) 中声明一个类型为 javax.sql.DataSource 的 resource-ref。清单 2 显示了如何在 web.xml 文件中指定资源引用。
清单 2. web.xml
|
在 WEB-INF/geronimo-web.xml 中
在该模块的 Geronimo 部署计划中,您需要指定将使用服务器中的哪个连接池来满足 Web 模块所需的数据源。为此,您需要将数据库池的名称指定为 ref-name,该名称应映射到 web.xml 中的 resource-ref。清单 3 显示了如何在 geronimo-web.xml 文件中指定资源引用。
清单 3. geronimo-web.xml
|
在部署应用程序时,它将查找 Geronimo 部署计划。如果您尝试部署没有部署计划的 Java EE 应用程序模块,服务器将尽力使用缺省值执行操作。
此 Geronimo 部署计划可以作为单独文件保存,也可以打包在应用程序中。如果没有打包在应用程序中,那么您可以在应用程序部署过程中在 Plan 字段中指定计划文件。如果部署计划是存档的一部分,则它丢失的机会将会小得多。不过,将计划保存为一个单独的文件可为您提供更大的灵活性,因为您无需每次在对部署计划进行更改时都打包该文件。
在应用程序模块中
清单 4 显示了在应用程序模块中查找创建的数据库连接池所需的代码。
清单 4. 应用程序代码
|
JNDI 查找字符串是 java:comp/env/ 加上在 web.xml 中使用的 res-ref-name(清单 2)。而且,还需记住,资源引用名称 jdbc/MyDataSource 在 web.xml、geronimo-web.xml 和应用程序代码中应该相同。
Community Edition 不支持在其中列出所有资源的“全局 JNDI 空间”。应用程序访问数据库池的唯一便捷方法是使用资源引用,并通过组件的本地 java:comp/env/ 命名空间访问池(如上文所述)。
创建安全域
安全域是保护 Web 应用程序资源的机制。它向您提供使用定义的安全约束保护资源的能力,然后定义可以访问受保护资源的用户角色。Community Edition 提供各种类型的安全域,可以根据其身份验证机制的后端情况对它们进行分类。Community Edition 支持的安全域类型包括:
属性文件域:存储在磁盘上属性文件中的凭据。
数据库 (SQL) 域:存储在数据库表中的凭据。
LDAP 域:存储在 LDAP 服务中的凭据。
证书属性文件域:使用磁盘上的数字证书和属性文件。
自定义域:基于用户实现的登录模块和用户定义的主体。
属性文件域
让我们看一个使用管理控制台创建属性文件域的示例,并了解它是如何工作的。可以用类似的方式创建其他类型的域。我们这里之所以选择此域,是因为在所有类型的安全域中它是最简单的,不需要设置任何先决条件,并且文本编辑器足以创建包含用户和组信息的属性文本文件。
要从管理控制台创建属性文件域,请执行以下操作:
在 <wasce_home>varsecurity 目录下(其中 <wasce_home> 是 Community Edition 的安装目录),创建名为 user1.properties 的文本文件。
在此新文件中,按逐行方式为您希望向其提供应用程序访问的用户指定用户名和相应的密码,如清单 6 所示。此文件的每一行表示 <username>=<password>。保存此文件。
清单 6. user1.properties
|
在 <wasce_home>varsecurity 目录下(其中 <wasce_home> 是 Community Edition 的安装目录),创建名为 group1.properties 的文本文件。在此新文件中,按逐行方式指定组名称和属于每个组的用户,如清单 7 所示。此文件的每一行表示 <group name>=<username1>、<username2> ...... 确保 <username1>、<username2> 等包括在 user1.properties 文件中。在清单 7 的示例中,Anitha 和 Sridhar 属于 group1;Manu 和 Vamsi 属于 group2。保存该文件。
清单 7. group1.properties
|
在管理控制台的 Console Navigation 窗格中,通过单击安全类别下的 Security Realms 链接,启动安全域 Portlet。图 4 显示了安全域 Portlet,它显示所有可用的安全域。
图 4. 安全域 Portlet
在缺省情况下,Community Edition 通过属性文件使用名为 geronimo-properties-realm(图 4)的安全域对用户进行身份验证。相应的文件是位于 <wasce_home>varsecurity 目录下的 users.properties 和 group.properties。
选择 Add new security realm 启动 Create Security Realm 向导。
在步骤 1 面板(图 5)上,输入或选择以下值:
Name of Security Realm:任何有效值。
Realm Type:Properties of File Realm。
单击 Next。
图 5. 创建安全域,步骤 1
在步骤 2 面板(图 6)上,输入以下值:
Users File URI:var/security/users1.properties(在本例中)
Groups File URI:var/security/group1.properties(在本例中)
单击 Next。
图 6. 创建安全域,步骤 2
(在 URI 字段中,只使用正斜杠,并且 URI 不能以斜杠开头。指定与 Community Edition 的主目录相关的位置。)
在步骤 3 面板(图 7)上,根据情况全部选中三个选项或者选中某一个(Enable Auditing、Enable Lockout 和 Store Password)。
单击 Test a Login 按钮,以测试凭据的工作状态是否良好。
要查看域的部署计划,请选择 Skip Test and Show Plan。
要部署域,请选择 Skip Test and Deploy。
图 7. 创建安全域,步骤 3
成功创建和部署域之后,域的名称将列在安全域 Portlet(图 4)中。您可以在部署描述符中,通过使用 Portlet 提供的 edit 和 usage 链接来编辑或查看此域的用法。
该域现在可供使用了。通过使用这些域,您可以防止未授权用户访问您的应用程序。
密钥存储库
密钥存储库用于存储加密密钥和证书。您需要使用密钥存储库将 Community Edition 配置为支持 HTTPS 访问 Web 应用程序。也就是说,要定义 Tomcat HTTPS 连接器,您必须指定包含证书(用于加密使用 SSL(安全套接字层)协议交换的数据)和密码的密钥存储库文件的名称。
密钥存储库中的证书具有以下两个重要功能:
它包含用于加密在 SSL 连接上交换的数据的公钥和私钥。当数据流经网络时,加密可以防止数据被查看或修改。服务器的证书自动发送到期望使用 SSL 连接的每个客户机。
它包含一组凭据,这些凭据标识服务器和与该服务器关联的公司。这些凭据是否可信取决于客户机是否信任对证书进行数字签名的证书颁发机构。
在 Community Edition 中,Keystore Configuration 工具(图 8)可供在控制台上使用。您可以使用此工具创建、编辑和删除密钥存储库及其内容。要启动该工具,请转到 Console Navigation 窗格,并单击安全类别下的 Keystores 链接。
图 8. Keystore Configuration 工具
Keystore Configuration 工具可显示密钥存储库文件、密钥存储库内容以及 Editable 和 Available 标志的状态;即锁定密钥,还是取消锁定密钥。
带有证书的 Community Edition 中的缺省密钥存储库是“geronimo-default”。您可以使用它测试 SSL 连接。此密钥存储库的密码是“secret”,相应的密钥存储库文件位于 <wasce_home>/var/security/keystore 目录下。
密钥存储库开始时是锁定的,不能编辑。Editable 标志指示是否取消锁定密钥存储库,可以进行编辑(通过输入密钥存储库密码);此状态在当前登录会话期间持续不变。Available 标志指示是否保存了密码,使密钥存储库用于服务器中的其他组件。
要取消锁定 Editable 密钥存储库,请执行以下操作:
在 Editable 栏中,单击 lock 图标(图 8)。
在 Portlet 中的 Enter keystore password 字段中指定密码(图 9)。
单击 Unlock Keystore 按钮。
图 9. 取消锁定密钥存储库
仅在 Editable 锁定打开时,才能够查看和编辑密钥存储库的内容,它由可用的密钥和证书组成(图 10)。在打开时,您可以创建、修改和删除私钥和受信任证书项。
图 10. 显示取消锁定的密钥存储库
按照相同的方法可取消锁定 Available。取消锁定后,将能够生成 CSR(证书签名应答),或导入 CA(证书颁发机构)应答。稍后将详细介绍这些元素。
创建密钥存储库
正如上面提到的,要将Community Edition 配置为支持 HTTPS 访问 Web 应用程序,您需要使用带有证书的密钥存储库。您可以使用现有密钥存储库,或创建新的密钥存储库。
要创建新的密钥存储库,请执行以下操作:
在 Keystore Configuration 工具(图 8)中,单击 New Keystore。
在 Keystore file name 和 Password for new keystore 字段中输入值(图 11)。
单击 Create Keystore 按钮。
图 11. 创建密钥存储库
成功创建密钥存储库后,密钥存储库将显示在 Keystore Configuration 工具中(图 8),相应的密钥存储文件将存储在 <wasce_home>varsecuritykeystores 文件夹中。
生成密钥
要在 Community Edition 中定义 HTTPS 连接器,您需要带有证书的密钥存储库。创建私钥后,它将创建密钥对和自签署证书。您可以使用此证书将 Community Edition 配置为支持 HTTPS 访问 Web 应用程序。
要创建新的密钥,请执行以下操作:
单击 Keystore configuration Portlet(图 8)中的密钥存储文件名。Keystore contents Portlet(图 12)显示了特定密钥存储库中提供的密钥和证书。
图 12. 密钥存储库内容
选择 Create Private Key 链接。
指定密钥所需的值(如图 13 所示,下面对这些值进行了描述),然后单击 Review Key 按钮。
图 13. 配置密钥数据
Alias for new key:在密钥存储库中,用于标识此密钥对的唯一名称。
Key Algorithm:用于生成密钥对的私钥算法。管理控制台仅支持 RSA。
Key Size:RSA 密钥对模块的长度,以位为单位。密钥越长,密钥对越安全。管理控制台支持的密钥长度为 512、1024 和 2048。在我们的示例中,使用的密钥长度为 2048。
Algorithm:用于签名自签名证书的签名算法,作为密钥对 (LINK) 练习的一部分生成。管理控制台支持 MD2withRSA、MD5withRSA 和 SHA1withRSA 签名算法。在我们的示例中,我们使用 MD5withRSA。
Valid for (#days):指示密钥对的有效期,用天数表示。在我们的示例中,我们使用的有效期为 180 天,约 6 个月。
Server Hostname (CN):承载 Web 应用程序的 Web 服务器的主机名,它要对 Web 客户机的服务器进行身份验证。例如,如果应用程序要驻留在 www.mywebsite.com 上,则使用与之相同的名称作为公用名,这样客户机可以使用 http://www.mywebsite.com 或 https://www.mywebsite.com 来访问该应用程序。在我们的示例中,我们使用 localhost 作为公用名。
Company/Organizational (O)、Division/Bussiness Unit (OU)、City/Locality (L) 和 State/Province (ST):完成这些字段来反映请求者的身份。
Country (C):请求者所在国家的双字母 ISO 3166 国家代码。在我们的示例中,我们使用的是 IN,它是印度的国家代码。
当您单击 Review Key Data 按钮时,将显示您输入的密钥信息(图 14)。
图 14. 生成密钥
在验证值正确无误后,请单击 Generate Key 按钮生成密钥。
单击 Generate Key 按钮后,会立即生成新的私钥,并显示在 Keystore contents portlet 中(图 12)。单击生成的密钥,将显示与其一起创建的自签名证书信息(图 15)。
获取证书颁发机构 (CA) 签名的证书
成功生成私钥后,您可以使用与其一起生成的自签名证书,将 Community Edition 配置为支持 HTTPS 访问 Web 应用程序。在生产环境中,最好使用由知名证书颁发机构 (CA)(如 VeriSign)签名的证书。将此 CA 指定为受信任证书颁发机构的客户机随时接受 CA 颁发的任何证书。
在 Community Edition 中,要获得签名的证书,您需要使用 Keystore Configuration 工具生成 CSR,并将其发送到内部或外部 CA。CA 将验证该请求,并颁发证书进行应答。从 CA 收到应答后,您可以将该证书导入到密钥存储库。为此,请转到 Keystore Configuration 工具的 Keystore Contents portlet(图 12),并单击生成的私钥。将显示密钥的内容(图 15)。
图 15. 生成 CSR 并导入 CA 应答
在 Keystore Configuration portlet 上,单击 Generate CSR,将使用定义 CSR 的二进制格式的 PKCS10 标准生成证书请求。将文本区域复制到文件,并将其保存为文件(如,保存为 csr.txt)。
图 16. 生成的 CSR
接下来,您需要使用上面生成的 CSR 请求 CA 颁发证书。要请求证书,请转到 CA 的网站,并定购证书。您需要提供在步骤 1 中获取的 CSR(即 csr.txt 的内容),如 CA 所请求的。然后,您应从 CA 接收证书。将其保存在文件(如 ca_reply.txt)中,并确保该文件中包括“BEGIN CERTIFICATE”和“END CERTIFICATE”行,例如:
-----BEGIN CERTIFICATE----- |
(上面的示例省略了实际证书数据。)
在本示例中,我们使用了一个内部 CA 来获取应答,并将其粘贴到下面,以便向您展示一个完整的证书。(参见图 17)。
图 17. CA 应答证书
CA 为 CSR(通常为 PKCS7 编码的证书应答)签名证书后,需要将其导入到密钥存储库,这样,如果任何客户机使用 CA 签名的证书请求 Web 服务器,Web 服务器都能够成功执行 SSL 握手。要导入密钥存储库,请执行以下操作:
在 Keystore configuration 面板上单击 Import CA reply(图 15)。
将复制的 CA 应答粘贴到文本区域(图 18)。
单击 Save。
图 18. 导入 CA 应答证书
支持 HTTPS 访问 Web 应用程序的配置
要配置 Community Edition,以便它支持 HTTPS 访问 Web 应用程序,您需要使用客户机身份验证选项创建 HTTPS 侦听器。要完成此任务,请执行以下步骤:
从控制台右侧的 Console Navigation Pane,选择 Server 类别下的 Web Server。
选择 Add new HTTPS Listener for Tomcat(图 19)。
图 19. Network Listeners portlet
指定字段值(在图的下方对它们进行了描述),并单击 Save 按钮(图 20)。
图 20. Add new HTTPS listener for Tomcat portlet 片段
Unique Name:与服务器上任何其他 Web 连接器名称不同的名称。
Host:端口绑定到的主机名称或 IP 地址。在我们的示例中为 0.0.0.0。
Port:要绑定的网络端口。在我们的示例中,我们使用 8444,它是 HTTPS 的缺省端口。
Keystore File:保存密钥存储库的文件。您可以将其指定为 var/security/keystore/SampleKeyStore,它是您前面生成的密钥存储库 SampleKeyStore 的位置。
Keystore Password:用于访问密钥存储库文件和私钥项的密码。
Keystore Type:Keystore File 字段项的密钥存储库类型缺省类型为 JKS。
Truststore File:保存信任存储区的文件。在我们的示例中,将受信任证书添加到 var/security/keystore,其本身将充当信任存储区。因此,在此字段中我们使用 var/security/keystore/SampleKeyStore。
Truststore Password:用于验证 Truststore File 字段的密码,在我们的示例中,它是 var/security/keystore 的密码(即 secret)
Truststore Type:Truststore File 字段项的密钥存储库类型。缺省类型为 JKS。
HTTPS Algorithm:HTTPS Algorithm 提供程序。通常应将其设置为与 JVM 供应商匹配。在此字段中使用 JVM Default,这样当服务器运行在与所选值不同的 JVM 上时,不需要重新配置 HTTPS 侦听器。
Client Auth Required:如果设置此字段,那么通过此连接器连接的客户机必须提供有效的客户机证书。
在单击 Save 按钮时,将创建新的用于 Tomcat 的 HTTPS 侦听器,并开始使用上面提到的配置。新的侦听器也显示在 Network listeners portlet 中(图 17)。
结束语
本系列包括两个部分,第 1 部分介绍了高级控制台功能,它使管理员能够:
为任何数据库创建数据库基本池。
创建安全域,以防止未经授权的用户访问应用程序。
生成密钥存储库和证书,将 Community Edition 配置为支持 HTTP 访问 Web 应用程序。
此外,本文还向您介绍了 DB2 Express-C 数据库的入门知识,并开始对其使用了命令编辑器。
第 2 部分将提供关于其他高级控制台功能的信息,其中包括线程池统计、Geronimo 插件和重新部署应用程序等。这些高级功能可以帮助您提高应用程序的可用性和可伸缩性。您还可以将应用程序或服务的完整配置导入或导出为服务器的插件。
- ››管理/var/spool/clientmqueue/下的大文件
- ››高级SEO的涵义意味着是什么
- ››管理私有云,第 2 部分: 使用 WebSphere CloudBur...
- ››高级 DBA 和开发者篇,第 3 章:DB2 高可用性灾难...
- ››高级 DBA 和开发者篇,第 1 章:DB2 基础
- ››高级 DBA 和开发者篇,第 2 章:数据库集群技术
- ››高级 jQuery:让好的应用程序变成强大的应用程序
- ››管理 Eclipse 环境:Eclipse 维护的神秘艺术
- ››管理私有云:WebSphere CloudBurst Appliance 命令...
- ››管理启动项 - Windows 7中的BCDEDIT命令
- ››高级性能调优概念
- ››管理Exchange 2003注意事项
更多精彩
赞助商链接