一、 引言
我是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)加载项模块。图一给出了组策略编辑器以及其他一些系统工具的例示。
<shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 252pt; HEIGHT: 168pt" type="#_x0000_t75" fillcolor="window"><imagedata src="file:///C:%5CDOCUME~1%5Cgaocao%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.png" o:title=""></imagedata></shape>
图一 组策略编辑器
磁盘配额是减轻系统管理员工作的另一个很“酷”的特性。其想法非常简单,我们可以为每个用户指定最大可用的磁盘空间,而且当他或者她所用的空间超过了中间警告线之后可以通知管理员。
图二给出了定义磁盘配额的属性页对话框,对于用户来说一切都是透明的,他所看到的只是他自己的剩余磁盘空间的值。即使磁盘有10GB空间,我们也可以让每个用户看到或者使用的空间不超过1GB。这有点类似于ISP给个人Web主页分配空间的做法。用户可以购买一定数量的空间,但不能超过它。不同的是,Windows 2000的磁盘配额功能是完全免费的。
<shape id="_x0000_i1026" style="WIDTH: 180pt; HEIGHT: 217.5pt" type="#_x0000_t75" fillcolor="window"><imagedata src="file:///C:%5CDOCUME~1%5Cgaocao%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image003.png" o:title=""></imagedata></shape>
图二 定义磁盘配额
磁盘配额是文件系统的功能,它以文件的逻辑尺寸为基础。换句话说,系统把用户已经创建的所有文件的大小全部加起来,以便确定他是否超过了限额。它不管文件是否被压缩了(占用更少的物理空间)。注意,只有NTFS磁盘卷才支持磁盘配额特性。
系统管理员通常要执行批操作或者对重复性的任务使用定时运行功能。但是老式的MS-DOS bat文件功能不够强大,它不能够驱动现代图形操作系统上的操作。Windows脚本宿主系统(WSH)更适合于这样的用途。然而,它并不是Windows 2000所支持的唯一的脚本特性。Windows 2000支持另一个脚本特性ScriptIt,ScriptIt不是一个传统的脚本语言,它也没有提供传统语言的许多特征,但它可以启动一个进程,可以向一个活动的窗口发送一组键盘消息。
图三给出了新的任务调度器向导的界面,它看上去与Windows 98的调度器界面非常类似,功能上并没有创新之处,但是用户界面(UI)是一个显著的改进。
<shape id="_x0000_i1027" style="WIDTH: 198.75pt; HEIGHT: 143.25pt" type="#_x0000_t75" fillcolor="window"><imagedata src="file:///C:%5CDOCUME~1%5Cgaocao%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image005.png" o:title=""></imagedata></shape>
图三 新的任务调度器向导
Windows 2000并没有为系统管理员引入新的任务,也没有消除老的任务,它只是为系统管理员提供了一些新的、功能更强大的工具。
系统工程师通常要涉及到一些设计细节,这些细节可能会受到文件系统、设备驱动以及网络等影响。Windows 2000首选使用新的NTFS文件系统,与老的NTFS系统相比,它有了很大的变化,下文我将会讲到这些变化,但是更深入的研究请参照本期杂志的另一篇关于NTFS的文章。
当我们设计与系统特性关系密切的应用时,NTFS就非常有价值。利用NTFS卷(Windows 95和Windows 98不支持NTFS分区),我们可以充分利用硬链接、流以及自动加密文件等特性。
当我们使用NTFS的加密文件系统(Encrypted File System,简称EFS)时,Windows 2000使用CryptoAPI来保护数据。我们可以对单个文件或者整个文件夹设置加密标记,如图四所示。这个加密过程完全在后台进行,并且只引入很小的负荷。它并不能防止其他的未授权的用户看到这些文件,但他们无法理解这些文件,因为系统不会为他们解密这些文件。图五给出了当其他用户试图打开这些文件时得到的警告信息。
<shape id="_x0000_i1028" style="WIDTH: 291pt; HEIGHT: 336.75pt" type="#_x0000_t75" fillcolor="window"><imagedata src="file:///C:%5CDOCUME~1%5Cgaocao%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image007.gif" o:title=""></imagedata></shape>
图四 设置加密标记
<shape id="_x0000_i1029" style="WIDTH: 247.5pt; HEIGHT: 114pt" type="#_x0000_t75" fillcolor="window"><imagedata src="file:///C:%5CDOCUME~1%5Cgaocao%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image008.gif" o:title=""></imagedata></shape>
图五 警告消息对话框
我曾经在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访问 |
表三
函数 |
说明 |
发表评论
最新评论
|
评论