如果你玩过路由器的话,就知道路由器里面那些很好玩的命令缩写。
  
  例如,"sh int" 的意思是 "show interface"。
  
  现在 Windows 2000 也有了类似界面的工具,叫做 netsh。
  
  我们在 Windows 2000 的 cmd shell 下,输入 netsh
  就出来:netsh> 提示符,
  输入 int ip 就显示:
  interface ip>
  
  然后输入 dump ,我们就可以看到当前系统的网络配置:
  
  # ———————————-
  
  # Interface IP Configuration
  
  # ———————————-
  
  pushd interface ip
  
  # Interface IP Configuration for "Local Area Connection"
  
  set address name = "Local Area Connection" source = static addr = 192.168.1.168
  mask = 255.255.255.0
  add address name = "Local Area Connection" addr = 192.1.1.111 mask = 255.255.255.0
  set address name = "Local Area Connection" gateway = 192.168.1.100 gwmetric = 1
  set dns name = "Local Area Connection" source = static addr = 202.96.209.5
  set wins name = "Local Area Connection" source = static addr = none
  
  popd
  # End of interface IP configuration
  
  上面介绍的是通过交互方式操作的一种办法。
  我们可以直接输入命令:
  "netsh interface ip add address "Local Area Connection" 10.0.0.2 255.0.0.0"
  来添加 IP 地址。
  
  如果不知道语法,不要紧的哦!
  在提示符下,输入 ? 就可以找到答案了。方便不方便啊?
  原来微软的东西里面,也有那么一些让人喜欢的玩意儿。可惜,之至者甚少啊!
  
  Windows网络命令行程序
  这部分包括:
  
  使用 ipconfig /all 查看配置
  使用 ipconfig /renew 刷新配置
  使用 ipconfig 管理 DNS 和 DHCP 类别 ID
  使用 Ping 测试连接
  使用 Arp 解决硬件地址问题
  使用 nbtstat 解决 NetBIOS 名称问题
  使用 netstat 显示连接统计
  使用 tracert 跟踪网络连接
  使用 pathping 测试路由器
  使用 ipconfig /all 查看配置
  发现和解决 TCP/IP 网络问题时,先检查出现问题的计算机上的 TCP/IP 配置。可以使用 ipconfig 命令获得主机配置信息,包括 IP 地址、子网掩码和默认网关。
  
  注意
  对于 Windows 95 和 Windows 98 的客户机,请使用 winipcfg 命令而不是 ipconfig 命令。
  使用带 /all 选项的 ipconfig 命令时,将给出所有接口的详细配置报告,包括任何已配置的串行端口。  使用 ipconfig /all,可以将命令输出重定向到某个文件,并将输出粘贴到其他文档中。也可以用该输出确认网络上每台计算机的 TCP/IP 配置,或者进一步调查 TCP/IP 网络问题。
  
  例如,如果计算机配置的 IP 地址与现有的 IP 地址重复,则子网掩码显示为 0.0.0.0。
  
  下面的范例是 ipconfig /all 命令输出,该计算机配置成使用 DHCP 服务器动态配置TCP/IP,并使用WINS 和 DNS 服务器解析名称。
  
  Windows 2000 IP Configuration
  
  Node Type.. . . . . . . . : Hybrid
  IP Routing Enabled.. . . . : No
  WINS Proxy Enabled.. . . . : No
  
  Ethernet adapter Local Area Connection:
  
  Host Name.. . . . . . . . : corp1.microsoft.com
  DNS Servers . . . . . . . : 10.1.0.200
  Description. . . . . . . : 3Com 3C90x Ethernet Adapter
  Physical Address. . . . . : 00-60-08-3E-46-07
  DHCP Enabled.. . . . . . . : Yes
  Autoconfiguration Enabled.: Yes
  IP Address. . . . . . . . . : 192.168.0.112
  Subnet Mask. . . . . . . . : 255.255.0.0
  Default Gateway. . . . . . : 192.168.0.1
  DHCP Server. . . . . . . . : 10.1.0.50
  Primary WINS Server. . . . : 10.1.0.101
  Secondary WINS Server. . . : 10.1.0.102
  Lease Obtained.. . . . . . : Wednesday, September 02, 1998 10:32:13 AM
  Lease Expires.. . . . . . : Friday, September 18, 1998 10:32:13 AM
  
  如果 TCP/IP 配置没有问题,下一步测试能够连接到 TCP/IP 网络上的其他主机。
  
  使用 ipconfig /renew 刷新配置
  解决 TCP/IP 网络问题时,先检查遇到问题的计算机上的 TCP/IP 配置。如果计算机启用 DHCP 并使用 DHCP 服务器获得配置,请使用 ipconfig /renew 命令开始刷新租约。
  
  使用 ipconfig /renew 时,使用 DHCP 的计算机上的所有网卡(除了那些手动配置的适配器)都尽量连接到DHCP 服务器,更新现有配置或者获得新配置。
  
  也可以使用带 /release 选项的 ipconfig 命令立即释放主机的当前 DHCP 配置。有关 DHCP 和租用过程的详细信息,请参阅客户机如何获得配置。
  
  注意
  对于启用 DHCP 的 Windows 95 和 Windows 98 客户,请使用 winipcfg 命令的 release 和 renew 选项,而不是 ipconfig /release 和 ipconfig /renew 命令,手动释放或更新客户的 IP 配置租约。
  使用 ipconfig 管理 DNS 和 DHCP 类别 ID
  也可以使用 ipconfig 命令:
  
  显示或重置 DNS 缓存。
  详细信息,请参阅使用 ipconfig 查看或重置客户解析程序缓存。
  
  刷新已注册的 DNS 名称。
  详细信息,请参阅使用 ipconfig 更新 DNS 客户注册。
  
  显示适配器的 DHCP 类别 ID。
  详细信息,请参阅显示客户机上的 DHCP 类别 ID 信息。
  
  设置适配器的 DHCP 类别 ID。
  详细信息,请参阅设置客户机上的 DHCP 类别 ID 信息。
  
  使用 Ping 测试连接
  Ping 命令有助于验证 IP 级的连通性。发现和解决问题时,可以使用 Ping 向目标主机名或 IP 地址发送 ICMP 回应请求。需要验证主机能否连接到 TCP/IP 网络和网络资源时,请使用 Ping。也可以使用 Ping 隔离网络硬件问题和不兼容配置。
  
  通常最好先用 Ping 命令验证本地计算机和网络主机之间的路由是否存在,以及要连接的网络主机的 IP 地址。Ping 目标主机的IP 地址看它是否响应,如下:
  
  ping IP_address
  使用 Ping 时应该执行以下步骤:
  
  Ping 环回地址验证是否在本地计算机上安装 TCP/IP 以及配置是否正确。
  ping 127.0.0.1
  
  Ping 本地计算机的 IP 地址验证是否正确地添加到网络。
  ping IP_address_of_local_host
  
  Ping 默认网关的 IP 地址验证默认网关是否运行以及能否与本地网络上的本地主机通讯。
  ping IP_address_of_default_gateway
  
  Ping 远程主机的 IP 地址验证能否通过路由器通讯。
  ping IP_address_of_remote_host
  
  Ping 命令用 Windows 套接字样式的名称解析将计算机名解析成 IP 地址,所以如果用地址成功,但是用名称 Ping 失败,则问题出在地址或名称解析上,而不是网络连通性的问题。详细信息,请参阅使用 Arp 解决硬件地址问题。
  
  如果在任何点上都无法成功地使用 Ping,请确认:
  
  安装和配置 TCP/IP 之后重新启动计算机。
  “Internet 协议 (TCP/IP) 属性”对话框“常规”选项卡上的本地计算机的 IP 地址有效而且正确。
  启用 IP 路由,并且路由器之间的链路是可用的。
  您可以使用 Ping 命令的不同选项来指定要使用的数据包大小、要发送多少数据包、是否记录用过的路由、要使用的生存时间 (TTL) 值以及是否设置“不分段”标志。可以键入 ping -? 查看这些选项。
  
  下例说明如何向 IP 地址 172.16.48.10 发送两个 Ping,每个都是 1,450 字节:
  
  C:>ping -n 2 -l 1450 172.16.48.10
  Pinging 172.16.48.10 with 1450 bytes of data:
  
  Reply from 172.16.48.10:bytes=1450 time<10ms TTL=32
  Reply from 172.16.48.10:bytes=1450 time<10ms TTL=32
  
  Ping statistics for 157.59.8.1:
  Packets:Sent = 2, Received = 2, Lost = 0 (0% loss),
  Approximate roundtrip times in milli-seconds:
  Minimum = 0ms, Maximum = 10ms, Average = 2ms
  默认情况下,在显示“请求超时”之前,Ping 等待 1,000 毫秒(1 秒)的时间让每个响应返回。如果通过 Ping 探测的远程系统经过长时间延迟的链路,如卫星链路,则响应可能会花更长的时间才能返回。可以使用 -w (等待)选项指定更长时间的超时。
  
  使用 Arp 解决硬件地址问题
  “地址解析协议 (ARP)”允许主机查找同一物理网络上的主机的媒体访问控制地址,如果给出后者的 IP 地址。为使 ARP 更加有效,每个计算机缓存 IP 到媒体访问控制地址映射消除重复的 ARP 广播请求。
  
  可以使用 arp 命令查看和修改本地计算机上的 ARP 表项。arp 命令对于查看 ARP 缓存和解决地址解析问题非常有用。
  
  详细信息,请参阅查看“地址解析协议 (ARP)”缓存和添加静态 ARP 缓存项目。
  
  使用 nbtstat 解决 NetBIOS 名称问题
  TCP/IP 上的 NetBIOS (NetBT) 将 NetBIOS 名称解析成 IP 地址。TCP/IP 为 NetBIOS 名称解析提供了很多选项,包括本地缓存搜索、WINS 服务器查询、广播、DNS 服务器查询以及 Lmhosts 和主机文件搜索。
  Nbtstat 是解决 NetBIOS 名称解析问题的有用工具。可以使用nbtstat 命令删除或更正预加载的项目:

  nbtstat -n 显示由服务器或重定向器之类的程序在系统上本地注册的名称。
  nbtstat -c 显示 NetBIOS 名称缓存,包含其他计算机的名称对地址映射。
  nbtstat -R 清除名称缓存,然后从 Lmhosts 文件重新加载。
  nbtstat -RR 释放在 WINS 服务器上注册的 NetBIOS 名称,然后刷新它们的注册。
  nbtstat -a name 对 name 指定的计算机执行 NetBIOS 适配器状态命令。适配器状态命令将返回计算机的本地 NetBIOS 名称表,以及适配器的媒体访问控制地址。
  nbtstat -S 列出当前的 NetBIOS 会话及其状态(包括统计),如下例所示:
  NetBIOS connection table
  
  Local name State In/out Remote Host Input Output
  ——————————————————————
  CORP1 <00> Connected Out CORPSUP1<20> 6MB 5MB
  CORP1 <00> Connected Out CORPPRINT<20> 108KB 116KB
  CORP1 <00> Connected Out CORPSRC1<20> 299KB 19KB
  CORP1 <00> Connected Out CORPEMAIL1<20> 324KB 19KB
  CORP1 <03> Listening
  使用 netstat 显示连接统计
  可以使用 netstat 命令显示协议统计信息和当前的 TCP/IP 连接。netstat -a 命令将显示所有连接,而 netstat -r 显示路由表和活动连接。netstat -e 命令将显示Ethernet 统计信息,而 netstat -s 显示每个协议的统计信息。如果使用 netstat -n,则不能将地址和端口号转换成名称。下面是 netstat 的输出示例:
  
  C:>netstat -e
  Interface Statistics
  
  Received Sent
  Bytes 3995837940 47224622
  Unicast packets 120099 131015
  Non-unicast packets 7579544 3823
  Discards 0 0
  Errors 0 0
  Unknown protocols 363054211
  
  C:>netstat -a
  
  Active Connections
  
  Proto Local Address Foreign Address State
  TCP CORP1:1572 172.16.48.10:nbsession ESTABLISHED
  TCP CORP1:1589 172.16.48.10:nbsession ESTABLISHED
  TCP CORP1:1606 172.16.105.245:nbsession ESTABLISHED
  TCP CORP1:1632 172.16.48.213:nbsession ESTABLISHED
  TCP CORP1:1659 172.16.48.169:nbsession ESTABLISHED
  TCP CORP1:1714 172.16.48.203:nbsession ESTABLISHED
  TCP CORP1:1719 172.16.48.36:nbsession ESTABLISHED
  TCP CORP1:1241 172.16.48.101:nbsession ESTABLISHED
  UDP CORP1:1025 *:*
  UDP CORP1:snmp *:*
  UDP CORP1:nbname *:*
  UDP CORP1:nbdatagram *:*
  UDP CORP1:nbname *:*
  UDP CORP1:nbdatagram *:*
  
  C:>netstat -s
  IP Statistics
  
  Packets Received = 5378528
  Received Header Errors = 738854
  Received Address Errors = 23150
  Datagrams Forwarded = 0
  Unknown Protocols Received = 0
  Received Packets Discarded = 0
  Received Packets Delivered = 4616524
  Output Requests = 132702
  Routing Discards = 157
  Discarded Output Packets = 0
  Output Packet No Route = 0
  Reassembly Required = 0
  Reassembly Successful = 0
  Reassembly Failures =
  Datagrams Successfully Fragmented = 0
  Datagrams Failing Fragmentation = 0
  Fragments Created = 0
  
  ICMP Statistics
  Received Sent
  Messages 693 4
  Errors 0 0
  Destination Unreachable 685 0
  Time Exceeded 0 0
  Parameter Problems 0 0
  Source Quenches 0 0
  Redirects 0 0
  Echoes 4 0
  Echo Replies 0 4
  Timestamps 0 0
  Timestamp Replies 0 0
  Address Masks 0 0
  Address Mask Replies 0 0
  
  TCP Statistics
  
  Active Opens = 597
  Passive Opens = 135
  Failed Connection Attempts = 107
  Reset Connections = 91
  Current Connections = 8
  Segments Received = 106770
  Segments Sent = 118431
  Segments Retransmitted = 461
  
  UDP Statistics
  
  Datagrams Received = 4157136
  No Ports = 351928
  Receive Errors = 2
  Datagrams Sent = 13809
  
  使用 tracert 跟踪网络连接
  Tracert(跟踪路由)是路由跟踪实用程序,用于确定 IP 数据报访问目标所采取的路径。Tracert 命令用 IP 生存时间 (TTL) 字段和 ICMP 错误消息来确定从一个主机到网络上其他主机的路由。
  
  Tracert 工作原理
  通过向目标发送不同 IP 生存时间 (TTL) 值的“Internet 控制消息协议 (ICMP)”回应数据包,    Tracert 诊断程序确定到目标所采取的路由。要求路径上的每个路由器在转发数据包之前至少将数据包上的 TTL 递减 1。数据包上的 TTL 减为 0 时,路由器应该将“ICMP 已超时”的消息发回源系统。
  
  Tracert 先发送 TTL 为 1 的回应数据包,并在随后的每次发送过程将 TTL 递增 1,直到目标响应或 TTL 达到最大值,从而确定路由。通过检查中间路由器发回的“ICMP 已超时”的消息确定路由。某些路由器不经询问直接丢弃 TTL 过期的数据包,这在Tracert 实用程序中看不到。
  
  Tracert 命令按顺序打印出返回“ICMP 已超时”消息的路径中的近端路由器接口列表。如果使用 -d 选项,则 Tracert 实用程序不在每个 IP 地址上查询 DNS。
  
  在下例中,数据包必须通过两个路由器(10.0.0.1 和 192.168.0.1)才能到达主机172.16.0.99。主机的默认网关是 10.0.0.1,192.168.0.0 网络上的路由器的 IP地址是 192.168.0.1。
  
  C:>tracert 172.16.0.99 -d
  Tracing route to 172.16.0.99 over a maximum of 30 hops
  1 2s 3s 2s 10,0.0,1
  2 75 ms 83 ms 88 ms 192.168.0.1
  3 73 ms 79 ms 93 ms 172.16.0.99
  Trace complete.
  用 tracert 解决问题
  可以使用 tracert 命令确定数据包在网络上的停止位置。下例中,默认网关确定 192.168.10.99 主机没有有效路径。这可能是路由器配置的问题,或者是 192.168.10.0 网络不存在(错误的 IP 地址)。
  
  C:>tracert 192.168.10.99
  
  Tracing route to 192.168.10.99 over a maximum of 30 hops
  
  1 10.0.0.1 reportsestination net unreachable.
  
  Trace complete.
  
  Tracert 实用程序对于解决大网络问题非常有用,此时可以采取几条路径到达同一个点。
  
  Tracert 命令行选项
  Tracert 命令支持多种选项,如下表所示。
  
  tracert [-d] [-h maximum_hops] [-j host-list] [-w timeout] target_name
  
  选项 描述
  -d 指定不将 IP 地址解析到主机名称。
  -h maximum_hops 指定跃点数以跟踪到称为 target_name 的主机的路由。
  -j host-list 指定 Tracert 实用程序数据包所采用路径中的路由器接口列表。
  -w timeout 等待 timeout 为每次回复所指定的毫秒数。
  target_name 目标主机的名称或 IP地址。
  
  详细信息,请参阅使用 tracert 命令跟踪路径。
  
  使用 pathping 测试路由器
  pathping 命令是一个路由跟踪工具,它将 ping 和 tracert 命令的功能和这两个工具所不提供的其他信息结合起来。pathping 命令在一段时间内将数据包发送到到达最终目标的路径上的每个路由器,然后基于数据包的计算机结果从每个跃点返回。由于命令显示数据包在任何给定路由器或链接上丢失的程度,因此可以很容易地确定可能导致网络问题的路由器或链接。某些选项是可用的,如下表所示。
  
  选项 名称 功能
  -n Hostnames 不将地址解析成主机名。
  -h Maximum hops 搜索目标的最大跃点数。
  -g Host-list 沿着路由列表释放源路由。
  -p Period 在 ping 之间等待的毫秒数。
  -q Num_queries 每个跃点的查询数。
  -w Time-out 为每次回复所等待的毫秒数。
  -T Layer 2 tag 将第 2 层优先级标记(例如,对于 IEEE 802.1p)连接到数据包并将它发送到路径中的每个网络设备。这有助于标识没有正确配置第 2 层优先级的网络设备。-T 开关用于测试服务质量 (QoS) 连通性。
  -R RSVP isbase Che检查以确定路径中的每个路由器是否支持“资源保留协议 (RSVP)”,此协议允许主机为数据流保留一定量的带宽。 -R 开关用于测试服务质量 (QoS) 连通性。
  
  默认的跃点数是 30,并且超时前的默认等待时间是 3 秒。默认时间是 250 毫秒,并且沿着路径对每个路由器进行查询的次数是 100。
  
  以下是典型的 pathping 报告。跃点列表后所编辑的统计信息表明在每个独立路由器上数据包丢失的情况。
  
  D:>pathping -n msw
  
  Tracing route to msw [7.54.1.196]
  over a maximum of 30 hops:
  0 172.16.87.35
  1 172.16.87.218
  2 192.68.52.1
  3 192.68.80.1
  4 7.54.247.14
  5 7.54.1.196
  
  Computing statistics for 125 seconds…
  Source to Here This Node/Link
  Hop RTT Lost/Sent = Pct Lost/Sent = Pct Address
  0 172.16.87.35
  0/ 100 = 0% |
  1 41ms 0/ 100 = 0% 0/ 100 = 0% 172.16.87.21813/ 100 = 13% |
  2 22ms 16/ 100 = 16% 3/ 100 = 3% 192.68.52.10/ 100 = 0% |
  3 24ms 13/ 100 = 13% 0/ 100 = 0% 192.68.80.1 0/ 100 = 0% |
  4 21ms 14/ 100 = 14% 1/ 100 = 1% 10.54.247.14 0/ 100 = 0% |
  5 24ms 13/ 100 = 13% 0/ 100 = 0% 10.54.1.196
  
  Trace complete.
  当运行 pathping 时,在测试问题时首先查看路由的结果。此路径与 tracert 命令所显示的路径相同。然后 pathping 命令对下一个 125 毫秒显示忙消息(此时间根据跃点计数变化)。在此期间,pathping 从以前列出的所有路由器和它们之间的链接之间收集信息。在此期间结束时,它显示测试结果。
  
  最右边的两栏 This Node/Link Lost/Sent=Pct 和 Address 包含的信息最有用。172.16.87.218(跃点 1)和 192.68.52.1(跃点 2)丢失 13% 的数据包。 所有其他链接工作正常。在跃点 2 和 4 中的路由器也丢失寻址到它们的数据包(如 This Node /Link 栏中所示),但是该丢失不会影响转发的路径。
  
  对链接显示的丢失率(在最右边的栏中标记为 |)表明沿路径转发丢失的数据包。该丢失表明链接阻塞。对路由器显示的丢失率(通过最右边栏中的 IP 地址显示)表明这些路由器的 CPU 可能超负荷运行。这些阻塞的路由器可能也是端对端问题的一个因素,尤其是在软件路由器转发数据包时。

  如今大家都是ADSL上网,当你查网费时就会发现,每次上网电信都会记录下你的网卡MAC地址,这是因为IP地址是动态的(每次上网都不同),而MAC地址却是不变的──每张网卡都有一个与众不同的MAC(物理)地址,因此MAC地址就成了客户的网上身份证,通过记录MAC地址,即可确认是你上的网!

  一、MAC地址的用途

  MAC地址在网卡中是固定的,每张网卡的MAC地址都不一样。网卡在制作过程中,厂家会在它的EPROM里面烧录上一组数字,这组数字,每张网卡都各不相同,这就是网卡的MAC(物理)地址。

  由于MAC地址的唯一性,因此它主要用来识别网络中用户的身份。例如ADSL上网时,电信用它来记费,确认是你上的网;在校园网中,MAC地址也可以用来识别用户。对于校园网的正式用户,其MAC地址会登记在服务器端,假如你是非法用户,服务器中就没有你的网卡MAC地址,这样当你试图连上网时,服务器就会立刻认出你、阻止你连上网络。

  二、MAC地址是可以修改的

  有些场合,例如冒充网络中的正式用户,就需要修改你的网卡MAC。要修改MAC地址,你可以通过硬件的方法实现,即利用网卡厂家提供的修改程序来烧录网卡的EEPROM,这样做虽然可行,但是风险很大、操作也复杂,即使你很有经验,也难免在操作中出现错误。

  其实你完全没必要用烧录方法、修改网卡中的MAC地址。要知道Windows安装的时候,会自动从网卡中读入MAC地址,把它存放在注册表中以备后用。当数据在网络中传输时,从网卡发出的数据包中要求有一个源MAC地址,这个MAC地址就是从注册表中读取的(并非从网卡中读取的),因此只要你修改了注册表中的MAC地址,就相当于改了网卡EEPROM中的MAC地址,两者实际效果是完全相同的!

  三、修改注册表中MAC的方法

  1、使用软件修改

  本方法适用于所有类型的网卡。在不同的Windows下,要用不同的软件修改MAC。

  (1)Win2003/XP/2000

  如果你的系统是Win2003/XP/2000,可以使用SMAC(下载地址http://www.klcconsulting.net/smac/#Download)。这款软件并不能修改网卡中的MAC地址,只能修改注册表中的MAC。

  该软件有两种运行模式,如果你启用了“Windows Management Instrumentation (WMI)”服务,软件即运行在[WBEM ON]模式下,可以显示更多的网卡信息,否则运行在[WBEM OFF]模式下,在软件窗口标题栏可看到当前运行模式。

  软件的使用非常简单,运行后点击“Refresh”,窗口中的列表框将显示网卡的类型、IP地址、Active MAC等,在下面六个输入框中输入你指定的MAC地址,然后点击右侧的“Update MAC”,即可修改完成;最后重启电脑使修改值生效。

  注意,试用版不能输入新的MAC地址,只能把MAC改成0C-0C-0C-0C-0C-01

  (2)Win98

  如果你的系统是Win98,建议使用“Mac扫描器”,这个工具可以修改注册表中的MAC地址,然后重启电脑使修改生效。

  2、在网卡属性中修改

  如果你的网卡采用了RealTek公司的RTL8139芯片,就可以在网卡属性中修改MAC,这样注册表中的MAC地址也会一同改变,方法如下:

  在Win2003/XP/2000中,点击菜单“开始”/设置/控制面板,双击“系统”,点击“硬件”/设备管理器,在设备管理器中展开“网络适配器”,右击要修改MAC地址的网卡,选择“属性”;点击“高级”选项卡,在“属性”下,选择点击Network Address项目(图2),在右侧“值”的下方,输入你要指定的MAC地址值(例如020202020202),注意要连续输入12个数字或字母(中间不要输入-);重新启动电脑后,修改即可生效。至于Win98下的MAC修改方法,与以上方法类似。
  如果修改之后,在Win2003/XP/2000 下,你又想把注册表中的MAC地址恢复成原样,可以选择“Network Address”项,将右边的值选择为“不存在”,再重新启动即可;在Win98下是选择“没有显示”。

  3、在注册表中修改

  对于非RTL8139芯片的网卡,你可以直接修改注册表中的MAC,注意:修改注册表前,要先备份注册表。

  (1)Win2003/XP/2000

  点击“开始”/运行,输入regedit打开注册表,定位到HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlClass{4D36E972-E325-11CE-BFC1-08002BE10318}000、0001、0002等主键下,查找DriverDesc的内容,了解网卡使用了哪个主键(例如0001),如果主键下有params项,则该主键也是网卡所使用的;

  例如网卡使用了0001主键,因此我们就选中它,在其右边建一个字符串项(名为NetworkAddress),双击该串,输入你指定的MAC地址值(注意应该是12位的连续数字或字母,其间没有-号);在0001下的NDIparams中添加一项子键(名为NetworkAddress),选择该子键,在其右边添加名为default的字符串,键值为修改后的MAC地址,与上面的数值相同;修改后重启生效。

  (2)Win98

  点击“开始”/运行,键入winipcfg选择你要修改的网卡,并记录下MAC地址值;然后点击“开始”/运行,输入regedit打开注册表,定位到HKEY_LOCAL_MACHINESystemCurrent ControlSetServicesClassNet,下面有“0000”、“0001”、“0002”等子键;从“0000”子键开始点击,依次查找子键下的“DriverDesc”键内容,直到找到刚才记录的MAC地址为止;

  例如网卡使用了0001主键,因此我们就选中它,在其右边新建一个串,名称为networkaddress,再双击该串,输入新的MAC地址值(注意应该是12位的连续数字或字母,其间没有-号);最后重启电脑使修改生效。

4、linux系统

  如果你的系统是linux,想修改系统中的MAC地址(例如改为020202020202),操作方法是:用#ifconfig eth0 down 先把网卡禁用,否则会报告系统忙,无法更改;然后再用ifconfig eth0 hw ether 020202020202 即可。

  如果你想永久修改系统中的MAC地址,可以这样操作:在/etc/rc.d/rc.local中加入以下三行(也可在/etc/init.d/network中添加以下三行)

  ifconfig eth0 down

  ifconfig eth0 hw ether 020202020202

  ifconfig eth0 up

  四、MAC地址改好了吗?

  如果你想知道系统中的MAC地址是否修改成功了,可以这样操作:重启电脑,在命令提示符下,输入IPconfig/all命令,于是Physical Address右边就会显示一个地址,你检查一下即可得知MAC是否修改成功了。

 

  首先提议:

  如果你是一个很容易遗忘的人,那么一定不要忘记在第一次设置密码的同时创建一张可以恢复Windows XP中的账户密码的启动盘,它可以让你免去格式化硬盘的烦恼。

  从“控制面板”中找到“用户账户”项,选中自己的账户进入如图所示的控制界面,我们可以看到左侧任务列表中有一项“阻止一个已忘记的密码”,点击后便可打开“忘记密码向导”,向导会提示插入一张格式化过的空白磁盘,操作过程中会让你输入该账户所使用的密码,很快便可以创建一张密码重设盘。

  以后,当我们忘记了账户密码的时候,在没有使用“欢迎屏幕”登录方式的情况下登录到Windows XP后,按下“Ctrl + Alt + Del”组合键,出现“Windows 安全”窗口,点击选项中“更改密码”按钮,出现更改密码窗口。这个窗口中,将当前用户的密码备份,点击左下角“备份”按钮,激活“忘记密码向导”,按照提示创建密码重设盘。

  如果在Windows XP的登录窗口输入了错误的密码,就会弹出“登录失败”窗口,如果你的确想不起来自己的密码是什么时,可点击“重设”按钮,启动密码重设向导,通过刚才所创建的密码重设盘,就可以用这张密码重设盘更改密码并启动系统。重新设定密码,登录Windows XP。

  “密码重设盘”的创建,含有一定的危险性,因为任何人都可以使用这一张“密码重设盘”来登录Windows XP,都可以以该用户的名义进入用户帐户,操作真正用户所能操作的一切,所以必须将“密码重设盘”保存在适当的地方,以防丢失或失泄密。

  方法1——利用“administrator”(此方法适用于管理员用户名不是“administrator”的情况)

  我们知道在安装Windows XP过程中,首先是以“administrator”默认登录,然后会要求创建一个新账户,以进入Windows XP时使用此新建账户登录,而且在Windows XP的登录界面中也只会出现创建的这个用户账号,不会出现“administrator”,但实际上该“administrator”账号还是存在的,并且密码为空。

  当我们了解了这一点以后,假如忘记了登录密码的话,在登录界面上,按住Ctrl+Alt键,再按住Del键二次,即可出现经典的登录画面,此时在用户名处键入“administrator”,密码为空进入,然后再修改“zhangbp”的口令即可。

  方法2——删除SAM文件(注意,此法只适用于WIN2000)

  Windows NT/2000/XP中对用户帐户的安全管理使用了安全帐号管理器(Security Account Manager , SAM)的机制,安全帐号管理器对帐号的管理是通过安全标识进行的,安全标识在帐号创建时就同时创建,一旦帐号被删除,安全标识也同时被删。安全标识是唯一的,即使是相同的用户名,在每次创建时获得的安全标识完全不同。因此,一旦某个帐号被用户名重建帐号,也会被赋予不同的安全标识,不会保留原来的权限。安全帐号管理器的具体表现就是%SystemRoot%system32configsam文件。SAM文件是Windows NT/2000/XP的用户帐户数据库,所有用户的登录名以及口令等相关信息都会保存在这个文件中。

  知道了这些,我们的解决办法也产生了:删除SAM文件,启动系统,它会重建一个干净清白的SAM,里面自然没有密码了。

  不过,这么简单的方法在XP是不适用的,可能微软以此为BUG,做了限制……所以现在在XP系统下,即使你删除了SAM,还是不能删除密码,反而会使系统启动初始化出错,从而进入死循环而不能进系统!!

  方法3——从SAM文件中找密码(前提……会使用DOS基本命令就行)

  在系统启动前,插入启动盘,进入:C:WINNTSystem3Config 用COPY命令将SAM文件复制到软盘上。拿到另一台机子读取。这里需要的工具是LC4,运行LC4,打开并新建一个任务,然后依次击“IMPORT→Import from SAM file”,打开已待破解的SAM文件,此时LC4会自动分析此文件,并显示出文件中的用户名;之后点击“Session→Begin Audit”,即可开始破解密码。如果密码不是很复杂的话,很短的时间内就会得到结果。

  不过,如果密码比较复杂的话,需要时间会很长,这时我们就需要用下面的方法了。

  方法4——用其他SAM文件覆盖(前提是你可以得到另外一台电脑的SAM文件和它的密码……个人觉得是最为可行的办法)

  1——如上所说,SAM文件保存着登录名以及口令,那么我们只要替换SAM文件就是替换登录名以及口令了。不过,这个替换用的SAM文件的“产地”硬盘分区格式要和你的系统一样(看是FAT32还是NTFS,你自己确认)。最好这个“产地”的系统没有设密码,安全方面设置没动过(实际上很大部分的个人电脑都是这样),当然,比较保险的方式是把XP的[Win NTSystem 32Config]下的所有文件覆盖到[C:Win NTSystem 32Config]目录中(假设你的XP安装在默认分区C:),

  2——如果得不到别人的帮助(我是说“万一”),你可以在别的分区上在安装一个XP系统,硬盘分区格式要和原来的一样,并且请你注意一定不要和原来的XP安装在同一分区!在开始之前,一定要事先备份引导区MBR,备份MBR的方法有很多,使用工具软件,如杀毒软件KV3000等。装完后用Administrator登陆,现在你对原来的XP就有绝对的写权限了,你可以把原来的SAM考下来,用10PHTCRACK得到原来的密码。也可以把新安装的XP的Win NTSystem 32Config下的所有文件覆盖到C:Win NTSystem 32Config目录中(架设原来的XP安装在这里),然后用KV3000恢复以前悲愤的主引导区MBR,现在你就可以用Administrator身份登陆XP了。

  [2号方案我自己都觉得麻烦,还是1号:叫别人帮忙比较好……]

  【另外,据说C:windows epair 目录下的SAM是原始版本的,可以用它来覆盖 system32下的这个 SAM,这样就可以删除现在的密码,而恢复到刚开始安装系统时的密码了。如果这个密码为空,岂不是…… 】

  方法5——使用Win 2000安装光盘引导修复系统(前提……很明显吧?就是你要有一张Win 2000安装光盘)

  使用Win 2000安装光盘启动电脑,在Wndows2000安装选择界面选择修复Windows 2000(按R键);,然后选择使用故障控制台修复(按C键),系统会扫描现有的Window2000/XP版本。一般只有一个操作系统,所以只列出了一个登录选择(l:C:Windows)。从键盘上按l,然后回车,这个时候,Window XP并没有要求输人管理员密码,而是直接登录进入了故障恢复控制台模式(如果使用的是Windows XP安装光盘启动的,那是要求输人管理员密码的。这里指的管理员是指系统内建的Administraor账户)熟悉Windows的朋友都知道,故障恢复控制台里面可以进行任何系统级别的操作,例如:复制、移动、删除文件,启动、停止服务,甚至格式化、重新分区等破坏性操作。

  测试使用光盘:集成SP3的Windows 2000 Proessional 简体中文版。

  测试通过的系统:Windows XP Proessional,打SPI补丁的Windows XP (FAT32和NTFS文件系统都一样)

  [需要注意的是,由于各种原因,市面上的一些Windows 2000安装光盘不能够显现故障控制台登录选项,所以也无法利用这个漏洞。同时,由于故障控制台模式本身的限制,也无法从网络上利用这个漏洞,换句话说,这个漏洞仅限于单机。]

  方法6——利用NET命令(有两个必要前提才行:按装WINDOWS XP的分区必须采用FAT 32文件小系统,用户名中没有汉字。)

  我们知道在Windows XP中提供了“net user”命令,该命令可以添加、修改用户账户信息,其语法格式为:

  net user [UserName [Password   *] [options]] [/domain]

  net user [UserName {Password   *} /add [options] [/domain]

  net user [UserName [/delete] [/domain]]

  每个参数的具体含义在Windows XP帮助中已做了详细的说明,在此笔者就不多阐述了。好了,我们现在以恢复本地用户“zhangbq”口令为例,来说明解决忘记登录密码的步骤:

  1、重新启动计算机,在启动画面出现后马上按下F8键,选择“带命令行的安全模式”。

  2、运行过程结束时,系统列出了系统超级用户“administrator”和本地用户“zhangbq”的选择菜单,鼠标单击“administrator”,进入命令行模式。

  3、键入命令:“net user zhangbq 123456 /add”,强制将“zhangbq”用户的口令更改为“123456”。若想在此添加一新用户(如:用户名为abcdef,口令为123456)的话,请键入“net user abcdef 123456 /add”,添加后可用“net localgroup administrators abcdef /add”命令将用户提升为系统管理组“administrators”的用户,并使其具有超级权限。

  4、重新启动计算机,选择正常模式下运行,就可以用更改后的口令“123456”登录“zhangbq”用户了。另外,zhangbq 进入 登入後在〔控制台〕→〔使用者帐户〕→选忘记密码的用户,然後选〔移除密码〕後〔等出〕 在登入画面中选原来的用户便可不需密码情况下等入 (因已移除了) 删除刚才新增的用户,在〔控制台〕→〔使用者帐户〕→选〔alanhkg888〕,然後选〔移除帐户〕便可

  [但是有人提出:在实验后得知——在安全模式命令符下新建的用户不能进入正常模式(此结论暂不确认)]

  方法7——用破解密码软件(前提是你要有标准的系统安装光盘——不是那种“集成”多个系统的D版盘)

  1——使用PASSWARE KIT 5.0中的Windows KEY 5.0,用于恢复系统管理员的密码,运行后生成3个文件:TXTSETUP.OEM、WINKEY.SYS和WINKEY.INF,3个文件共50KB。把这3个文件放在任何软盘中,然后使用XP安装光盘启动电脑,启动过程中按F6键让系统采用第三方驱动程序。此时,正是我们切入的最好时机,放入该软盘就会自动跳到Windows KEY的界面。他会强行把ADMINISTRATOR的密码换成12345,如此一来何愁大事不成?嗬嗬!当你重新启动以后,你会被要求再次修改你的密码。

  2——使用OFFICE NT PASSWORD & REGISTRY EDITOR.用该软件可以制作LINUX启动盘,这个启动盘可以访问NTFS文件系统,因此可以很好地支持Windows 2000/XP。使用该软盘中的一个运行在LINUX下的工具NTPASSWD就可以解决问题,并且可以读取注册表并重写账号。使用方法很简单,只需根据其启动后的提示一步一步做就可以了。在此,建议你使用快速模式,这样会列出用户供你选择修改那个用户密码。默认选择ADMIN组用户,自动找到把ADMINISTRATOR的名字换掉的用户,十分方便。

  3——ERD.Commander2003为Windows的管理员和最终用户,面对随时可能崩溃的系统,可能每人都会有自己的一套工具,用来挽救数据和修复系统。ERD Commander这可以算是Winternals Administrators Pak工具中最强大的组件了,其中一个引人注目的功能就是修改密码,Windows NT/2000/XP/2003 系统中任何一个用户的密码都可以在不知道原先密码的情况下被ERD修改掉。

  方法8——修改屏幕保护程序(前提是你有设置屏保)

  使用NTFSDOS这个可以从DOS下写NTFS分区的工具。用该软件制作一个DOS启动盘,然后到C:Win NTSystem 32下将屏幕保护程序Logon.Scr改名,接着拷贝Command.com到C:Win NTSystem 32下(WIN2000下可以用CMD.EXE),并将该文件改名为Logon.Scr。这样启动机器15分钟以后,本该出现的屏幕保护现在变成了命令行模式,而且是具有ADMINISTRATOR权限的,通过他就可以修改密码或者添加新的管理员账号了。改完以后不要忘了把屏幕保护程序的名字改回去。

  方法9——使用启动脚本(前提……会使用DOS基本命令就行)

  Windows XP启动脚本(startup scripts)是计算机在登录屏幕出现之前运行的批处理文件,它的功能类似于Windows 9×和DOS中的自动执行批处理文件autoexec.bat。利用这个特性,可以编写一个批处理文件重新设置用户密码,并将它加入启动脚本中,这样就达到了目的。以下是具体步骤(假设系统目录为C:Windows)。

  1.使用Windows98启动盘启动电脑。在DOS下新建一个文件叫a.bat,内容只需要一条“net user”命令即可:“Net user rwd 12345678”。这条命令的意思是将用户rwd的密码设置为“12345678”(有关Net命令的用法,可参考Windows帮助)。然后将文件a.bat保存到“C:windowssystem32GroupPolicyMachineScriptsStartup”下。

  2.编写一个启动/关机脚本配置文件scripts.ini,这个文件名是固定的,不能改变。内容如下:

  [Startup]

  0CmdLine=a.bat

  0Parameters=

  3.将文件scripts.ini保存到“C:winntsystem32GroupPolicyMachineScripts”下。scripts.ini保存着计算机启动/关机脚本的设置数据,文件内容通常包含两个数据段:[Startup]和[Shutdown]。[Startup]数据段下是启动脚本配置,[Shutdown]数据段下是关机脚本配置。每个脚本条目被分成脚本名和脚本参数两部分存储,脚本名保存在XCmdLine关键字下,参数保存在XParameters关键字下,这里的X表示从0开始的脚本序号,以区别多个脚本条目和标志各脚本条目的运行顺序。

  4.取出Windows 98启动盘,重新启动电脑,等待启动脚本运行。启动脚本运行结束后用户rwd的密码就被恢复为“12345678”。

  5.登录成功后删除上述步骤建立的两个文件。

  [实际上你可以借用另一台电脑用“记事本”编写a.bat和scripts.ini,再用软盘通过DOS复制到自己的电脑上]

  说明:

  以上脚本使用的是FAT32文件系统,如果使用NTFS文件系统,可以将这块硬盘以从盘模式挂接到其它能识别NTFS文件系统(如Windows 2000或Windows XP)的计算机上进行上述操作。本方法可以恢复管理员(Administrator)的密码。对Windows2000系统中本地计算机用户和域用户的密码恢复同样有效。

  数据库命令执行时使用Command对象。Command类有三种:SqlCommand、OleDbCommand与OdbcCommand。

  Command对象主要用来运行SELECT、INSERT、UPDATE或DELETE之类的SQL语句。Command对象还可以调用存储过程或从特定表中取得记录。

  DataReader对象主要是用来读取数据结果,使用它读取记录时通常比从DataSet更快。DataReader类有三种:SqlDataReader、OleDbDataReader和OdbcDataReader。DataReader对象用Commmand对象从数据库中读取记录,并且DataReader对象只能向前的读取记录,用于在某些情况下替代DataSet对象(DataSet对象可以存储数据库中的行拷贝,可以在切断数据库的连接时处理这个拷贝,我们将在以后的章节中详细介绍该对象)。

  注意:不能用DataReader修改数据库中的记录,它是采用向前的,只读的方式读取数据库。

  SqlCommand类

  SqlCommand对象用于对Sql Server数据库执行命令。OleDbCommand对象用于对支持OleDb的数据库执行命令,如Oracle与Access。OdbcCommand对象用于对支持Odbc的数据库执行命令。尽管SqlCommand类是针对Sql Server的,但是这个类的许多属性、方法与事件和OleDbCommand及OdbcCommand等类相似。本章将重点讲解SqlCommand特定的属性与方法,其他的Command类你可以参考相应的帮助文档。

  注意:使用不同的Command对象需要导入不同的命名空间。OleDbCommand的命名空间为System.Data.OleDb。SqlCommand的命名空间为System.Data.SqlClient。OdbcCommand的命名空间为System.Data.Odbc。

  SqlCommand属性:

属性 说明
CommandText 其返回类型为string, 获取或设置要对数据源执行的 SQL 语句、存储过程或表。
CommandTimeOut 其返回类型为int,获取或设置在终止执行命令的尝试并生成错误之前的等待时间。
CommandType 其返回类型为CommandType,读取或设置表示CommandText属性将如何被解释的值,其有效的值可以为CommandType.Text、CommandType.StoredProcedur与CommandType.TableDirect,分别表示SQL语句、存储过程调用或要读取的表,默认为Text。
Connection 其返回类型为string, 获取或设置 SqlCommand 的此实例使用的 SqlConnection。
Parameters 其返回类型为SqlParameterCollection,取得提供给命令的参数(如有)。

  SqlCommand方法:

方法 说明
Cancle() 其返回类型为void,取消命令的执行
CreateParameter() 其返回类型为SqlParameter, 用于创建 SqlParameter 对象的新实例。
ExecuteNonQuery() 其返回类型为int,执行不返回结果集的Sql语句,包括INSERT、UPDATE与DELETE语句、DDL语句和不返回结果集的存储过程调用。返回的int值是命令影响的数据库行数。
ExecuteReader() 其返回类型为SqlDataReader, 执行SELECT语句、TableDirect命令或返回结果集的存储过程调用。在SqlDataReader对象中返回结果集。
ExecuteScalar() 其返回类型为object,执行返回单个值的SELECT语句(任何其他的值将被忽略)。这个命令结果作为对象被返回。
ExecuteXmlReader() 其返回类型为XmlReader,执行返回XML数据的SELECT语句,用XmlReader对象返回结果集,只适用于SqlCommand类

 

      生成SqlCommand对象

  我们可以用构造函数生成SqlCommand对象,也可以调用SqlConnection对象的CreateCommand()方法生成SqlCommand对象,下面分别介绍这两种方法。

  用构造函数生成SqlCommand对象

  SqlCommand对象的构造函数如下所示:

SqlCommand()
SqlCommand(string commandText)
SqlCommand(string commandText,SqlConnection mySqlConnection)

  程序代码说明:在上述语法范例的程序代码中,commandText包含SQL语句、存储过程调用或要读取的表。mySqlConnection是对应的SqlConnection对象。

  在使用SqlCommand对象之前,首先要确定一个SqlConnection对象,用于和SQL Server数据库进行数据传递。

mySqlConnection.ConnectionString="server=localhost;database=Northwind;
integrated security=SSPI";

  然后可以用下列语句生成新的SqlCommand对象:

SqlCommand mySqlCommand=new SqlCommand();

  再将mySqlCommand对象的Connection属性设置为mySqlConnection:

mySqlCommand.Connection= mySqlConnection;

  这样mySqlCommand对象就可以使用mySqlConnection与数据库进行数据传递。现在,Command对象的CommandType属性确定要执行的命令类型。可以用System.Data.CommandType枚举值指定CommandType属性。
CommandType的枚举值如下表所示:

数值 说明
Text 表示命令是SQL语句,默认值是Text
StoredProcedure 表示命令是储存过程调用
TableDirect 表示被读取的行和列的表名。注意:SqlCommand对象不支持TableDirect,要使用其他的Command类的对象。

  例如你可以采用如下的形式执行一个SQL查询:

SqlCommand mySqlCommand=new SqlCommand();
mySqlCommand.Connection=mySqlConnection;
mySqlCommand.CommandText=”SELECT * FROM Employees”;
//mySqlCommand.CommandType=CommandType.Text;

  程序代码说明:在上述语法范例的程序代码中,我们设置了mySqlCommand对象的commandText为一个SELECT查询语句,并且指定了mySqlCommand对象的CommandType属性为CommandType.Text,表示命令是SQL语句。由于CommandType.Text是默认的CommandType值,所以我们可以将其注译掉。

  还有一个更具效率的形式,那就是使用SqlCommand对象的其中一种构造函数:

SqlCommand mySqlCommand=new SqlCommand(”SELECT * FROM Employees”,myConnection);

  程序代码说明:在上述语法范例的程序代码中,我们可以直接利用SqlCommand(string commandText,SqlConnection mySqlConnection) 构造函数,从而使得程序代码更加的简练和直观。

  还可以使用储存过程来查询所需要的数据,我们可以采用如下的代码形式:

SqlCommand mySqlCommand=new SqlCommand(”GetEmpolyees”,myConnection);
mySqlCommand.CommandType=CommandType.StoredProcedure;

  程序代码说明:在上述语法范例的程序代码中,GetEmpolyees为一个储存过程名,用来实现所有的雇员信息查询。并且将CommandType值指定为StoredProcedure,表示命令是储存过程调用。

  使用CreateCommand()方法生成SqlCommand对象

  如果不用构造函数,也可以使用SqlConnection对象的CreateCommand()方法生成SqlCommand对象。这个方法返回新的SqlCommand对象。例如:

SqlCommand mySqlCommand=mySqlConnection.CreateCommand();

SqlDataReader类

  可以用SqlDataReader类对象从SQL Server数据库中读取行;用OleDbDataReader类对象从支持OLE DB的数据库中读行,如Oracle与Access;用OdbcDataReader类对象从支持ODBC的数据库中读取行。

  DataReader对象允许你以向前的,只读的方式读取数据,有时候DataReader对象也称为消软管游标。DataReader对象采用了一种简化的数据读取方式,但是提高了性能的同时也牺牲了很多特性。例如在DataSet中支持的排序,分页等功能。这些功能将在以后的章节进行详细的介绍。

  SqlDataReader的属性

属性 说明
Depth 其返回类型为int,取得表示当前行嵌入深度的值
FieldCount 其返回类型为int,取得当前行的列数
IsColsed 其返回类型为bool,取得一个布尔值,表示是否关闭数据读取
RecordsAffected 其返回类型为int, 取得执行SQL语句增加、修改或删除的行数。

  SqlDataReader的方法

方法 说明
Reader() 其返回类型为bool,将数据阅读器移到结果集的下一行并读取该行。这个方法返回的布尔值表示结果集中是否有多行
GetValue() 其返回类型为object, 返回指定列的值
GetValues() 其返回类型为int,将当前行中所有列的值复制到指定对象数组。这个方法返回的int是数组元素的个数
NextResult() 其返回类型为bool,将数据阅读器移到结果集的下一行。这个方法返回的布尔值表示结果集中是否有多行
Close() 关闭 SqlDataReader 对象
GetInt32(),GetChar(),
GateDataTime(),Get×××()
返回指定列的值,并且返回的类型为相应的数据类型。例如GetInt32()返回整型的数值。注意,如果你将返回值赋予一个类型不匹配的变量时,将会抛出一个InvalidCastException异常

   用ExecuteReader()方法执行查询

  下面是一个用ExecuteReader()方法执行SELECT语句的范例。这个方法用DataReader对象返回结果集,然后可以用此对象读取数据库返回的行。

  范例程序代码如下:

01 public partial class _Default : System.Web.UI.Page
02 {
03  protected void Page_Load(object sender, EventArgs e)
04  {
05   string connectionString =
06 ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
07   SqlConnection con = new SqlConnection(connectionString);
08   string sql = "SELECT top 5 CustomerID,CompanyName,ContactName,Address
09          FROM Customers";
10   SqlCommand cmd = new SqlCommand(sql, con);
11   con.Open();
12   SqlDataReader reader = cmd.ExecuteReader();
13   StringBuilder htmlStr = new StringBuilder("");
14   while (reader.Read())
15   {
16    htmlStr.Append("CustomerID:" + reader["CustomerID"] + "<br>");
17    htmlStr.Append("CompanyName:" + reader["CompanyName"] + "<br>");
18    htmlStr.Append("ContactName:" + reader.GetString(2) + "<br>");
19    htmlStr.Append("Address:" + reader.GetString(3) + "<br>");
20    htmlStr.Append("<hr>");
21   }
22   reader.Close();
23   con.Close();
24   HtmlContent.Text = htmlStr.ToString();
25  }
26 }

  程序代码说明:在上述语法范例的程序代码中,第5到12行代码生成所要的对象并执行SELECT语句,从Customers表中读取前5条记录。cmd返回的结果集存放在reader对象中,然后你可以用Reader()方法读取reader对象的记录。这个方法在有另一个可读的行时返回布尔真值,否则返回布尔假值。可以从reader对象中读取一个记录的各个列值,只要在方括号中传入列名即可。如第16和17行所示,我们用reader[“CustomerID”]读取CustomerID列的各项内容。你也可以直接在方括号中传入数字值指定想要列的索引。如第18和19行代码所显示,由于我们在用SELECT进行数据查询的时,ContactName和Address分别位于第3和第4列,而相应的索引值则为2和3,所以我们可以用reader.GetString(2)和reader.GetString(3)读取ContactName和Address列的数据。如第14行代码所示,我们可以在While循环中用Reader()方法一一读取每条记录。

  执行结果:

附件:wrx298kd8j.png(11780 Byte)

      每次程序执行命令时,都要将相应的命令通过网络传递到数据库中,并在数据库进行执行,然后将结果返回到程序中,从而产生大量的网络通信流。我们可以使用ExecuteReader()方法同时执行多条SELECT语句查询减少重复的数据传递。

  下面的实例是使用ExecuteReader()方法同时查询三个表中的数据,并将返回的三个结果集显示在页面上。

  范例程序代码如下:

01 public partial class _Default : System.Web.UI.Page
02 {
03  protected void Page_Load(object sender, EventArgs e)
04  {
05   string connectionString =
06 ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
07   SqlConnection con = new SqlConnection(connectionString);
08   SqlCommand cmd = con.CreateCommand();
09   cmd.CommandText = "SELECT TOP 3 ProductID,ProductName
10   FROM Products ORDER BY ProductID;" +
11    "SELECT TOP 3 CustomerID,CompanyName
12    FROM Customers ORDER BY CustomerID;" +
13     "SELECT TOP 3 OrderID,CustomerID
14     FROM Orders ORDER BY OrderID;";
15   con.Open();
16   SqlDataReader reader = cmd.ExecuteReader();
17   StringBuilder htmStr=new StringBuilder("");
18   int i = 0;
19   do
20   {
21    htmStr.Append("结果集");
22    htmStr.Append(i.ToString());
23    htmStr.Append("<br>");
24    while (reader.Read())
25    {
26     htmStr.Append("reader[0]=" + reader[0]);
27     htmStr.Append("<br>");
28     htmStr.Append("reader[1]=" + reader[1]);
29     htmStr.Append("<br><br>");
30    }
31    htmStr.Append("<hr>");
32    i++;
33   } while (reader.NextResult());
34   reader.Close();
35   con.Close();
36   HtmlContent.Text = htmStr.ToString();
37  }
38 }

  程序代码说明:在上述语法范例的程序代码中,第9行到第14中定义了3个查询语句,各语句之间用分号进行间隔。第16行调用ExecuteReader()方法,并返回SqlDataReader对象,并且对三条不同的SELECT语句各返回一个结果集。要读取第一个结果集的话,可以用SqlDataReader对象的Reader()方法。Reader()方法在没有其他的可读行时将返回一个false值。当一个结果集的所有记录都读取完毕后,可以调用SqlDataReader对象的NextResult()方法,然后在读取下一个结果集,在没有其他的结果集时,也返回一个false值。

  提示:外循环do…while测试结尾的reader. NextResult()的返回值。由于do…while循环末尾检测这个条件,这样就保证了do…while循环至少执行一次。之所以在末尾才调用NextResult()方法,是因为这样可以首先把SqlDataReader对象移到下一个结果集,然后才返回表示是否还有下一个结果集的布尔结果。如果使用while循环中,则有可能直接跳过第一个结果集,从而产生错误。

81d4kg6g51.png

    用ExecuteScalar()方法执行SELECT语句

  用ExecuteScalar()方法执行SELECT语句,返回单个值,并且忽略其他的任何读取的结果。ExecuteScalar()方法返回的结果是一个object对象。ExecuteScalar()主要是用来执行SELECT语句,或者执行包括聚合函数的SQL语句。

  下面我们将使用如下的程序读取Products表中的记录条数,并且在相应的查询语句中使用COUNT()聚合函数。

  范例程序代码如下:

01 public partial class _Default : System.Web.UI.Page
02 {
03  protected void Page_Load(object sender, EventArgs e)
04  {
05   string connectionString =
06    ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
07   SqlConnection con = new SqlConnection(connectionString);
08   SqlCommand cmd = con.CreateCommand();
09   cmd.CommandText = "SELECT COUNT(*) FROM Products";
10   con.Open();
11   int returnValue = (int)cmd.ExecuteScalar();
12   HtmlContent.Text = "Products表中共有" + returnValue.ToString()+"条记录";
13  }
14 }

  程序代码说明:在上述语法范例的程序代码中,第9行即为查询Products表中的记录条数的SQL语句。第11行代码用ExecuteScalar()方法执行SELECT语句。注意,由于ExecuteScalar()方法的结果为object对象,因此我们要将其进行强制类型转换,再赋予相应的变量。

  执行结果:

3iw32u28xs.png

  我们经常会遇到批量上传的问题,也会遇到将某个目录下所有文件都上传到服务器上的问题。那么,如何解决此类问题呢?以前的技术一般采用ActiveX等方式,这里笔者采用SharpZlib来实现,听说VS2005已有压缩和解压缩的解决方案,笔者还没有时间用VS2005,所以就只好使用VS2003 + SharpZlib来解决问题了。

  1、首先从这里下载0.84版本的SharpZlib源码及示例码。
  2、下载下来之后你发现它没有VS2003的解决方案文件,没有关系。你可以自己建立,首先新建一个ZipUnzip的解决方案,然后,将上面经过解压缩之后的所有文件及目录COPY到你的解决方案所在的目录下。
  3、在VS2003解决方案资源管理器(一般是在右上方中部点的位置)中点击显示所有文件按钮,然后可以见到很多“虚”的图标、文件及文件夹等,可以一次选择它们,然后包含进项目中。
  4、编译,最好使用Release选项,编译完成之后你可以在inRelease看到ZipUnzip.dll的类了。如果你编译时报错,说什么AssemblyKeyFile之类的,你可以使用强命名工具新建一个,也可以将AssemblyInfo.cs中[assembly: AssemblyKeyFile("。。。。。")]改成:[assembly: AssemblyKeyFile("")] (不推荐这样做)。
  5、新建一个WEBFORM项目,添加ZipUnzip.dll类的引用,然后添加如下文件及内容:

// ——————————————
// 1. AttachmentUnZip.cs
// ——————————————
using System;
using System.IO;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.GZip;
using ICSharpCode.SharpZipLib.BZip2;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip.Compression;
using ICSharpCode.SharpZipLib.Zip.Compression.Streams;

namespace WebZipUnzip
{
public class AttachmentUnZip
{
public AttachmentUnZip()
{
}
public static void UpZip(string zipFile)
{
string []FileProperties=new string[2];
FileProperties[0]=zipFile;//待解压的文件
FileProperties[1]=zipFile.Substring(0,zipFile.LastIndexOf("\")+1);//解压后放置的目标目录
UnZipClass UnZc=new UnZipClass();
UnZc.UnZip(FileProperties);
}
}
}

// ———————————————
// 2. UnZipClass.cs
// ———————————————

using System;
using System.IO;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.GZip;
using ICSharpCode.SharpZipLib.BZip2;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip.Compression;
using ICSharpCode.SharpZipLib.Zip.Compression.Streams;

namespace WebZipUnzip
{
public class UnZipClass
{
///
/// 解压文件
///
/// 包含要解压的文件名和要解压到的目录名数组
public void UnZip(string[] args)
{
ZipInputStream s = new ZipInputStream(File.OpenRead(args[0]));
try
{
ZipEntry theEntry;
while ((theEntry = s.GetNextEntry()) != null)
{
string directoryName = Path.GetDirectoryName(args[1]);
string fileName = Path.GetFileName(theEntry.Name);

//生成解压目录
Directory.CreateDirectory(directoryName);

if (fileName != String.Empty)
{
//解压文件到指定的目录
FileStream streamWriter = File.Create(args[1]+fileName);

int size = 2048;
byte[] data = new byte[2048];
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
streamWriter.Write(data, 0, size);
}
else
{
break;
}
}

streamWriter.Close();
}
}
s.Close();
}
catch(Exception eu)
{
throw eu;
}
finally
{
s.Close();
}

}//end UnZip
public static bool UnZipFile(string file, string dir)
{
try
{
if (!Directory.Exists(dir))
Directory.CreateDirectory(dir);
string fileFullName = Path.Combine(dir,file);
ZipInputStream s = new ZipInputStream(File.OpenRead( fileFullName ));

ZipEntry theEntry;
while ((theEntry = s.GetNextEntry()) != null)
{
string directoryName = Path.GetDirectoryName(theEntry.Name);
string fileName = Path.GetFileName(theEntry.Name);

if (directoryName != String.Empty)
Directory.CreateDirectory( Path.Combine(dir, directoryName));

if (fileName != String.Empty)
{
FileStream streamWriter = File.Create( Path.Combine(dir,theEntry.Name) );
int size = 2048;
byte[] data = new byte[2048];
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
streamWriter.Write(data, 0, size);
}
else
{
break;
}
}

streamWriter.Close();
}
}
s.Close();
return true;
}
catch (Exception)
{
throw;
}
}

}//end UnZipClass
}
// ———————————————-
// 3. ZipClass.cs
// ———————————————-
using System;
using System.IO;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.GZip;
using ICSharpCode.SharpZipLib.BZip2;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip.Compression;
using ICSharpCode.SharpZipLib.Zip.Compression.Streams;

namespace WebZipUnzip
{
///
/// 压缩文件
///
public class ZipClass
{
public void ZipFile(string FileToZip, string ZipedFile ,int CompressionLevel, int BlockSize,string password)
{
//如果文件没有找到,则报错
if (! System.IO.File.Exists(FileToZip))
{
throw new System.IO.FileNotFoundException("The specified file " + FileToZip + " could not be found. Zipping aborderd");
}

System.IO.FileStream StreamToZip = new System.IO.FileStream(FileToZip,System.IO.FileMode.Open , System.IO.FileAccess.Read);
System.IO.FileStream ZipFile = System.IO.File.Create(ZipedFile);
ZipOutputStream ZipStream = new ZipOutputStream(ZipFile);
ZipEntry ZipEntry = new ZipEntry("ZippedFile");
ZipStream.PutNextEntry(ZipEntry);
ZipStream.SetLevel(CompressionLevel);
byte[] buffer = new byte[BlockSize];
System.Int32 size =StreamToZip.Read(buffer,0,buffer.Length);
ZipStream.Write(buffer,0,size);
try
{
while (size < StreamToZip.Length)
{
int sizeRead =StreamToZip.Read(buffer,0,buffer.Length);
ZipStream.Write(buffer,0,sizeRead);
size += sizeRead;
}
}
catch(System.Exception ex)
{
throw ex;
}
ZipStream.Finish();
ZipStream.Close();
StreamToZip.Close();
}
public void ZipFileMain(string[] args)
{
//string[] filenames = Directory.GetFiles(args[0]);
string[] filenames = new string[]{args[0]};

Crc32 crc = new Crc32();
ZipOutputStream s = new ZipOutputStream(File.Create(args[1]));

s.SetLevel(6); // 0 – store only to 9 – means best compression

foreach (string file in filenames)
{
//打开压缩文件
FileStream fs = File.OpenRead(file);
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
ZipEntry entry = new ZipEntry(file);

entry.DateTime = DateTime.Now;

// set Size and the crc, because the information
// about the size and crc should be stored in the header
// if it is not set it is automatically written in the footer.
// (in this case size == crc == -1 in the header)
// Some ZIP programs have problems with zip files that don‘t store
// the size and crc in the header.
entry.Size = fs.Length;
fs.Close();

crc.Reset();
crc.Update(buffer);

entry.Crc = crc.Value;

s.PutNextEntry(entry);

s.Write(buffer, 0, buffer.Length);

}
s.Finish();
s.Close();
}
}
}
// ———————————————
// 4. WebForm1.aspx
// ———————————————
<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="WebZipUnzip.WebForm1" %>&nbsp;
<META content="Microsoft Visual Studio .NET 7.1" name=GENERATOR>
<META content=C# name=CODE_LANGUAGE>
<META content=JavaScript name=vs_defaultClientScript>
<META content=http://schemas.microsoft.com/intellisense/ie5 name=vs_targetSchema>
<FORM id=Form1 method=post runat="server"><?xml:namespace prefix = asp /><asp:Button id=Button1 style="Z-INDEX: 101; LEFT: 56px; POSITION: absolute; TOP: 64px" runat="server" Text="压缩"></asp:Button><asp:Button id=Button2 style="Z-INDEX: 102; LEFT: 112px; POSITION: absolute; TOP: 64px" runat="server" Text="解压"></asp:Button><INPUT id=File1 style="Z-INDEX: 103; LEFT: 32px; POSITION: absolute; TOP: 24px" type=file name=File1 runat="server"> </FORM></BODY></HTML>
//——————————————-
// 5.WebForm1.aspx.cs
//——————————————-

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace WebZipUnzip
{
///
/// Summary description for WebForm1.
///
public class WebForm1 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Button Button1;
protected System.Web.UI.HtmlControls.HtmlInputFile File1;
protected System.Web.UI.WebControls.Button Button2;

private void Page_Load(object sender, System.EventArgs e)
{
// Put user code to initialize the page here
}

#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}

///
/// Required method for Designer support – do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent()
{
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.Button2.Click += new System.EventHandler(this.Button2_Click);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion

#region 压缩
private void Button1_Click(object sender, System.EventArgs e)
{
string []FileProperties=new string[2];
string fullName=this.File1.PostedFile.FileName;//C: esta.txt
string destPath=System.IO.Path.GetDirectoryName(fullName);//C: est
//待压缩文件
FileProperties[0]=fullName;

//压缩后的目标文件
FileProperties[1]= destPath +"\"+ System.IO.Path.GetFileNameWithoutExtension(fullName) + ".zip";
ZipClass Zc=new ZipClass();
Zc.ZipFileMain(FileProperties);

//删除压缩前的文件
System.IO.File.Delete(fullName);
}

#endregion

#region 解压
private void Button2_Click(object sender, System.EventArgs e)
{
string fullName=this.File1.PostedFile.FileName;//C: esta.zip
//解压文件
//AttachmentUnZip.UpZip(fullName);

// string[] FileProperties = new string[2];
// FileProperties[0] = fullName;//待解压的文件
// FileProperties[1] = System.IO.Path.GetDirectoryName(fullName);//解压后放置的目标目录
// UnZipClass UnZc=new UnZipClass();
// UnZc.UnZip(FileProperties);
string dir = System.IO.Path.GetDirectoryName(fullName);
string fileName = System.IO.Path.GetFileName(fullName);
UnZipClass.UnZipFile(fileName, dir);
}
#endregion
}
}
  OK! 试试看。

  此方案解决了文件名中文字的问题,目录解压缩问题。
  至于整个文件夹批量上传并压缩成一个WINZIP压缩包的问题,没有时间解决了,各位如有解决方案,不妨共享一下。

  为什么使用Google扫描安全漏洞

  如果你正在执行信息安全评估――渗入测试、漏洞评估,或者范围更广的黑客测试――你就不能没有一个相应的测试工具。虽然对于一个网站来说,此类工具很难找,但Google(是的,www.google.com)还是一个你可以使用的,能够测试Windows系统安全漏洞的最热工具中的其中之一。假设它的功能和力量能够被用来攻击你,那么在对你的恶意攻击之前,这是一个让你知道自己系统漏洞,并采取相应保护措施的好工具。

  除了能够用Google做你能做的事情之外,它的最大优势之一就是不存在价格上的问题。Google被认为是穷人的安全评估工具,或者是为那些很少,甚至没有IT预算的安全管理员(即几乎所有的人)提供的工具。我个人是商业安全评估工具的大力提倡者,它们有助于提供更加详尽的测试项目、优良的报告能力和其它可以使你的评估工作更加容易的工具。然而,“花多少钱办多少事”,有时和它们并不相符。Google能够提供像黑客一样的眼睛,做你想像不到的事情,或者能够做任何安全测试工具(包括商业软件、免费软件或开源软件)能够做的事情,而这一切都是免费的!

  和许多外部测试工具一样,Google能够看到当前你为网络世界提供的服务。并且,它能够搜集、缓存、寻找和挖掘那些对你来说并不是很新的信息,或者在你不知道的情况下放上互联网的内容。在执行安全评估查询方面,你可以有几个选择,在Google的首页,高级搜索页面,甚至使用Google API写一个你自己的Web应用程序。

  当在你的系统上执行信息安全测试时,你最想做的就使像黑客一样进行查看,这也是Google最为擅长的。这里是一些进行黑客测试时Google能够找到的信息的例子:

  1.信用卡信息(credit card information)、社会安全号(social security number)和其它公众可以通过Web应用程序和数据库访问的机密信息。

  2.网络摄像头。

  3.文字处理文档、电子表格和演示文稿文件。

  4.Outlook Web Access相关的文件。

  5.默认的(通常是不安全的)IIS文件和自定义的ISS错误信息。

  6.本想隐藏的Web登录页面。

  7.进行不属于你的网络的主机欺诈。

  8.包含敏感信息的新闻组帖子。

  以上述的最后一个为例,当在Google Groups中执行一个基本的查询时,我看到了一个我认识的电信供应商的支持组信息,它是由供应商的网络管理员发表的。那个帖子泄漏了供应商内部网络的详细配置,包括网络布局、内网IP地址和主机名。它显露出的这么多信息给我的第一感觉是,我不应该信息那个公司,并将自己企业的敏感信息交给他们。我使用公司的名称和几个关键词,执行简单的搜索就找到了这些信息,若是使用Google的高级搜索,还不知道能够找到多少信息呢!

  在今天高价漏洞评估工具的世界里,Google是一阵清新的空气,它的安全测试查询是无敌的!作为一个安全漏洞检测的顶级人士,你不仅需要像黑客一样进行工作,还需要有创新的测试方法,Google无疑就是这样一款工具,他允许你进行这样的工作。

  在不久的将来,我将向你讲述使用真实的Google查询测试你的Windows系统的安全,这将帮助你确定自己的Windows系统是否足够健壮。

  用Google工具自动执行黑客测试

  已经有多种Google工具能够自动执行黑客测试,或者增强Google黑客测试的能力,它们包括:

  ·Johnny Long的Google Hacking Database (GHDB):http://johnny.ihackstuff.com/index.php?module=prodreviews,提供许多查询样例,你可以调节这些样例,将其用于你自己的站点或域名上。

  ·Foundstone公司的SiteDigger(http://www.foundstone.com/resources/proddesc/sitedigger.htm),它利用Foundstone自己个性化的Google查询,像Johnny Long的Google Hacking Database (GHDB)一样执行自动搜索。

  注意:Google每天最多只允许运行1,000条查询,这看起来挺多,但对于此类工具来说,很快就能够执行完毕。

  ·Johnny Long的Gooscan for Linux(http://johnny.ihackstuff.com/modules.php?op=modload&name=Downloads&file=indexreq=viewdownload&cid=5),它能够用来在Linux下执行命令行方式的Google查询。

  ·Google Toolbar for Internet Explorer允许你不进入Google的首页www.google.com就能够在IE浏览器中直接输入关键词进行简单的查询。如果你是IE的反对者,还可以使用能够在Netscape或者Mozilla Firefox下执行的开放源码的Googlebar(http://googlebar.mozdev.org/)。

  ·GooDelete(http://www.dirfile.com/goodelete_history.htm)能够清理那些你不想留下的,使用Google Toolbar查询留下的,可能包含敏感信息的缓存。

  另外,如果你非常热心于Google黑客行为,你的书橱中就不能少了Johnny Long撰写的,具有很高评价的《Google Hacking for Penetration Testers.》(_ihackstuff-20/102-5005443-2664941?v=glance&s=books">http://www.amazon.com/exec/obidos/tg/detail/-/1931836361/ref=ase_ihackstuff-20/102-5005443-2664941?v=glance&s=books)这本书。

  用Google查询人工执行黑客测试

  在上一个技巧列出的自动查询工具之外,你可能还想执行自主的人工Google查询,这里是一些我在服务器上运行过的测试,它们可以作为你的开始。

  注意:事实上,你能够使用Google进行的这些查询是非常非常少的一部分,你只需将你的想像力与前述的工具结合即可,它们对你要进行的查询的数量没有限制。

  ·site:你的主机或者域名 需要找的关键字

  这将测试搜索一个特定Internet主机或域名下的任意关键字,你可以使用如SSN、 confidential、finance、student等众多关键字。

  ·filetype:想要找的文件扩展名 site:你的主机或者域名

  这个测试将搜索你系统中的特定文件,你可以输入任意文件扩展名,比如doc、pdf、ppt、db、dbf等,只要是你能够想像到的就行。

  除非你能够确定你的信息已经泄漏到了其它网站,否则就一直使用“site:”操作符来限定你的搜索结果。使用“link:”操作符则能够搜索连接到个页面上的超链接。

  如果Google返回了查询结果,但其中的链接已经成为死链,你可以点击搜索结果下面的“快照”链接进行搜索和查找。这将搜索Google的缓存,你的信息可能有存在那里的机会。同样,确定在Google Groups(网上论坛)搜索敏感信息,我曾经利用这种方法,在这里搜索到很多有用的信息。你还可以查看Interesting Google Queries(http://artkast.yak.net/81)这个网页,找到针对Microsoft的特殊Google搜索技巧。

  四个步骤保护Windows数据远离Google黑客

  使用适当的对策,可以帮助你将高度机密信息远离Google,不能够被Google黑客搜索到。这里有四个步骤,你可以尝试做一下:

  1.巩固你的服务器,并将其与外部环境隔离

  有一个很不幸的事实是,许多关键服务器仍然完全暴露在Internet上,现在请收紧你服务器的存取控制,并将其放在防火墙之后。

  2.设置robots.txt文件,禁止Google索引你的网页

  你能够通过设置“googlebot”的“User-agent:”参数的方法保护网络服务器的文件和目录免受Google索引,方法是在“Disallow:”部分列出你想保密的信息。

  或者,如果你想所有的Web机器人都不访问你的网站和网页,就请将“User-agent:”参数设置为“*”,不过记住,怀有恶意的在网上到处闲逛的人能够从你的Web Server上得到此文件,并且看到你不想被别人看到的是哪些信息。如果这看起来像互联网的弱点,那么它就是。你可以不用robots.txt文件,但你应该允许机器人只能索引那些具体的公开页面,或者通过输入“Disallow /”禁止它们索引任何以根目录开始的信息。

  请访问The Web Robots Pages(http://www.robotstxt.org/wc/robots.html)获取如何配置你的robots.txt文件和如何执行更多反机器人欺骗的信息。Google同样有一个FAQ on Googlebot’s operation(http://www.google.com/bot.html)。

  3.将高度机密的信息从公众服务器上去除

  制定一项组织策略用来保护高度机密的信息(例如密码、机密文件等)远离公众可以访问的服务器。否则,使用任何可能的存取控制措施来保护它们,并且确保这些策略能够被强制执行,并且管理那些违规者。

  4.保证你的服务器是安全的

  为了维护服务器安全,请使用我在这一系列技巧中讨论过的Google测试工具和Google查询对其进行黑客测试。

  我高度推荐使用自动化测试工具,譬如SiteDigger和Gooscan进行黑客测试,手工执行多个查询的方式不仅缓慢枯燥,还不易于管理。

  记住,这些测试只是通过Google进行的挖掘测试,它们并不能代表所有的黑客和Internet安全,这些也不是测试所有系统漏洞的最好工具。作为替代,你必须使用“多层”测试手段:同时使用Google和其它免费的、开源的,以及――据我看来,最具有综合性和可靠性的――商业性的工具进行测试,这些商业性的工具我推荐的有SPI Dynamics公司的WebInspect(应用于Web应用程序,http://www.spidynamics.com/)、Application Security公司的AppDetective(用于Web数据库,http://www.appsecinc.com/)和Qualys公司的QualysGuard(用于操作系统和网络漏洞,http://www.qualys.com/)。

  如果模拟黑客、渗入测试和普通的网络安全审计是你工作职责的一部分,这些Google黑客技术和相应的工具将成为你需要的安全工具箱中的一部分。为了安全的缘故,请现在就开始执行它,并且以后也经常执行。

  关于作者:Kevin Beaver是一位独立的信息安全顾问、作者,也是位于亚特兰大的Principle Logic, LLC公司的发言人,他专门为那些需要严格安全保护,或者突发安全事件寻求解决方法的公司提供信息安全研究服务。他是四本有关信息安全的书的作者或共同作者,其中包含获得巨大成功的《Hacking for Dummies》(_1_2/002-6195114-4480811?v=glance&s=books">http://www.amazon.com/exec/obidos/tg/detail/-/076455784X/qid=1086746862/sr=1-2/ref=sr_1_2/002-6195114-4480811?v=glance&s=books)和即将出版的《Hacking Wireless Networks for Dummies》(http://www.wiley.com/WileyCDA/WileyTitle/productCd-0764597302.html)。这些书都由Wiley Publishing出版集团策划发行。你可以通过[email protected]联系Kevin Beaver,这是他的个人邮箱。也可以通过http://searchwindowssecurity.techtarget.com/ateAnswers/0,289620,sid45_tax297883,00.html,直接向他提问有关黑客方面的问题

    大家一定使用过 phpmyadmin 里面的数据库导入,导出功能,非常方便。但是在实际应用中,我发现如下几个问题:

  1 数据库超过一定尺寸,比如6M 这时使用导出一般没问题,可以正确的保存到本机硬盘上面,但是导入则不行!原因是:一般的 PHP.INI 里面设置临时文件/上传文件的大小限制为2M,而phpmyadmin使用了上传的方式,造成失败。

  2 导出到硬盘的 .SQL 文件在导回时,经常出现由于某些单引号的问题引起失败,造成导入失败,只能用 mysql等应用程序导入了。 我的数据库已经超过10M,所以必须解决这个问题。我的思路:

  导出: 用phpmyadmin 保存数据库/表格结构,用脚本读取数据库内容并保存到文件里面!
  导入: 用phpmyadmin 恢复数据库/表格结构,用脚本读取文件,然后保存到库里面!

  导出程序如下:调用方法为 ****.php?table=tablename
  这个简单的程序目前一次保存一个表格!!每行为一个字段的数据!!

以下为引用的内容:
< ?
if($table=="")exit();
mysql_connect("localhost","name","password");
mysql_select_db("database");
$result = mysql_query("select * from $table");
if(mysql_num_rows($result) < = 0) exit();
echo "开始转换数据到文本…
";
$handle = fopen("$table.txt","w");
$numfields = mysql_num_fields($result);
fputs($handle,$numfields."
");
for($k=0;$k< mysql_num_rows($result);$k++)
{
$msg = mysql_fetch_row($result);
for($i=0;$i< $numfields;$i++)
{
$msg[$i] = str_replace("
","&&php2000mysqlreturn&&",$msg[$i]);
$msg[$i] = str_replace("
" ,"&&php2000mysqlreturn&&",$msg[$i]);
fputs($handle,$msg[$i]."
");
}
fputs($handle,"——- php2000 dump data program V1.0 for MySQL ——–
");
}
fclose($handle);
echo "ok";
?>

  导入的程序如下:用法同上面!

以下为引用的内容:
< ?
if($table=="")exit();
mysql_connect("localhost","name","password");
mysql_select_db("database");
$message = file("$table.txt");
echo $numfields = chop($message[0]);
for($k=1;$k< count($message);$k+=($numfields+1))
{
$value="";
for ($i=$k;$i< ($k+$numfields-1);$i++)
{
$tmp = str_replace("&&php2000mysqlreturn&&","
",chop($message[$i]));
$value .= "‘".addslashes($tmp)."‘,";
}
$tmp = str_replace("&&php2000mysqlreturn&&","
",chop($message[$k+$numfields-1]));
$value .= "‘".$tmp."‘";
$query = "insert into $table values (".$value.")";
echo mysql_error();
mysql_query($query);
echo $k." ";
}
echo "ok";
?>

  使用方法和可能的问题!
  1 导入时 file()函数可能会有问题(我的10M的数据没出现问题),可以改为 fopen()然后没次读一行!!
  2 导入,导出都需要用 ftp 操作,也就是导出后,用 ftp 把数据转到本机,导入时先用ftp转移数据到服务器!

转自:http://www.weste.net/2006/7-14/16243358863.html

查询手机是正品还是水货,方法很简单,需要进行“手机IMEI号验证”和“标志验证”,方法如下:

登录电信设备进网管理网站,网址是 http://www.tenaa.com.cn/

第一步:手机IMEI号验证
地址:http://www.tenaa.com.cn/WSFW/FlagValidateImei.aspx

按照网页中的提示进行选择,在手机上按“*#06#”获得手机的IMEI码。

第二步:标志验证
鉴于手机IMEI号可以被伪造,此种验证方式仅供参考,如需准确查询请使用“标志验证”进行验证。
地址:http://www.tenaa.com.cn/WSFW/FlagValidate.aspx

两个验证都无误说明您的手机是正品。

其他验证方式:

短消息验证进网许可标志方式:

方法介绍:

1.进入手机写信息界面;

2.按以下格式输入信息:

1).查询进网许可证信息:RW#许可证编号;
2).查询进网许可证标志真伪:RW#许可证编号#扰码;
3).查询手机设备真伪:RW#许可证编号#扰码#手机串号;

说明:
A、“RW”为固定代码,可以不分大小写;
B、“#”为间隔符,可以用空格代替;
C、许可证编号为进网标志上第1行,如“02-0010-994631”,其中“-”可以用字母“A”(不分大小写)代替;
D、扰码为进网标志上第3行,如“3N48PT7C17XP3X1”;
E、在手机上输入“*#06#”可以获得手机串号。只需输入数字,不需输入“/”或“-”
F、若需获得帮助信息,只需输入“RW”;

输入完毕,发送至9500,即可等待回复结论。

适用范围:手机短信查验进网许可标志的适用范围:目前适用于中国移动的全部用户和中国联通的全部用户。

服务时间:24小时开通

收费标准:每条一元

如果你想把二进制的数据,比如说图片文件和HTML文件,直接保存在你的MySQL数据库,那么这篇文章就是为你而写的!我将告诉你怎样通过HTML表单来储存这些文件,怎样访问和使用这些文件。
  本文概述: 
  在mysql中建立一个新的数据库 
  一个怎样储存文件的例子程序 
  一个怎样访问文件的例子程序 
  在mysql中建立一个新的database
   首先,你必须在你的mysql中建立一个新的数据库,我们将会把那些二进制文件储存在这个数据库里。在例子中我会使用下列结构,为了建立数据库,你必须做下列步骤: 
  进入MySql控制器 
  输入命令"create database binary_data;" 
  输入命令"use binary_data;" 
  输入命令"CREATE TABLE binary_data ( id INT  (4) NOT NULL AUTO_INCREMENT PRIMARY KEY,
description CHAR(50), bin_data LONGBLOB, filename CHAR(50), filesize CHAR  (50), filetype CHAR(50));" (不能断行) 
  如果没有意外,数据库 和 表 应该建立好了。 
  一个怎样储存文件的例子程序 用这个例子你可以通过Html表单将文件传输到数据库中。.

store.php3

以下为引用的内容:

// store.php3 – by Florian Dittmer 
?>

// 如果提交了表单,代码将被执行:

if ($submit) {

     // 连接到数据库
     // (你可能需要调整主机名,用户名和密码)

    MYSQL_CONNECT( "localhost", "root", "password");
    mysql_select_db( "binary_data");

    $data = addslashes(fread(fopen($form_data,  "r"), filesize($form_data)));

    $result=MYSQL_QUERY( "INSERT INTO binary_data (description,bin_data,filename,filesize,filetype) ".
         "VALUES (’$form_description’,’$data’,’$form_data_name’,’$form_data_size’,’$form_data_type’)");

    $id= mysql_insert_id();
    print  "

This file has the following Database ID: $id";

    MYSQL_CLOSE();

} else {

     // 否则显示储存新数据的表单
?> 
}

?>

  如果你执行了这个程序,你将会看见一个简单的Html表单,单击“浏览”选择一个文件,然后单击提交。
  当文件上传至web服务器之后,程序将会告诉你刚刚上传的文件的ID,记住这个ID,待会要用的。
  一个怎样访问文件的例子程序
  你可以通过这个程序访问你刚才储存的文件

以下为引用的内容:

// getdata.php3 – by Florian Dittmer 
// 调用方法: getdata.php3?id=

if($id) {

     // 你可能需要调整主机名,用户名和密码:
    @MYSQL_CONNECT( "localhost", "root", "password");

    @mysql_select_db( "binary_data");

    $query =  "select bin_data,filetype from binary_data where id=$id";
    $result = @MYSQL_QUERY($query);

    $data = @MYSQL_RESULT($result,0, "bin_data");
    $type = @MYSQL_RESULT($result,0, "filetype");

    Header(  "Content-type: $type");
    echo $data;

};
?>

  程序必须知道要访问那个文件, 你必须将ID作为一个参数。
  例如: 一个文件在数据库中的ID为2. 你可以这样调用它:
                    getdata.php3?id=2如果你将图片储存在数据库里, 你可以向调用图片一样调用它。
  Example: 一个图片文件在数据库中的ID为3. 你可以这样调用它:
                    
  怎样储存大于1MB的文件:
  如果你想储存大于1MB的文件,你必须对你的程序、PHP设置、SQL设置进行许多修改,。
  下面几条也许可以帮助你储存小于24MB的文件:
  修改 store.php3 ,将 MAX_FILE_SIZE 的值改成 24000000。 
  修改你的PHP设置,在一般情况下,PHP只允许小于2MB的文件,你必须将max_filesize(在php.ini中)的值改成24000000

  去掉MYSQL的数据包大小限制,在一般情况下 MYSQL 小于1 MB的数据包. 
  你必须用以下参数重启你的MYSQL
  /usr/local/bin/safe_mysqld -O key_buffer=16M -O table_cache=128 -O sort_buffer=4M -O record_buffer=1M -O max_allowed_packet=24M