显示标签为“系统管理”的博文。显示所有博文
显示标签为“系统管理”的博文。显示所有博文

2009年4月23日星期四

用bootrec.exe工具修复vista的启动问题。


简介 
可以在 Windows 恢复环境 (Windows RE) 中使用 Bootrec.exe 工具解决和修复 Windows Vista 中以下项目的问题:
主启动记录 (MBR)
启动扇区
启动配置数据 (BCD) 存储
注意:使用 Windows RE 解决启动问题时,应该首先尝试“系统恢复选项”对话框中的“启动修复”选项。如果“启动修复”选项不能解决此问题,或者如果必须通过较多个步骤手动解决此问题,请使用 Bootrec.exe 工具。

更多信息
要运行 Bootrec.exe 工具,必须启动 Windows RE。为此,请按照下列步骤操作: 将 Windows Vista 安装盘放入光盘驱动器中,然后启...要运行 Bootrec.exe 工具,必须启动 Windows RE。为此,请按照下列步骤操作:
将 Windows Vista 安装盘放入光盘驱动器中,然后启动计算机。
在系统提示时按某个键。
选择语言、时间、货币、键盘或输入法,然后单击“下一步”。
单击“修复计算机”。
单击要修复的操作系统,然后单击“下一步”。
在“系统恢复选项”对话框中,单击“命令提示符”。
键入 Bootrec.exe,然后按 Enter。

Bootrec.exe 选项
Bootrec.exe 工具支持以下选项。请使用适用于您的情况的选项。
/FixMbr
/FixMbr 选项将与 Windows Vista 兼容的 MBR 写入系统分区。此选项不会覆盖现有的分区表。当必须解决 MBR 损坏问题或必须删除 MBR 中的非标准代码时,请使用此选项。

/FixBoot
/FixBoot 选项使用与 Windows Vista 兼容的启动扇区将新的启动扇区写入到系统分区。如果满足下列条件之一,请使用此选项:
启动扇区已被替换为非标准的 Windows Vista 启动扇区。
启动扇区已损坏。
安装 Windows Vista 后,安装了早期版本的 Windows 操作系统。在此情况下,计算机使用 Windows NT 加载器 (NTLDR) 启动,而不是使用 Windows 启动管理器 (Bootmgr.exe) 启动。

/ScanOs
/ScanOs 选项在所有磁盘中扫描与 Windows Vista 兼容的安装。此外,此选项还会显示当前未处于 BCD 存储中的条目。如果存在“启动管理器”菜单未列出的 Windows Vista 安装,请使用此选项。

/RebuildBcd
/RebuildBcd 选项在所有磁盘中扫描与 Windows Vista 兼容的安装。此外,通过此选项还可以选择要添加到 BCD 存储中的安装。如果必须彻底重新生成 BCD,请使用此选项。

注意:如果重新生成 BCD 未解决启动问题,则可以导出并删除 BCD,然后再次运行此选项。这样可以确保彻底重新生成 BCD。为此,请在 Windows RE 命令提示符处输入以下命令:
bcdedit /export C:\BCD_Backup
c:
cd boot
attrib bcd -s -h -r
ren c:\boot\bcd bcd.old
bootrec /RebuildBcd


--------------------------------------------------------------------------------

这篇文章中的信息适用于:
Windows Vista Ultimate
Windows Vista Enterprise
Windows Vista Business
Windows Vista Home Premium
Windows Vista Home Basic
Windows Vista Business 64-bit edition
Windows Vista Enterprise 64-bit edition
Windows Vista Home Premium 64-bit edition
Windows Vista Home Basic 64-bit edition
Windows Vista Ultimate 64-bit edition


2009年4月2日星期四

Windows Server 2003 中的FSMO角色

FSMO(Flexible Single Master Operations)中文翻译成操作主控,FSMO有五种角色,分成两大类:
  1、 森林级别(即一个森林只存在一台DC有这个角色):
  (1)、Schema Master中文翻译成:架构主控
  (2)、Domain Naming Master中文翻译成:域命名主控
  2、 域级别(即一个域里面只存一台DC有这个角色):
  (1)、PDC Emulator 中文翻译成:PDC仿真器
  (2)、RID Master 中文翻译成:RID主控
  (3)、Infrastructure Master 中文翻译成:基础架构主控
 一、接下来就来说明一下这五种角色空间有什么作用:
 1、 Schema Maste
  用是修改活动目录的源数据。我们知道在活动目录里存在着各种各样的对像,比如用户、计算机、打印机等,这些对像有一系列的属性,活动目录本身就是一个数据库,对像和属性之间就好像表格一样存在着对应关系,那么这些对像和属性之间的关系是由谁来定义的,就是Schema Maste,如果大家部署过Excahnge的话,就会知道Schema是可以被扩展的,但需要大家注意的是,扩展Schema一定是在Schema Maste进行扩展的,在其它域控制器上或成员服务器上执行扩展程序,实际上是通过网络把数据传送到Schema上然后再在Schema Maste上进行扩展的,要扩展Schema就必须具有Schema Admins组的权限才可以。
  建议:在占有Schema Maste的域控制器上不需要高性能,因为我们不是经常对Schema进行操作的,除非是经常会对Schema进行扩展,不过这种情况非常的少,但我们必须保证可用性,否则在安装Exchnage或LCS之类的软件时会出错。
 2、 Domain Naming Master
  这也是一个森林级别的角色,它的主要作用是管理森林中域的添加或者删除。如果你要在你现有森林中添加一个域或者删除一个域的话,那么就必须要和Domain Naming Master进行联系,如果Domain Naming Master处于Down机状态的话,你的添加和删除操作那上肯定会失败的。
   建议:对占有Domain Naming Master的域控制器同样不需要高性能,我想没有一个网络管理员会经常在森林里添加或者删除域吧?当然高可用性是有必要的,否则就没有办法添加删除森里的域了。
 3、PDC Emulator
  在前面已经提过了,Windows 2000域开始,不再区分PDC还是BDC,但实际上有些操作则必须要由PDC来完成,那么这些操作在Windows 2000域里面怎么办呢?那就由PDC Emulator来完成,主要是以下操作:
  ⑴、处理密码验证要求;
  在默认情况下,Windows 2000域里的所有DC会每5分钟复制一次,但有一些情况是例外的,比如密码的修改,一般情况下,一旦密码被修改,会先被复制到PDC Emulator,然后由PDC Emulator触发一个即时更新,以保证密码的实时性,当然,实际上由于网络复制也是需要时间的,所以还是会存在一定的时间差,至于这个时间差是多少,则取决于你的网络规模和线路情况。
  ⑵、统一域内的时间;
  微软活动目录是用Kerberos协议来进行身份认证的,在默认情况下,验证方与被验证方之间的时间差不能超过5分钟,否则会被拒绝通过,微软这种设计主要是用来防止回放式攻击。所以在域内的时间必须是统一的,这个统一时间的工作就是由PDC Emulator来完成的。
  ⑶、向域内的NT4 BDC提供复制数据源;
  对于一些新建的网络,不大会存在Windows 2000域里包含NT4的BDC的现象,但是对于一些从NT4升级而来的Windows 2000域却很可能存有这种情况,这种情况下要向NT4 BDC复制,就需要PDC Emulator。
  ⑷、统一修改组策略的模板;
  ⑸、对Winodws 2000以前的操作系统,如WIN98之类的计算机提供支持;
  对于Windows 2000之前的操作系统,它们会认为自己加入的是NT4域,所以当这些机器加入到Windows 2000域时,它们会尝试联系PDC,而实际上PDC已经不存在了,所以PDC Emulator就会成为它们的联系对象!
  建议:从上面的介绍里大家应该看出来了,PDC Emulator是FSMO五种角色里任务最重的,所以对于占用PDC Emulator的域控制器要保证高性能和高可用性。
 4、RID Master
  在Windows 2000的安全子系统中,用户的标识不取决于用户名,虽然我们在一些权限设置时用的是用户名,但实际上取决于安全主体SID,所以当两个用户的SID一样的时候,尽管他们的用户名可能不一样,但Windows的安全子系统中会把他们认为是同一个用户,这样就会产生安全问题。而在域内的用户安全SID=Domain SID+RID,那么如何避免这种情况?这就需要用到RID Master,RID Master的作用是:分配可用RID池给域内的DC和防止安全主体的SID重复。
  建议:对于占有RID Master的域控制器,其实也没有必要一定要求高性能,因为我们很少会经常性的利用批处理或脚本向活动目录添加大量的用户。这个请大家视实际情况而定了,当然高可用性是必不可少的,否则就没有办法添加用户了。
  5、 Infrastructure Master
  FSMO的五种角色中最无关紧要的可能就是这个角色了,它的主要作用就是用来更新组的成员列表,因为在活动目录中很有可能有一些用户从一个OU转移到另外一个OU,那么用户的DN名就发生变化,这时其它域对于这个用户引用也要发生变化。这种变化就是由Infrastructure Master来完成的。
  建议:其实在活动目录森林里仅仅只有一个域或者森林里所有的域控制器都是GC(全局编录)的情况下,Infrastructure Master根本不起作用,所以一般情况下对于占有Infrastructure Master的域控制器往忽略性能和可能性。
 二、在说完FSMO五种角色的作用以后,我们如何知道这五种角色在网络中的分布情况呢?
  对于新建的网络,这五种角色都集中在森林中的第一台域控制器上,但是如果是别人已经建好的网络,比如我们去接手一些网络的时候,很可能这五种角色已经被转移到其它的域控制器上了。这时我们可以通过三种方法来知道,分别是GUI介面,命令行及脚本:
  1、 GUI介面:
  GUI介面下不能一次性获得五种角色的分布,
  ⑴、Schema Maste
  点击“开始-运行”,输入:“regsvr32 schmmgmt”,回车:
然后点击“确定”。 
  再点击“开始-运行”,输入:“MMC”,回车,进入控制台,.
  出来下面的介面:
再点击“添加”:
选中上图所示中有“Active Directory架构”,点击“添加”,然后点“关闭”:
然后点击“确定”,在控制台上选中“Active Directory架构”击“右键”,选择“操作主机”
出现下图:
就可以看到当前的架构主控了。 
  ⑵、RID Master、Infrastructure Master、PDC Emulator
  点击“开始-设置-控制面板-管理工具-Active Directory用户和计算机”
  在域名上单击右键:
在出来的菜单中选择“操作主机”:
在出来的画面中可以看到RID Master、PDC Emulator、Infrastructure Master的分布情况。
  ⑶、Domain Naming Master
  点击“开始-设置-控制面板-管理工具-Active Directory域和信任关系”:
  在“Active Directory域和信任关系”上击右键:
  选择“操作主机”:
  这就是“Domain Naming Master”所在的域控制器。
  以上就是用GUI来查看FSMO五种角色的分布情况,用GUI介面不但可以查看,还可以随意的改变这五种角色的分布情况,但缺点是比较麻烦,需要较多的操作项目,如果仅仅是查看就比较的浪费时间。
  2、 命令行工具:
  首先你要安装Support Tools,在安装光盘中的Support文件夹下的Tools子文件下。默认安装在系统盘的Program Files文件下。安装成功后,点击“开始-程序-Windows Support Tools-Command Prompt”:
  然后运行“netdom”命令,在这里,运行的是:“netdom query fsmo”:
  看到了吧,马上把当前域里的FSMO五种角色所在的域控制器罗列了出来。
 三、最后来看一下FSMO的规划,在规划时,请大家按以下原则进行:
  1、占有Domain Naming Master角色的域控制器必须同时也是GC;
  2、不能把Infrastructure Master和GC放在同一台DC上;
  3、建议将Schema Master和Domain Naming Master放在森林根域的GC服务器上;
  4、建议将Schema Master和Domain Naming Master放在同一台域控制器上;
  5、建议将PDC Emulator、RID Master及Infrastructure Master放在同一台性能较好的域控制器上;
  6、尽量不要把PDC Emulator、RID Master及Infrastructure Master放置在GC服务器上;

2009年3月25日星期三

windows 2003 DNS的新增内容之存根区域(Stub Zone)

了解存根区域
存根区域是一个区域副本,只包含标识该区域的权威域名系统 (DNS) 服务器所需的那些资源记录。存根区域用于在单独 DNS 命名空间之间解析名称。如果公司合并者要求两个单独的 DNS 命名空间的 DNS 服务器解析这两个命名空间中的客户端的名称,则可能必须进行这种类型的解析。

存根区域由以下部分组成:

  • 委派区域的起始授权机构 (SOA) 资源记录、名称服务器 (NS) 资源记录和粘附 A 资源记录。
  • 可用来更新存根区域的一个或多个主服务器的 IP 地址。
存根区域的主服务器是对于子区域具有权威性的一个或多个 DNS 服务器,通常 DNS 服务器主持委派域名的主要区域。

存根区域解析
DNS 客户端在建立了存根区域的 DNS 服务器上执行递归查询操作时,DNS 服务器会使用该存根区域中的资源记录来解析查询。DNS 服务器向存根区域的 NS 资源记录中指定的权威 DNS 服务器发送迭代查询,仿佛在使用其缓存中的 NS 资源记录一样。如果 DNS 服务器找不到其存根区域中的权威 DNS 服务器,那么建立了该存根区域的 DNS 服务器会尝试使用根提示进行标准递归。

DNS 服务器将从存根区域中列出的权威 DNS 服务器接收的资源记录存储在它的缓存中,但不会将这些资源记录存储在存根区域本身,只有查询响应中返回的粘附 A 资源记录存储在存根区域中。存储在缓存中的资源记录按照每个资源记录中的生存时间 (TTL) 的值进行缓存。不写入缓存的 SOA、NS 和粘附 A 资源记录,按照在存根区域的 SOA 记录中指定的过期间隔过期,该过期间隔是在创建存根区域期间创建的,在从原始主要区域向存根区域传输期间更新。

如果查询是迭代查询,DNS 服务器会返回一个包含存根区域中指定的服务器的参考信息。

宿主父区域和子区域的 DNS 服务器之间的通信
仅当将这些新的 DNS 服务器的资源记录添加到 DNS 服务器主持的父区域时,已向另一个 DNS 服务器上的子区域委派域的 DNS 服务器,才可了解该子区域的新的权威 DNS 服务器。这是一个手动过程,要求不同的 DNS 服务器的管理员经常通信。使用存根区域,主持其委派域之一的存根区域的 DNS 服务器可在该存根区域更新时获取该子区域的权威 DNS 服务器的更新。更新是从主持该存根区域的 DNS 服务器执行的,不需要与主持该子区域的 DNS 服务器的管理员取得联系。下面的示例将对该功能加以说明。

存根区域方案
父区域 example.com 的权威 DNS 服务器已经向单独的 DNS 服务器委派了一个子域 widgets.example.com。最初执行域 widgets.example.com 的委派时,父区域只包含 widgets.example.com 区域的权威 DNS 服务器的两个 NS 记录。随后,子区域的管理员将其他 DNS 服务器配置为该区域的权威服务器,但不通知主持父区域 example.com 的 DNS 服务器的管理员。结果,主持父区域 example.com 的 DNS 服务器不知道它的子区域的新的权威 DNS 服务器,并继续只查询它知道的两个权威 DNS 服务器。

为父区域 example.com 配置权威 DNS 服务器,使其为委派的域 widgets.example.com 主持一个存根区域,这样做使上面这种情况得到补救。example.com 的权威 DNS 服务器的管理员更新该存根区域时,它会查询该存根区域的主服务器,以获取 widgets.example.com 的权威 DNS 服务器资源记录。结果,父区域的权威 DNS 服务器将了解有关 widgets.example.com 子区域的新的权威 DNS 服务器的信息,并能够向该子区域的所有权威 DNS 服务器执行递归。

如何使用

使用存根区域使用存根区域可执行以下操作:

一 使委派的区域信息保持最新。 通过定期更新它的一个子区域的存根区域,主持父区域和存根区域的 DNS 服务器将维护该子区域的权威 DNS 服务器的当前列表。 

二 改进名称解析。 存根区域使 DNS 服务器能够使用存根区域的名称服务器列表执行递归,而无需查询 Internet 或 DNS 名称空间的内部根服务器。
简化 DNS 管理。 在整个 DNS 结构中使用存根区域可为区域分发权威 DNS 服务器的列表,而不用使用辅助区域。但是,存根区域与辅助区域的用途不同,考虑冗余和负载共享时,存根区域不是备用区域。 

加载和维护存根区域涉及两个 DNS 服务器列表:

DNS 服务器从其加载和更新存根区域的主服务器列表。主服务器可以是区域的主要或辅助 DNS 服务器。在两种情况下,它将拥有区域的 DNS 服务器的完整列表。
区域的权威 DNS 服务器列表。该列表包含在使用名称服务器 (NS) 资源记录的存根区域中。
DNS 服务器加载存根区域(例如,widgets.example.com)时,它查询主服务器(它可位于不同的位置),寻找区域 widgets.example.com 的权威服务器的必要资源记录。主服务器列表可包含一个或多个服务器,可随时更改。

存根区域更新

存根区域更新涉及下列条件:

一 DNS 服务器加载存根区域时,它查询区域的主服务器寻找 SOA 资源记录、区域的根目录的 NS 资源记录和 A 资源记录。
二 存根区域更新期间,主持存根区域的 DNS 服务器查询主服务器,寻找存根区域加载期间请求的同一资源记录类型。
三 SOA 资源记录的刷新间隔确定主持存根区域的 DNS 服务器何时将尝试区域传输(更新)。 

如果更新失败,SOA 资源记录的重试间隔将确定何时重试更新。
一旦重试间隔到期而未成功更新,在 SOA 资源记录的“截止期限”字段中指定的到期时间将确定 DNS 服务器何时停止使用存根区域数据。 

存根区域更新操作:

重新加载。 从主持存根区域的 DNS 服务器的本地存储器重新加载存根区域。
从主服务器传送。 让主持存根区域的 DNS 服务器确定存根区域的 SOA 资源记录中的序列号是否已到期,然后从存根区域的主服务器执行区域传输。
从主服务器重新加载。 从存根区域的主服务器执行区域传输,不管存根区域的 SOA 资源记录中的序列号是多少。

区域委派

委派区域DNS 提供了将名称空间分割成一个或多个区域的选项,可以将这些区域存储、分配和复制到其他 DNS 服务器。决定是否分割 DNS 名称空间以获得附加的区域时,考虑如下使用附加区域的理由:
一 需要将 DNS 名称空间的部分管理工作委派给您单位中的另一位置或部门。
二 为了在多个服务器之间分配通信量负载,需要将一个大的区域分成若干小的区域,这提高了 DNS 名称解析性能或创建了一个容错性更好的 DNS 环境。
三 需要通过立刻添加许多子域来扩展名称空间,例如提供开放的新分支或站点。 

向新区域委派子域

创建子域 (example.lanlanxin.com) 的新区域时,需要有来自父区域(lanlanxin.com) 的委派。
新委派的 example.lanlanxin.com 子域的权威 DNS 服务器计算机根据包含在新区域 (ns1.na.example.lanlanxin.com) 中的派生子域来命名。要使新委派区域以外的其他服务器知道该服务器,在 lanlanxin.com 区域中需要两个 RR 来完成新区域的委派。这些 RR 包括:
一个使委派生效的 NS RR。这个 RR 用于公布名为ns1.na.example.lanlanxin.com 的服务器是被委派子域的权威服务器。一个 A RR (也被称作粘附记录)需要将 NS RR 中指定的服务器名称解析为它的 IP 地址。将该 RR 中的主机名解析为 NS RR 中委派的 DNS 服务器的过程有时也称作粘附跟踪。

2009年3月4日星期三

利用vbs脚本获得局域网内PC的配置信息

对于一个企业来说,时刻掌握最新的PC配置信息对于IT维护和资产管理都很重要。下面以我单位的情况提供一种用vbs查询PC信息的一种方法。
我们单位使用DELL和LENOVO的品牌电脑,DELL电脑BIOS提供序列号用于报修,所以这里查询了主机型号、序列号、生产厂家和总内存大小等等,可以更加情况添加相应的内容。我建立info.vbs脚本内容如下:


On Error Resume Next


'从参数输入电脑ip或者电脑名:
Set objArgs = WScript.Arguments
strComputer = objArgs(0)


'主机名、电脑型号和内存总量:"
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set sysInfo = objWMIService.ExecQuery _
("Select * from Win32_ComputerSystem")
For Each objSysInfo in sysInfo
WScript.Echo "主机名: " & objSysInfo.Name
WScript.Echo "生产厂家: " & objSysInfo.Manufacturer
WScript.Echo "型号: " & objSysInfo.Model
Next


'获得主机序列号:
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_BIOS", , 48)
For Each objItem In colItems
WScript.Echo "出厂序列号: " & objItem.SerialNumber
Next


'获得CPU信息
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_Processor", , 48)
For Each objItem In colItems
WScript.Echo "CPU型号: " & Trim(objItem.Name)
Next


'获得内存容量
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_ComputerSystem", , 48)
For Each objItem In colItems
WScript.Echo "总内存:" & CStr(Int(objItem.TotalPhysicalMemory / 1048576)) & "M"
Next


'收集硬盘基本信息
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_DiskDrive", , 48)
For Each objItem In colItems
WScript.Echo "硬盘:" & Trim(objItem.Caption) & " 容量为:" &CStr(Int(objItem.Size/1000000000)) & "G"
Next
'收集软驱信息
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_FloppyDrive", , 48)
For Each objItem In colItems
WScript.Echo "软驱:" & Trim(objItem.Caption)
Next
'收集CDROM信息
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_CDROMDrive", , 48)
For Each objItem In colItems
WScript.Echo "光驱: " & Trim(objItem.Name)
Next


'收集显卡信息
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_VideoController", , 48)
For Each objItem In colItems
WScript.Echo "显卡: " & Trim(objItem.Caption) & Trim(objItem.VideoModeDescription)
Next


'收集网卡信息
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_NetworkAdapter", , 48)
For Each objItem In colItems
WScript.Echo "网卡: " & Trim(objItem.Description) & (objItem.MACAddress)
Next


'收集声卡信息
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_SoundDevice", , 48)
For Each objItem In colItems
WScript.Echo "声卡: " & Trim(objItem.ProductName)
Next
WScript.Echo " "



以上内容保存为info.vbs脚本,获得单个主机的配置信息的方法是开始--运行--cmd--回车,在cmd窗口中输入cscript info.vbs xxx,其中xxx为目标机器的ip或者主机名。

因为以上脚本可以从命令行获得参数,所以可以方便的加入批处理中执行。例如我公司内有多个VLAN,对其中一个VLAN22(IP范围为10.8.22.10到10.8.22.200),查询所有主机的配置信息的批处理如下:

for /L %%1 in (10,1,200) do @ping -n 1 10.8.22.%%1 丨find "timed" >nul 2>nul && echo 10.8.22.%%1_is_inexistent 丨丨 cscript /nologo info.vbs 10.8.22.%%1 >> 22.txt

该批处理首先判断一个IP是否存在,然后获取活动主机的电脑配置信息,保存在22.txt中以备查。(因无法显示,注意将换为丨换为英文的,即普通键盘上的"shift+\"键)

前提是你是所有PC的管理员,最好在域环境下使用。

关于VBS脚本使用请参考微软的相关文档:
http://www.microsoft.com/china/technet/community/scriptcenter/default.mspx

2009年3月3日星期二

用脚本自动配置IE代理服务器

自动配置IE代理的脚本,用户根据不同的网络环境自动配置IE代理服务器。


function FindProxyForURL(url,host){
if((isPlainHostName(host))shExpMatch(url,"http://127.0.0.1/*")isInNet(host,"192.168.0.0", "255.255.255.0")){
return "direct";
}
else {
  
if(myIpAddress()=="192.168.0.49")
   
return "PROXY 192.168.0.6:808";
else
  
return "direct";
}

}


把以上代码另存为proxy.pac的文件,如:c:\proxy.pac,然后在IE的菜单里"工具"->"INTEL选项"->"连接"->局域网设置

把使用自动配置脚本选上,然后在地址栏填入file://c:/proxy.pac,注意file后是两斜杠,要使设置生效,需要关闭IE再重新打开.

现在我们介绍下这个proxy.pac脚本文件,脚本的语法是js语法,js的内置函数可以使用,要实现自动配置代理,需要实现FindProxyForURL这个函数,其参数url代表要访问的连接,host代表要访问连接的主机名,该函数有三个返回参数
direct:直接连接
proxy IP:PORT
socket IP:PORT
返回结果大小写不敏感

PAC脚本另外一个重要的应用是多台代理服务器并存的情况下,通过pac脚本的控制:

  • 用户随机选择使用多台代理服务器中的任意一台来达到流量负载均衡的目的;
  • 管理员通过PAC脚本控制用户使用和不使用某台代理服务器,这样可以空出时间对代理服务器进行维护;
  • 让服务器工作在主备模式,当主服务器宕机时,会自动切换到其它备用服务器而不会中断服务;
  • 根据访问目的地的不同,自动选择最佳代理服务器。


下面列举几个PAC的实例,顺便学习下它的语法

a、isPlainHostName(host),本例演示判断是否为本地主机,如http://myservername/
的方式访问,如果是直接连接,否则使用代理

function FindProxyForURL(url, host)
{
if (isPlainHostName(host))
return "DIRECT";
else
return "PROXY proxy:80";
}



b、dnsDomainIs(host, "")、localHostOrDomainIs(host, ""),本例演示判断访问主机是否属于某个域和某个域名,如果属于.company.com域的主机名,而域名不是
www.company.com和home.company.com的直接连接,否则使用代理访问。

function FindProxyForURL(url, host)
{
if ((isPlainHostName(host)
dnsDomainIs(host,
".company.com")) &&
!localHostOrDomainIs(host, "www.company.com") &&
!localHostOrDomainIs(host, "home.company.com"))

return "DIRECT";
else
return "PROXY proxy:80";
}


c、isResolvable(host),本例演示主机名能否被dns服务器解析,如果能直接访问,否 则就通过代理访问。

function FindProxyForURL(url, host)
{
if (isResolvable(host))
return "DIRECT";
else
return "PROXY proxy:80";
}


d、isInNet(host, "", ""),本例演示访问IP是否在某个子网内,如果是就直接访问,否则就通过代理,例子演示访问清华IP段的主页不用代理。

function FindProxyForURL(url, host)
{
if (isInNet(host, "166.111.0.0", "255.255.0.0"))
return "DIRECT";
else
return "PROXY proxy:80";
}



e、shExpMatch(host, ""),本例演示根据主机域名来改变连接类型,本地主机、*.edu、 *.com分别用不同的连接方式。

function FindProxyForURL(url, host)
{
if (isPlainHostName(host))
return "DIRECT";
else if (shExpMatch(host, "*.com"))
return "PROXY comproxy:80";
else if (shExpMatch(host, "*.edu"))
return "PROXY eduproxy:80";
else
return "PROXY proxy:80";
}



f、url.substring(),本例演示根据不同的协议来选择不同的代理,http、https、ftp、
gopher分别使用不同的代理。

function FindProxyForURL(url, host)
{
if (url.substring(0, 5) == "http:") {
return "PROXY proxy:80";
}

else if (url.substring(0, 4) == "ftp:") {
return "PROXY fproxy:80";
}

else if (url.substring(0, 7) == "gopher:") {
return "PROXY gproxy";
}

else if (url.substring(0, 6) == "https:") {
return "PROXY secproxy:8080";
}

else {
return "DIRECT";
}

}



g、dnsResolve(host),本例演示判断访问主机是否某个IP,如果是就使用代理,否则直接连接。

function FindProxyForURL(url, host)
{
if (dnsResolve(host) == "166.111.8.237") {
return "PROXY secproxy:8080";
}

else {
return "PROXY proxy:80";
}

}



h、myIpAddress(),本例演示判断本地IP是否某个IP,如果是就使用代理,否则直接使用连接。

function FindProxyForURL(url, host)
{
if (myIpAddress() == "166.111.8.238") {
return "PROXY proxy:80";
}

else {
return "DIRECT";
}

}



i、dnsDomainLevels(host),本例演示访问主机的域名级数是几级,就是域名有几个点, 如果域名中有点,就通过代理访问,否则直接连接。

function FindProxyForURL(url, host)
{
if (dnsDomainLevels(host) > 0) { // if number of dots in host > 0
return "PROXY proxy:80";
}

return "DIRECT";
}



j、weekdayRange(),本例演示当前日期的范围来改变使用代理,如果是GMT时间周三到周六,使用代理连接,否则直接连接。

function FindProxyForURL(url, host)
{
if(weekdayRange("WED", "SAT", "GMT"))
return "PROXY proxy:80";
else
return "DIRECT";
}



k、最后一个例子是演示随机使用代理,这样可以好好利用代理服务器。

function FindProxyForURL(url,host)
{
return randomProxy();
}


function randomProxy()
{
switch( Math.floor( Math.random() * 5 ) )
{
case 0:
return "PROXY proxy1:80";
break;
case 1:
return "PROXY proxy2:80";
break;
case 2:
return "PROXY proxy3:80";
break;
case 3:
return "PROXY proxy4:80";
break;
case 4:
return "PROXY proxy5:80";
break;
}

}