一、 引言
我是Microsoft® Windows® 9x操作系统家族的最忠实的爱好者,但我从来没有发现Windows NT系统用起来同样的舒适和轻松。我经常安装最新版本的Windows NT系统,但一直到现在为止,我只是用Windows NT来测试我的软件。
不过目前情况发生了变化,我已经开始使用Windows 2000的Beta版本,它包含了如此多的新特性,以至于几乎所有的使用者(如系统管理员、系统工程师、程序开发员、管理人员以及老的用户)都可以找到很好的理由来使用它。Windows 2000不仅增强了Web浏览器软件(IE 5.0),同时也增强了Web服务(IIS 5.0——本杂志的另一篇文章系统地介绍了IIS5.0的各种新特性)。本文从不同用户的角度来讨论Windows 2000中这些新的特性。在阅读过程中,请记住,本文以Windows 2000的Beta 2版为基础,真正的特性应该以Windows 2000的正式发行版本为准。
作为一个系统管理员,这就意味着我们必须管理用户的权限和各种许可、定义和使用各种策略、在用户之中分发各种资源,同时还必须配置系统目录。这些工作往往是重复性的,比较枯燥。Windows 2000一个重要的改进是减少这样的苦差事:活动目录服务(Active Directory Services,简称 ADS)、组策略(group policy)、磁盘配额、系统级的脚本功能,以及一个全新的任务调度器。
ADS可以使我们方便地共享和使用网络上的各种对象。这里“目录”是指一个可共享的信息源,人们往往会访问这样的信息源,比如打印机、传真机、数据库、文件夹,甚至是应用程序。系统管理员的任务之一是管理如何访问这些对象。目录服务是一个模块,它使得客户能够使用这些目录。如果一个目录服务满足Windows 2000活动目录规范,那么它就是一个ADS。
ADS对分布在网络上的共享对象的物理位置和物理结构进行了抽象。其抽象方式与虚拟内存管理器类似,虚拟内存管理器是一个标准的Windows组件,它使应用程序可以访问4GB内存空间,即使机器上只有32MB物理RAM也没关系。各种ADS组件使我们可以把打印机、传真机等看作网络上的逻辑组中的对象。例如,一个ADS使我们可以把分布在不同房间中的打印机当作在同一个节点上。
这种抽象方式为系统管理员带来了很大的好处。首先也是最重要的一点是,ADS使系统管理员可以为一组资源设置权限和各种标记,允许他控制对指定资源的访问,加强了安全性。利用ADS,我们还可以实现一个搜索引擎以便帮助用户更加容易地找到各种对象。我们甚至根本不需要指定打印机的各种技术参数(比如打印机名字或者服务器名字)就可以找到相应的打印机。另一个好处是复制,由于ADS提供了硬件的逻辑视图,所以即使当目录服务器暂时处于停机维护状态的情况下,应用程序也可以继续工作。
在Windows NT下,每一个用户组都有其自己的设置和桌面配置信息。通过使用组策略,我们可以管理注册表设置、使用启动时刻或者关机时刻的脚本代码、可以决定哪些应用可以使用,哪些应用应该出现在桌面上。Windows 2000提供了一个集成工具,可使我们很轻松地完成这些任务。这个工具就是组策略编辑器(Group Policy Editor),它也是一个MMC(Microsoft Management Console)加载项模块。图一给出了组策略编辑器以及其他一些系统工具的例示。
图一 组策略编辑器
磁盘配额是减轻系统管理员工作的另一个很“酷”的特性。其想法非常简单,我们可以为每个用户指定最大可用的磁盘空间,而且当他或者她所用的空间超过了中间警告线之后可以通知管理员。
图二给出了定义磁盘配额的属性页对话框,对于用户来说一切都是透明的,他所看到的只是他自己的剩余磁盘空间的值。即使磁盘有10GB空间,我们也可以让每个用户看到或者使用的空间不超过1GB。这有点类似于ISP给个人Web主页分配空间的做法。用户可以购买一定数量的空间,但不能超过它。不同的是,Windows 2000的磁盘配额功能是完全免费的。
图二 定义磁盘配额
磁盘配额是文件系统的功能,它以文件的逻辑尺寸为基础。换句话说,系统把用户已经创建的所有文件的大小全部加起来,以便确定他是否超过了限额。它不管文件是否被压缩了(占用更少的物理空间)。注意,只有NTFS磁盘卷才支持磁盘配额特性。
系统管理员通常要执行批操作或者对重复性的任务使用定时运行功能。但是老式的MS-DOS bat文件功能不够强大,它不能够驱动现代图形操作系统上的操作。Windows脚本宿主系统(WSH)更适合于这样的用途。然而,它并不是Windows 2000所支持的唯一的脚本特性。Windows 2000支持另一个脚本特性ScriptIt,ScriptIt不是一个传统的脚本语言,它也没有提供传统语言的许多特征,但它可以启动一个进程,可以向一个活动的窗口发送一组键盘消息。
图三给出了新的任务调度器向导的界面,它看上去与Windows 98的调度器界面非常类似,功能上并没有创新之处,但是用户界面(UI)是一个显著的改进。
图三 新的任务调度器向导
Windows 2000并没有为系统管理员引入新的任务,也没有消除老的任务,它只是为系统管理员提供了一些新的、功能更强大的工具。
系统工程师通常要涉及到一些设计细节,这些细节可能会受到文件系统、设备驱动以及网络等影响。Windows 2000首选使用新的NTFS文件系统,与老的NTFS系统相比,它有了很大的变化,下文我将会讲到这些变化,但是更深入的研究请参照本期杂志的另一篇关于NTFS的文章。
当我们设计与系统特性关系密切的应用时,NTFS就非常有价值。利用NTFS卷(Windows 95和Windows 98不支持NTFS分区),我们可以充分利用硬链接、流以及自动加密文件等特性。
当我们使用NTFS的加密文件系统(Encrypted File System,简称EFS)时,Windows 2000使用CryptoAPI来保护数据。我们可以对单个文件或者整个文件夹设置加密标记,如图四所示。这个加密过程完全在后台进行,并且只引入很小的负荷。它并不能防止其他的未授权的用户看到这些文件,但他们无法理解这些文件,因为系统不会为他们解密这些文件。图五给出了当其他用户试图打开这些文件时得到的警告信息。
图四 设置加密标记
图五 警告消息对话框
我曾经在1997年的MIND(Microsoft Internet Developer)杂志上发表了文章“Supporting CryptoAPI in Real-World Applications”,深入探讨了在MFC应用中,如何使用CryptoAPI加密或解密文档文件。简单来说,您只需要把您的文档类从CcryptoDoc派生而不是从CDocument派生,并且在调用标准的Open和Save文档方法时让框架解密或者加密即可。这个过程类似于NTFS为我们所做的工作。
如果有人让我们选择一种有效的方法来保存由某个程序管理的数据,那么我们应该考虑使用OLE复合文件。简单来讲,OLE复合文件是一个结构化的文件,其内容按照流(stream)和存储(storage)组织起来。OLE复合文档的典型例子是Microsoft Word或者Excel文档。文档中的内容被分成文件夹和子文件夹,这些文件夹或子文件夹就被称为存储。每个存储中所包含的连续数据被称为流。
NTFS文件系统的一些特性可能会影响我们设计文档或应用存储结构的思路。在NTFS文件系统中,每个文件可以被看作许多流的一个集合。通常我们所认为的文件只是主要的内容,实际上是一个没有命名的流,我们也可以在单个文件中保存多个子文件,而且我们仍然可以按照原先的格式来得到这些子文件。例如,我在工作中要建立一个图像数据储存库,其元素为多分辨率的图像,由四个不同尺寸的图像组成:缩略图、500、1000、2000DPI。我自己写了一个API来处理这样的文件格式,基于Windows 2000和NTFS流式软件就非常有助于这样的系统。
Windows 95引入了快捷方式的概念。快捷方式在应用层上起作用,它实际上映射了一个文件对象。我们可以在不同的目录下甚至在不同的驱动器上存放同一个快捷方式,这些快捷方式映射到同一个物理文件上。现在您可以想象一下文件系统层次上的快捷方式应该如何实现。
在Windows 2000中,这样的快捷方式(文件系统层次上的快捷方式)被称为硬链接。硬链接不同于系统外壳中的快捷方式。系统外壳中的快捷方式是指向其他文件的文件,而硬链接是同一文件或者目录的多个目录入口。通过创建一个硬链接,我们可以请系统创建一个指向文件的虚快捷方式。注意硬链接必须在同一个NTFS卷上。当然,虚快捷方式是指一个小的数据结构,它链接到一个包含多个位置的物理文件。比如,我们可以创建一个硬链接指向一个共享DLL,我们可以使所有需要该DLL的应用都能看到它,而不必拷贝到Windows目录下。对于复合文件和流来说,我们也可以使用注册表中HKLM节点下的AppPaths键,但这种方案位于应用层,而硬链接是一个系统特性。
下面的代码显示了最简单的ATL COM对象,它暴露了一个创建硬链接的方法
// NTHardLink.cpp : Implementation of CHardLink
#include "stdafx.h"
#include "HardLink.h"
#include "NTHardLink.h"
/////////////////////////////////////////////////////////////////////////////
// CHardLink
STDMETHODIMP CHardLink::CreateNewHardLink(BSTR bstrFileName,
BSTR bstrExistingFileName)
{
USES_CONVERSION;
if (bstrFileName==NULL || bstrExistingFileName==NULL)
return E_INVALIDARG;
// Convert from BSTR to ANSI strings
TCHAR pszFileName[MAX_PATH], pszExistingFileName[MAX_PATH];
lstrcpy(pszFileName, OLE2T(bstrFileName));
lstrcpy(pszExistingFileName, OLE2T(bstrExistingFileName));
// Try to create the hard link to the specified file
BOOL b;
b = CreateHardLink(pszFileName, pszExistingFileName, NULL);
if (b)
return S_OK;
return E_FAIL;
}
下面给出了一段使用此对象的WSH脚本代码。
/////////////////////////////////////////////////////////////
// WSH JScript file
//
// Create hard links for the specified files
// Requires Windows 2000
// Usage: TESTHL new_file existing_file
//
// Two arguments needed
if (WScript.Arguments.Length != 2)
WScript.Quit();
// Literals
var L_NO_HL_CREATED = "Unable to create hard link.";
// Create the object
var oHL = WScript.CreateObject( "HardLink.Object.1" );
// Get the arguments from the command line
var sNewFile = WScript.Arguments.Item(0)
var sExistingFile = WScript.Arguments.Item(1)
// Try to create the hardlink
bResult = oHL.CreateNewHardLink(sNewFile, sExistingFile);
if (bResult == 0)
WScript.Echo(L_NO_HL_CREATED)
WScript.Quit();
请注意前面提到的Windows 2000的这些特性是如何协同工作的。硬链接只能用于Windows 2000,所以在前面的代码中我们必须显式地指明目标平台,以便链接到正确的库文件,做法很简单,只要在源代码中加入下面一行:
#define _WIN32_WINNT 0x0500
ATL把类似的编译指示符放到了stdafx.h中,我们只需插入正确的版本号即可。一旦创建完成之后,硬链接就可以当作一个独立的目录入口项来使用了,而且它指向同样的文件。我们可以重命名硬链接,或者删除硬链接,而不会影响其他的文件或者链接。
Windows 2000中另一个重要的改进是即插即用技术,它在以前Windows 95中实现的即插即用的基础上作了重要的改进。通常,即插即用是BIOS、硬件、设备驱动和操作系统之间相互协作的结果,而在Windows 2000中,它引入了一个新的规范,被称为ACPI(高级配置和电源接口,即Advanced Configuration and Power Interface)。ACPI定义了系统主板和BIOS必须提供的接口,以便与操作系统协同完成即插即用。ACPI用一种与实际CPU无关的、更抽象的接口代替了Windows 95的APM(Advanced Power Management)。Windows 2000仍然支持APM和APM之前的硬件。
统一的Win32®驱动器模型(简称WDM)描述了驱动器的二进制结构,包括对即插即用和电源管理的支持,操作系统可以配置这些特性。当然,Windows 2000并不只是支持这种类型的驱动程序,它仍然可以接受现有的内核模式的驱动程序,但是这样的驱动程序不提供即插即用和电源管理功能。WDM驱动程序既可以在Windows 2000下使用,也可以在Windows 98下使用。
对于程序开发员来说,Windows 2000的革命性程度不如Windows 95来的大,但是Windows 2000仍然有许多的变化,包括新的API、全新的或者说完全修订过的SDK,以及一项新的基础技术:COM+。
当然,这些变化应该由一篇专门的文章(或者书)来介绍,我只是指出一些最重要的方面。我将忽略所有在Windows 9x或者在Windows NT 4.0已经可以使用的技术增强,关于这方面的细节和使用例子可以在我写的专著(Professional Visual C++ Windows Shell Programming,1998)中得到。
Windows中有些新的SDK、产品和技术如下表一、表二、表三所列。这些表中的内容不是全部的细节,但它可以给读者一个大概的参考,表三包括一些新的API函数。
表一
SDK |
说明 |
传真服务 |
提供开发传真客户应用的支持 |
IP辅助函数 |
获取或者修改TCP/IP协议设置 |
加密服务 |
提供实现认证、编码和加密的服务 |
协作数据对象(CDO) |
使应用程序能够接收或者发送电子邮件的COM对象 |
VLM |
使应用程序可以访问大量缓存的数据 |
TAPI 3.0 |
新的基于COM的电话API |
Socket |
访问标准网络服务(包括传输协议)的API |
DirectX 6.0 |
增强的API,改进了DirectDraw和Direct3D |
智能卡 |
智能卡阅读器的标准接口 |
Windows安装器( Installer) |
允许即时(just-in-time)安装,只要需要某个组件,它就会把组件安装到本地磁盘上 |
多监视器 |
在同一台PC机上提供多个适配器和显示器的支持,使得可以创建一个全包含的虚拟桌面 |
结构化存储 |
OLE结构化存储的新的实现版本 |
Job对象 |
把多个进程当作一个单元进行管理的API |
表二
产品或者技术 |
说明 |
IIS 5.0 |
Web应用的服务器平台新版本,现在作为Windows NT服务运行 |
MTS 2.0 |
基于组件的事务处理系统 |
MSMQ 2.0 |
分布式应用中使用的消息队列服务 |
Index Server 3.0 |
对计算机上所有驱动器上的内容进行索引以便实现正文检索 |
Internet Explorer 5.0 |
Microsoft的Web浏览器 |
MMC |
通过加载项的形式提供一致的管理环境 |
Proxy Server 2.0 |
系统集成的模块,可以实现高性能的Internet访问 |
表三
函数 |
说明 |
AllowSetForegroundWindow |
允许另一个进程把它的窗口设置到前台来 |
PrintDlgEx |
新版本的打印公共对话框 |
GetComputerNameEx |
获得主机和DNS域名 |
SetLayout |
设置设备环境的布局,指定文字和图形如何安排 |
OpenThread |
打开一个线程对象,返回对象的句柄 |
ReplaceFile |
用另一个文件来替换给定的文件 |
VerifyVersionInfo |
检查当前操作系统的版本信息是否与给定的参数匹配 |
GetLongPathName |
获得一个文件的长文件名 |
AnimateWindow |
当一个窗口被显示或者被隐藏的时候使用动画效果 |
TransparentBlt |
BitBlt的增强版本,使用背景透明颜色 |
GradientFill |
用两色渐变法填充屏幕区域 |
GetMouseMovePoints |
获取鼠标移动过程中所有的点 |
FlashWindowEx |
使窗口标题框闪烁,以便提醒用户 |
在所有的新技术中,TAPI 3.0值得特别一提。TAPI 3.0以COM接口的方式而不是API的形式提供了电话服务,所以我们应该考虑把TAPI 3.0当作一个全新的功能集。Microsoft仍然支持老的2.1 API。COM接口、通过DirectShow™实现的介质流访问方式以及活动目录集成是新版本电话API的一个闪光点。同样值得我们感兴趣的是一组管理任务的函数。任务对象是一组进程的集合,我们可以把它看作一个操作单元。这些进程共享同样的配置信息,比如优先级、安全性、用户界面限制等等。
Windows程序的零管理特性被嵌在新的Windows安装器(Windows Installer)中,它可以降低基于Windows的大型企业系统的TCO(total cost of ownership)。Windows安装器暴露了一组革命性的功能,使我们可以编写出在网络环境下具有即时安装功能的应用系统。一个基于Windows安装器的应用可以检测到文件的丢失或文件错误,并且可以自动从Web或者CD-ROM下载这些文件。我们可以把这个概念发挥到极至,我们的应用程序只有当真正需要某些文件时才安装这些文件。
在所有这些新的或者增强了的API函数之中,我注意到AllowSetForegroundWindow,它可以帮助开发者修复由于老的Win32函数SetForegroundWindow突然变化引起的副作用,许多开发人员用SetForegroundWindow把他们的窗口放到其他窗口的上面。但是在Windows 98和Windows 2000中,除非此窗口属于活动进程,否则它无法恢复到前台来,而只是在任务栏上闪烁。进程不再能够偷去其他进程的输入焦点。新的AllowSetForegroundWindow函数使我们可以恢复到以前在Windows 95或者Windows NT 4.0下的工作方式。不幸的是,Windows 98不支持这样的函数,不过这不是大问题。
两个等待已久的函数ReplaceFile和GetLongPathName终于出现了。ReplaceFile用另一个文件来替换指定的文件,而GetLongPathName根据一个8.3文件名返回其长路径名。
在系统外壳方面,我们可以看到一组新的COM接口,它们分别是老接口的第二或者第三个版本。IPersistFolder2、IPersistFolder3、IShellView2、IShellFolder2和IshellChangeNotify分别加入了新的功能,并且会影响到我们写名字空间扩展的方法。这些接口使得为文件夹提供Web方式的视图更为容易。另一个新的接口ICommDlgBrowser2使得在公共对话框中进行名字空间扩展成为可能。然而,File Open对话框本身经过了很大的变化,这种变化对于应用来说是完全透明的。在Windows 2000下,GetOpenFileName函数产生了一个完全新的,而且很“酷”的对话框,如图六所示。请注意这个对话框可以改变大小。
图六 New File Open对话框
对于开发人员来说,COM+是Windows 2000操作系统家族中最重要的特性。要在这里完全说明COM+是不可能的,我只是给出一个简短的说明。要想快速了解COM+,可以参照Microsoft提供的有关材料。
COM+是COM的演变,导致这个变革的因素之一是MTS出现,MTS是Windows NT服务器上的一个组件。在其他方面,MTS倡导的概念是,许多本来由开发人员负责处理的任务改成由系统来完成,其效率会更高。因此,COM+处理线程分配、安全性、对象池,以及即时激活等功能。而且,COM+也提供了一个运行时刻服务,包括大多数公共接口的缺省实现。
对于管理人员来说,关于Windows 2000的一个好消息是,它是一个产品家族。Windows 2000包括四个不同用途的操作系统版本:专业版(Professional)、服务器版本(Server)、高级服务器(Advanced Server)以及数据中心服务器(Datacenter Server)。Windows 2000的专业版看上去与Windows 98相仿,但是保留了Windows NT的稳定性。换句话说,它把Windows 98中受人喜欢的优点加到了Windows NT中。Windows 2000的服务器版本家族可以适应大型企业的应用需要。基本的服务器版本支持两路对称多处理器(SMP),高级服务器版本(以前被称为企业版)支持四路SMP。数据中心服务器是一个新产品,它可以支持16路SMP,以及多达64GB的物理内存。
其他有两个规范可以让管理人员更为感到舒畅,分别是针对Windows 2000应用开发的Windows DNA(Distributed InterNet Applications)和Windows Logo规范。Windows 2000包括大量的DNA组件——MTS、MSMQ(Microsoft Message Queue Service)、IIS(Microsoft Internet Information Service)以及索引服务(Index Service)等都包括在Windows 2000中。
Microsoft Windows Logo规范为我们编写可靠的Windows应用提供了一组技术准则。凡是标有Windows Logo标志的软件产品必须通过一个独立的实验室的测试,与这套规范相符。Logo程序的最终目标是提高Windows和应用程序的质量,保证应用程序能够与Windows正常地协同工作。用户可以在www.microsoft.com/windows/compatible上找到所有的Logo产品。
Microsoft完全更新了针对Windows 2000操作系统的Logo规范,Windows 2000 Logo程序分为两个不同的层次:基本层次和金牌层次。基本层次上的产品能够在Windows平台上正常运行、正常安装,能够与其他程序协同工作。金牌层次上的应用程序可以充分使用Windows 2000的新特性,从而为最终用户降低TCO。金牌Logo应用也是IntelliMirror有效的,可以在被保护的Windows环境下运行,也能够使用新的ACPI电源管理特性。
完整的规范(本文写作时,还只是个草案)可以从http://msdn.microsoft.com/winlogo/default.asp获得,您也可以查看http://www.veritest.com/mslogos/nt98/nt98top10.htm,在这里您可以看到大多数有关测试失败的描述。
我在一台已经安装了Windows NT 4.0的机器上安装Windows 2000专业Beta版,整个安装过程非常快,很顺利地完成了。有趣的是,所有的设置都被保留下来了,配置信息也被继承下来了。因此,在Dial-Up文件夹中我不需要重建网络连接,我也不需要重新安装应用程序来同步注册表。
最“酷”的特性无疑是即插即用。我买了一台新的机器,并且加入一个已经做好的硬盘,此硬盘包含两套启动配置:Windows NT 4.0和Windows 98。两套系统在新的硬件设备条件下都出了问题,包括显示与网络适配器、各种控制器、CD-ROM、CD-R、从硬盘、声卡、调制解调器(Modem)等。经过很多次重启动之后,Windows 98终于可以工作了。然而,我需要重新安装Windows NT 4.0,由于端口号的问题,Windows NT 4.0总是看不到调制解调器。在所有这些工作之后,我在Windows NT 4.0之上安装了Windows 2000,当它完成了文件拷贝之后,机器重启了,使人惊奇的是,声卡和调制解调器都被监测到了。
图七 找到新的硬件
在Windows NT下,一个类似于图七的对话框经常会出现在我们面前。而且,Windows 2000还提供了新的硬件向导程序,可以对机器硬件进行扫描、搜索设备、即插即用等等。另一个好消息是Windows 2000可以识别FAT32卷,这样就完全解决了在两套启动系统中用辅助的FAT32硬盘分区保存全局数据的问题。
图八 找到新硬件的向导程序
Windows 2000的用户界面有了全面的改进。最值得注意的改进在于系统外壳(shell),因为对于自定义的外壳和名字空间扩展安装来说,用户对外壳的反应最为敏感。查找对话框已经被集成到浏览器框架中,如图九所示。一组新的对话框显示在收藏菜单上:离线页面管理和页面组织。离线页面管理功能可以使我们维护一组页面,它们可以被同步和更新,然后在离线状态下进行浏览。
图九 搜索管理器
整个过程可以看作是一个特殊的、面向Web的公文包版本。图十显示了我们可以用来管理收藏链接的工具和方法。通常(至少在Beta2版本下)我注意到了动态HTML和传统的基于表单的对话框在UI方面的结合。当我们用HTML在同样的层次上进行表达时,仅仅使用通用的控制很难实现这样的效果。
图十 组织收藏夹
图十一给出了当前已经安装的设备的IRQ中断信息。它也显示了一个灵活的、很“酷”的用户界面(MMC加载项),并且按照一种很有条理、可读性很好的方式显示这些信息。当我们购买了一台新的机器或者在搭配使用新旧硬件的时候,Windows 2000可以帮助我们避免一些经常发生的安装问题。我个人最喜欢的5个特性按喜欢程度排列分别是:即插即用、NTFS增强、安装对话框的用户界面、与某些BackOffice®组件的集成、IE 5.0。
图十一 已安装设备的IRQ
当然,本文只是以 Windows 2000 专业版本为基础,它不是最终产品。比如,有些图表经常丢失颜色, Internet 连接向导不能完成创建新账号的过程。为了得到我的 email 邮件,我还必须从 Windows 98 中引入必要的注册表配置信息。然而,不管怎么样, Windows 2000 无论作为客户端工作站系统平台,还是作为服务器端系统平台,它都是一个优秀的操作系统。您应该试一试。