走出Windows XP系统最小化克隆误区

在病毒猖獗的互联网时代,小小的Ghost给大家帮了不少忙!–3分钟克隆,3分钟恢复,瞬间系统还原如初!  然而,人们总是在追求更简便的应用,于是,网络内外到处都有关于Ghost最小化克隆的经验技巧。可令人遗憾的是,对目前Windows XP的最小化克隆,误导性的操作比比皆是,以讹传讹!  误导之一:删除C盘根目录下的页面文件Hiberfil.sys   一种做法是教读者一步步打开“控制面板→电源选项→休眠”,取消勾选“启用电源”;另一种做法则更卖力——在DOS 6.22里找到Deltree.exe命令文件,复制到系统盘根目录,然后再通过各种方式将电脑启动到纯DOS,执行Deltree Hiberfil.sys命令以将其删除–因为在Windows下删不掉Hiberfil.sys!  误导之二:移动虚拟内存或删除Pagefile.sys文件  也有两种误导方式:一是移动虚拟内存到其他分区;二是同上面一样,启动到纯DOS通过Deltree来删除。   其实,以上两个文件尽管很大(默认情况下,Hiberfil.sys一般为255MB,Pagefile.sys一般为384MB),但用Ghost软 件进行克隆时,Ghost并没有将它们复制到.gho文件里面去–我曾用Ghost 6.0/7.0/8.0等多个版本反复进行过多次对比克隆,不管是系统盘有没有这两个文件,克隆的最终结果都是433351KB(423MB)左右;同 时,用鬼探测者(GhostEXP.exe)打开.gho文件,也都没有Hiberfil.sys和Pagefile.sys的身影!既然如此,何必多此 一举!  那么,使要克隆的系统盘最小化,可取的措施有哪些呢?  1. 通过Sfc.exe /purgecache清除文件缓存,这是最见效的一招,可将系统减少370MB左右;  2. 通过对系统盘进行搜索,找出所有的.cab、.zip压缩包,移走或删除(能减少85MB左右);  3. 通过Cleanmgr(附件里的磁盘清理工具)以及对 .tmp、$ 临时文件的搜索等方式删除临时文件;  4. 至于帮助文件、字体文件、桌面墙纸文件等,可以移走或删除;  5. 对于系统自作主张为你安装的组件,比如MSN、OE、附件里的游戏等等,可通过“添加/删除程序”将其卸载;  6. 很重要的一个习惯:将所有程序都安装在另一个分区,以减少系统分区的大小;   7. 删除系统盘根目录下的用于系统还原的记载及备份——对于XP系统来说,即便是系统刚装好,也可能在System Volume Information目录中存在几十乃至上百MB的备份文件(单击“工具→文件夹选项→查看”,取消勾选“隐藏受保护的操作系统文件”即可看到)。这一 步一般放在最后也就是克隆之前做,这样才能彻底清空,因为只要你的系统还原功能没有关闭,在其监视之下你所做的一切修改都将在C:System Volume Information里备案!当然,删除了它们,在此之前所做的一切修改也就不能还原了!

Read: 757

CGI扫描器的原理和实现过程

有很多网站为了安全起见,在WEB Server前面架了防火墙,或者做了TCP/IP过滤,对外只开放TCP 80 端口。从入侵者角度来看,要入侵那 么从80上跑的CGI入手是比较可行的,当然也可以用别的办法,例如旁敲侧击,呵呵。从网管角度来看,一是要保证CGI的安全性,另外网络的整体安全性也 是很重要的。针对基于80端口入侵、防范而出的CGI扫描器数不胜数,但基本上原理都一样。
CGI扫描器原理说起来其实非常简单,可以用四句话来概括:<1>连接目标WEB SERVER;<2>发送一个特殊的请求;<3>接收目标服务器返回数据;<4>根据返回数据判断目标服务器是否有此CGI漏洞。
当管理的服务器达到一定数量的时候,手工检测自己的服务器是否存在各种各样的CGI漏洞,那就太消耗时间和精力了,所以一个网管手上有个比较好用的 CGI漏洞扫描器还是必要的。OK!今天我们就自己来动手用C写一个简单的CGI扫描器,帮助自己在日常工作中检测服务器:))

源代码如下,很多地方我都加了注释,别嫌我烦哦:))编译好的程序可以从http://eyas.3322.net/program/cgicheck.exe下载。

/*************************************************************************

说明:这是一个Console下多线程,带有进度显示的CGI扫描器的模板,更改一下szSign和SendBuff就可以扫描其他CGI漏洞,设置了连接、发送、接收超时,速度还可以哦。希望可以帮助到admins检测自己的服务器:))

*************************************************************************/

#include <stdio.h>

#include <winsock2.h>

#include <time.h>

#define iPort 80//目标Web Server端口

#define szSign "500 13rnServer: Microsoft-IIS/5.0"//根据此标志来检查目标是否有漏洞

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

///////////////////////////////////////////////////////////////////////////

//

file://定义&初始化全局变量

//

char *SendBuff="GET /NULL.printern",//发送的请求buff

CurrentTarget[52]={0},//存放最后一个线程将扫描的目标

turn[4][2]={"-","\"," ","/"};//显示进度时的字符

int SendBuffLen=strlen(SendBuff),//发送的buff长度

iConnTimeout,//TCP Connect TimeOut

ii=0,//扫描进度

iTotal;//服务器总数

HANDLE hSemaphore=NULL,//信标内核对象句柄,用来控制线程数量

hStdout;//console标准输出句柄,做进度显示的时候用的

struct timeval timeout;//连接、发送和接收的超时值

DWORD SleepTime;//每个一个线程后等待的时间

/*

SleepTime值根据用户输入的线程数量[ThreadNum]和TCP ConnectTimeOut[CONNTIMEO]来计算。确保在 CONNTIMEO时间左右开    ThreadNum个线程。这样在CONNTIMEO时间后,所开的线程开始陆续超时退出,可以继续稳定的开线程, 可以有效的保证同时有    ThreadNum个线程在运行。

*/

///////////////////////////////////////////////////////////////////////////

void ShowError(char *);//显示出错信息函数,可以写完善一些,偶偷懒了:)

BOOL ResetCursor(void);//重置光标位置,线程输出的时候调用的

DWORD WINAPI ShowProInfo(LPVOID);//显示进度信息

DWORD WINAPI scan(LPVOID);//扫描函数

void usage(char *);//帮助函数

///////////////////////////////////////////////////////////////////////////

int main(int argc,char **argv)

{

HANDLE hThread=NULL;//线程句柄

DWORD dwThreadID;//线程ID

struct sockaddr_in sa;

int i,

MaxThread;//最大线程数量

WSADATA    wsd;

long PreviousCount;

clock_t start,end;//程序运行的起始和结束时间

double duration;

file://检查用户输入参数

if(argc!=5)

{

usage(argv[0]);

return 1;

}

file://get target range

int StartNet=inet_addr(argv[1]);

int StopNet=inet_addr(argv[2]);

int StartHost=ntohl(StartNet);

int StopHost=ntohl(StopNet);

file://取得线程数量

MaxThread=atoi(argv[3]);

file://取得conn超时时间

iConnTimeout=atoi(argv[4]);

file://检查参数合法性

if((iConnTimeout>6) (iConnTimeout<2) (MaxThread<1) (MaxThread>500) (StopHost<StartHost))

{

usage(argv[0]);

return 1;

}

file://计算时间

SleepTime=1000*iConnTimeout/MaxThread;

file://设置连接超时值

timeout.tv_sec = iConnTimeout;

timeout.tv_usec =0;

__try

{

file://开始计时

start=clock();

file://加载winsock库

if (WSAStartup(MAKEWORD(1,1), &wsd) != 0)

{

    ShowError("WSAStartup");

    __leave;

}

file://创建信标内核对象句柄

hSemaphore=CreateSemaphore(NULL,MaxThread,MaxThread,NULL);

if(hSemaphore==NULL)

{

    ShowError("CreateSemaphore");

    __leave;

}

file://取得console标准输出句柄

hStdout=GetStdHandle(STD_OUTPUT_HANDLE);

if(hStdout==INVALID_HANDLE_VALUE)

{

    ShowError("GetStdHandle");

    __leave;

}

file://设置目标总数

iTotal=StopHost-StartHost;

file://创建进度显示线程

hThread=CreateThread(NULL,0,ShowProInfo,NULL,0,&dwThreadID);

if(hThread==NULL)

{

    ShowError("1 CreateThread");

    __leave;

}

file://关闭句柄

CloseHandle(hThread);

file://循环创建扫描线程

for(i=StartHost;i<=StopHost;i++)

{

file://等待信标内核对象通知

    WaitForSingleObject(hSemaphore,INFINITE);

    file://create thread to scan

    hThread=CreateThread(NULL,0,scan,(LPVOID)i,0,&dwThreadID);

    if(hThread==NULL)

{

    ShowError("2 CreateThread");

break;

}

file://进度自加1

    ii++;

file://重设最后一个线程扫描的目标

    sa.sin_addr.s_addr=htonl(i);

    strncpy(CurrentTarget,inet_ntoa(sa.sin_addr),sizeof(CurrentTarget));

file://休息一会儿:))

    Sleep(SleepTime);

file://关闭线程句柄

    CloseHandle(hThread);

}

file://等待所有线程结束

while(1)

{

    WaitForSingleObject(hSemaphore,INFINITE);

    if(!ReleaseSemaphore(hSemaphore,1,&PreviousCount))

{

ShowError("main() ReleaseSemaphore");

Sleep(5000);

break;

}

    if(PreviousCount==(MaxThread-1))

    {

printf("nAll done.");

break;

}

    Sleep(500);

}

}//end of try

file://搞定,清场,收工

__finally

{

file://计时结束

end=clock();

file://转换时间格式

duration = (double)(end – start) / CLOCKS_PER_SEC;

file://显示所用时间

printf("nnComplete.Scan %d targets use %2.1f seconds.Speed %0.3g/sn",iTotal,duration,iTotal/duration);

file://关闭句柄

CloseHandle(hStdout);

CloseHandle(hSemaphore);

WSACleanup();

}

return 0;

}

///////////////////////////////////////////////////////////////////////////

//

file://回显错误信息函数

//

void ShowError(char *msg)

{

MessageBox(NULL,msg,"ERROR",0);

file://printf("n%s failed:%d",GetLastError());

}

//////////////////////////////////////////////////////////////////////////

//

file://重置光标位置函数,以便扫描线程输出结果

//

BOOL ResetCursor()

{

CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo;

file://取得当前光标位置

if(!GetConsoleScreenBufferInfo(hStdout,&ConsoleScreenBufferInfo))

{

ShowError("GetConsoleScreenBufferInfo");

return FALSE;

}

file://设置光标X坐标为0

ConsoleScreenBufferInfo.dwCursorPosition.X=0;

file://设置当前光标位置

SetConsoleCursorPosition(hStdout,ConsoleScreenBufferInfo.dwCursorPosition);

return TRUE;

}

///////////////////////////////////////////////////////////////////////////

//

file://显示进度信息函数

//

DWORD WINAPI ShowProInfo(LPVOID lp)

{  

int j,k;

CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo;

float m;

for(j=0;ii<iTotal;j++)

{

file://休息一会儿:)))

Sleep(SleepTime);

file://取得当前光标位置

if(!GetConsoleScreenBufferInfo(hStdout,&ConsoleScreenBufferInfo))

{

    ShowError("GetConsoleScreenBufferInfo");

    return 1;

}

file://设置百分比进度显示的X坐标

ConsoleScreenBufferInfo.dwCursorPosition.X=0;

file://设置当前光标位置

SetConsoleCursorPosition(hStdout,ConsoleScreenBufferInfo.dwCursorPosition);

file://已经完成的百分比

m=(ii+1)*100.00/iTotal;

file://显示进度

if(ii==iTotal)

{

    printf("******** 100%% Wait %d seconds to exit ********       n",iConnTimeout);

    break;

}

else

{

    k=j%4;

    printf("%-15s %s [%d/%d] %s %%%0.3g",CurrentTarget,turn[k],ii,iTotal,turn[k],m);

}

}//end of for

return 0;

}

///////////////////////////////////////////////////////////////////////////

//

file://扫描函数

//

DWORD WINAPI scan(LPVOID lp)

{

int i=(int)lp,iErr;

struct sockaddr_in server;

SOCKET s=INVALID_SOCKET;

char RecvBuff[1024]={0},*ptr;

int RecvBuffLen=sizeof(RecvBuff);

u_long ul=1;//初始化为为非0值

fd_set r,w;

file://create socket

s=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if(s==INVALID_SOCKET)

{

printf("nCreate socket failed:%d",GetLastError());

ExitProcess(1);

}

file://fill the addr struct

server.sin_family=AF_INET;

server.sin_port=htons(iPort);

server.sin_addr.S_un.S_addr=htonl(i);

__try

{

file://设置socket为非锁定模式,ul为0值的话,那么soocket将被设置为锁定模式

iErr=ioctlsocket(s,FIONBIO,(unsigned long*)&ul);

if(iErr==SOCKET_ERROR )

{

    ResetCursor();

    ShowError("ioctlsocket");

    ExitProcess(1);

}

file://printf("n%X ioctl ok.strat conn",i);

file://connect to target

connect(s,(struct sockaddr *)&server,sizeof(server));

file://printf("n%X conn return,start select w",i);

file://设置select参数

FD_ZERO(&w);

FD_SET(s, &w);

file://等待connect成功&socket可写

iErr=select(0, 0, &w, 0, &timeout);

file://printf("n%X select w return %d",i,iErr);

file://等待返回后,socket仍不可写则退出

if((iErr==SOCKET_ERROR) (iErr==0))

{

    file://printf("n%X select return w err,exit",i);

    __leave;

}

file://socket可写则继续

else

{

    file://send buff to target

    file://printf("n%X send",i);

    iErr=send(s,SendBuff,SendBuffLen,0);

    file://printf("n%X send return",i);

    if(iErr==SOCKET_ERROR)

__leave;

}

file://等待socket可读

FD_ZERO(&r);

FD_SET(s, &r);

file://printf("n%X start select r",i);

iErr=select(0, &r, 0, 0, &timeout);

file://printf("n%X select r return %d",i,iErr);

if((iErr==SOCKET_ERROR) (iErr==0))

{

    file://printf("n%X select r err,exit",i);

    __leave;

}

else

{

    file://recv buff from target

    file://printf("n%X start recv",i);

    iErr=recv(s,RecvBuff,RecvBuffLen,0);

    file://printf("n%X recv ret",i);

    if(iErr==SOCKET_ERROR)

__leave;

}

file://verify buff

ptr=strstr(RecvBuff,szSign);

if(ptr!=NULL)

{

file://线程输出前要先调用ResetCursor函数

    ResetCursor();

file://输出信息后务必加一个以上换行符号,输出前请别加换行符号,以免显示混乱

    printf("[%-15s] has .printer mapped.        n",inet_ntoa(server.sin_addr));

}

}

__finally

{

if(!ReleaseSemaphore(hSemaphore,1,NULL))

    ShowError("thread ReleaseSemaphore failed");

closesocket(s);

}

return 0;

}

///////////////////////////////////////////////////////////////////////////

void usage(char *proname)

{

printf("n%s v0.1 only can find IIS5 .Printer mapped"

"nPower by ey4s<ey4s@21cn.com> 2001.5.20"

"nhttp://www.patching.net"

"nnUsage:%s <StartIP> <EndIP> <ThreadNum> <CONNTIMEO>"

"nnNotice"

"n    StartIP StopIP ==>Don‘t forgot StopIP must large than StartIP "

"n    ThreadNum ==>Thread number,please input between 1-500"

"n    CONNTIMEO ==>TCP connect timeout,please input between 2-6"

"nnExample"

"n    %s 192.168.0.0 192.168.255.255 200 2",proname,proname,proname);

}

程序在VC++6.0上编译通过,在windows2000上运行良好:)

Read: 872

Windows操作系统万能Ghost全攻略

相 信很多朋友都有经常被朋友拉去修机器的经历,重装系统就成了噩梦,于是,万能GHOST诞生了,但是网上很多万能GHOST都没有电源管理的解决办法,也 就是说做出来的系统不能软关机。而且网络上发布的万能GHOST大多只是一个空系统罢了,装软件同样费时间啊…………

OK!那我们就来做一个适合自己使用的超级GHOST!

声明:全部使用D版制作

一、准备工作

1、操作系统选择:一般我们选择XP—VLK版作为母版,不需要激活的,更不要破解的。当然这篇文章对2003同样适用。

2、软件准备:找齐你准备在你的超级系统里集成的所有软件(软件必须经过认真测试)、系统修补包(例如SP等)这些东西一定要测试一下。
注意:*在考虑软件的时候要想全一点,各方面要考虑到。
*软件版本必须要新的,这样可以有效延长你的超级镜象的寿命
*要记得集成一个能够有效杀毒并且能升级的杀毒软件(我集成的
是瑞星2005)
*尽量选择公认的、知名的软件,同一用途的软件不要装多了。比如看
图软件选择ACDSEE6.0或者7.0就可以了。其功能已经足够了,不需要
再集成其他类似软件了。

3、制作万能GHOST的机器选择
推荐使用INTEL芯片组的机器,我个人觉得INTEL芯片组的机器做出来的最稳定,VIA的就要差一 些,机器不能太老,但也不要使用太新的。I845这样的就比较合适了。尽量使用一线大厂的主板。不要使用在机器上安装过多的其他设备,只需要基本的就可以 了。另外,内存要大点,512吧

4、OEM信息准备:编写你自己的OEMINI文件、OEM图片

5、集成常用驱动:去www.mydrivers.com收 集大部分常用设备驱动(要那种带INF文件的,分类放好,装在一个文件夹里,文件夹名可以取成“PNP_drv”这样的。) 这样做的目的是为了以后在不同的机器上装系统时在没有驱动光盘的情况下让驱动的安装更方便。当然你也可以不做这个(偶就集成了100多兆的驱动)

6、 找到关于解决系统电源管理方案的电源管理解决方案压缩包,这里偶给大家推荐一高人制作的小东西,很完美的解决了万能GHOST支持不同主板不同电源管理模 式的问题。(不过偶没有上传空间,我也不记得下载地址了,需要的朋友可在上班时间联系QQ:3191775 注明:BBS水友)偶会给你提供这一工具

二、具体实施: ~~~OK!想清楚了?GO!动手的乐趣开始鸟~~~

1、找一块C盘足够大(根据你的具体需要,一般5G)的硬盘,然后安装XP,安装过程就不要我说了吧,注意:安装过程要仔细,力求不出一点点错,安 装完成后,尽量使用系统自带驱动,没必要非要装驱动,反正一会都要删掉所有驱动的嘛……(为了让系统适合更多的人,我一般选择磁盘格式为FAT32而不是 NTFS,你可以根据需要选择)

2、安装所需要的补丁,例如SP2等等。
在安装的时候(例如OFFICE2003这样的大家伙还会问你是不是保留安装源文件,应选择否,要不你的系统会过于庞大)。

3、安装软件并将OEM信息文件拷入SYSTEM32目录中,需要注册的软件用注册机先注册,再次提醒:做的时候不要急,慢慢来,做的越仔细你的GHOST越优秀。(注意软件全部安装在C盘,表装在其他分区中哟!)

4、当以上步骤完成后,重启计算机,然后打开事件查看器,看看系统和应用程序里有没有异常的错误。并测试所有软件。
——————————————————————-

5、设置你的系统:*关闭系统还原 *禁止页面交换文件
*禁用休眠支持 *重启动并检查这些项目设置已生效
*清空临时文件夹、缓存文夹,删掉不需要的桌布图片。
这些是为了减少无谓的磁盘空间消耗

6、在C盘建立一个名为sysprep的文件夹,注意:必须是SYSPREP

7、将XP安装光盘上SUPPORTTOOLSDEPLOY.CAB压缩包中的所有文件解压缩到你建立的SYSPREP文件夹中。

8、COPY 你收集的常用驱动程序存放文件夹到C盘根目录。

9、将电源管理解决方案压缩包解压缩到你建立的SYSPREP中。解出来应该包括一个叫ACPI的文件夹和一个ACPI.exe和一个acpi.reg,请不要更改文件夹的正确结构。

10、运行SYSPREP文件夹中从SUPPORTTOOLSDEPLOY.CAB压缩包中解压缩出来的一个名为setupmgr.exe的 程序,创建一个自动答应文件(完全自动),以自动提供系统重装时所需要的必要信息。注意:创建出来的自动答应文件名一般为:sysprep.inf 必须存放在C盘中的SYSPREP文件夹中。

10、修改计算机类型为Standard PC,修改完后系统会要求重启,一定不要重启!(必须这样做!)

11、修改IDE ATA/ATAPI控制器中第一个"xxx Controller"为"标准双通道控制器。修改完后系统会要求重启,一定不要重启!(必须这样做!)

12、执行从电源管理解决方案压缩包中解出的一个名为“devcon.exe”的程序(命令为devcon remove * ),以快速删除所有系统中的硬件设备驱动。
使用方法:开始–运行–CMD–在命令行模式下运行(注意命令的路径要正确哦,)

13、运行从电源管理解决方案压缩包中解出的一个名为acpi.reg的注册表文件,将其中信息导入注册表。(目的是为了在第一次启动的时候能够运行电源管理选择程序)以解决电源管理问题。

14、等等,我点支香烟,他母亲的,我的打火机那去了!?

15、运行SYSPREP文件夹中从SUPPORTTOOLSDEPLOY.CAB压缩包中解压缩出来的一个名为sysprep.exe的程 序,勾选NOSIDGEN、MINISETUP、已提前激三项(PNP项没必要勾选,会浪费时间的),关机一项最好选择成:SHOUTDOWN
最后,点击重新封装。这时系统将会被重新封装。完成后系统会自动关机(如果在关机一项设置的是“SHUTDOWN”的话)。

16、重新启动系统,用光盘引导系统进DOS,启动GHOST(推荐使用8.0及以上版本)。将C盘打成GHOST镜像。

说明:*由于集成了大量软件所以镜像可能会达到1.5GB左右,因此使用GHOST的时候应使用参数Z9获得最大压缩比的镜像文件。
* 如果需要刻录成光盘的话则需要使用GHOST的分卷刻隆参数,将镜像分卷文件限制为650兆。这样制作出来的镜像文件一般就会有三个。这样一般的镜像不会 超过三张盘(不推荐使用700兆的限制,因为有些光驱读起来可能有些困难)。制作光盘的时候头一张应该应该包含以下功能以方便使用:引导+ GHOST.EXE+分卷刻隆的第一部分,后两张光盘应分别刻录后两个分卷。
注意:在使用这三张光盘的时候是有顺序的哟,原因自然不需多讲了。

17、最后随便找个机器测试你的镜像。

18、大功告成!来`来~啵一个~

19、谁能告诉偶偶的打火机在那~~~5555

——————————————————————-

关于镜像的使用:

1、将此镜像恢复到目标计算机。
(应该注意目标计算机的配置,如果是C300A+64MB……那么……一般内存应该至少在128以上,256及以上是比较合适的,毕竟年代不同了嘛)。

2、恢复完镜像后重启。

3、重启后计算机会出现一个安装画面,不要急,这个过程不会有安装的时候那么长的,不过这里会出现个新DD,那就是在这个检测过程中会弹出一个窗 口,让你选择电源管理模式,嘿嘿,我们正是需要的这个!上面有很好的提示,自己看吧。提示:这个窗口中有个默认选项ACPI PC,这项适合绝大多数主板的。
注意:*一定要看清楚是支持单处理器还是多处理器的。一般的机器都是单处理器哟。
*如果你选择错误……那么你的机器将不能启动,必须要重新恢复镜像并且重新选择。
*Standard PC适用于任何PC,但是非常可耻的是这种类型不能软关机

4、然后的事情就不需要你管了,自动答应文件会提供所有信息。最后系统会重启。

5、重启后你会看见你熟悉的XP,进入系统后不要操作计算机(耐心等待会),系统会开始重新安装所有的硬件驱动,原因太简单啦~因为你删了所有的硬 件驱动嘛………如果此期间系统发现某个设备没有驱动(例如很新的显卡、声卡等),问你要,不要理它,按ESC跳过,让它先把它认识的先装完。
完成后系统会要求重启动。OK,批准~

6、再次重启后,安装其他系统无法直接识别的设备驱动。再次关闭系统还原这个垃圾功能。(页面交换文件系统会自动启用,无需手动设置)。这时候一个 带有大部分常用软件的配置精良的系统就已经搞定了。目前的主流机器整个过程仅需不到30分钟。尤其适合我这样经常被拉去帮别人重装系统的人

——————————————————————-

使用方案:

1、由于镜像文件很大,所以偶推荐使用硬盘来装,随便找个硬盘,两个分区,C区一点点大就行,格成启动到DOS的系统区,D盘装GHOST.EXE 和这个硕大无比的镜像外加一些常用的工具。这样需要恢复的时候直接将你的硬盘挂上目标计算机,用你的硬盘引导,启动GHOST,然后开GHO,然 后…………
大家都知道,硬盘速度自然比光盘快的多啦~~~

2、光盘方案,没什么好多的,分卷制作镜像文件,分别刻录到三张光盘上,其中第一张要带引导,要有GHOST.EXE。优点是使用方便,不过缺点也很比较明显–速度自然没有硬盘快咯。

Read: 756

用VC++编写CGI程序

近年来,Internet与Intranet迅猛发展,企业纷纷建立自己的Intranet,以加强企业内部的联系,促进与外部世界的沟通,增强企业的竞 争能力。通过建立自己的Internet服务器,企业能在网络上发布广告,介绍本公司的情况与产品,收集顾客意见,以及建立虚拟电子商场等。大家都知道写 一个HTML超文本文件放在World Wide Web服务器上,即可通过各种浏览器访问你的主页,但是如何使你的静态主页能响应客户的动作,并与本地的数据库联系,将数据库的相应内容传送给远端的浏览 器呢?这就需要通过CGI接口进行联系。
CGI全名是Common Gateway Interface,它是WWW服务器调用外部程序的接口通过CGI,WW W服务器能完成一些本身所力不能及的工作。

在不同操作系统下CGI接口也不相同,可分为Standard CGI接口、DOS CGI接口与Win CG I接口等。Standard CGI接口用于Unix系统,它是通过环境变量来实现WWW Server与CGI应用程序之间的联系。DOS CGI接口与Standard CGI接口原理类同。Win CGI接口则与前两者大不相同。由于越来越多的WWW Server采用Windows系统,而Windows系统又不能有效地传递环境变量,由Bob Denny提出了一种Windows CGI标准,并得以不断推广。
Win CGI是通过.ini文件来进行联系的。在Windows环境下,许多应用程序都是利用.ini 文件,即profile文件来定义一些基本设定,而Win CGI程序与WWW Server之间也正是通过pro file文件来实现联系的。当WWW Client通过WWW Server触发CGI程序时,WWW Server先动态生成几个文件于临时目录下,分为.ini、.inp、.out等文件。在WWW Server生成CGI程序的进程时,通过命令行参数将.ini文件的绝对路径传给CGI进程。.ini文件中也包含了.inp、.ou t等文件路径信息。这样,CGI程序可读取.ini和.inp文件所提供的信息,了解所有来自WWW Server端和与WWW Client端的数据。然后,CGI程序可以调用外部程序,或由CGI直接执行外部程序的功能,并将要传给客户端的信息以HTML文本的形式写在.out 文件上。最后,WWW Server取.out文件的HTML文本,将信息传送给WWW Client端,并删除临时目录下的文件。那么,CGI的profile文件包含了什么数据呢?与Windows其它.ini文件一样,CGI profile 文件包含了许多session,每个session又包含一些key,以下是一个CGI profile的部份内容

[CGI]
Request Method=POST //传递方式,即HTML中的Form method有GET,POST,HEAD等。
Server Software=WebSite/1.1e
//Server的名称与版本。
Server Name=199.199.198.55
//Server的IP地址。
Server Port=80//Server的Socket Port。
Server Admin=tomy@vico.bme.zju.edu.cn//Server管理者的E-mail地址。
Referer=http://199.199.198.55/
//主页的URL路径。
Remote Address=199.199.198.89
//Client端的IP地址。
[System]
Output File=c:WebSitecgi-temp198ws.out//输出文件的路径名。
Content File=c:WebSitecgi-temp198ws.inp//输入文件的路径名。
[Form Literal]
type=B//接收到的Form data即client端动作的结果信息。

原则上可用来编写CGI程序的语言有:perl, AppleScript, Unix Shell, VB, C/C++等。但在Windows(NT、3x、95)环境下,还是必须借助成熟的Windows编程语言才能编写出精巧的Win CGI程序。C语言是一门深受广大程序员喜爱的语言,尤其是VCi++作为一门面向对象的语言,具备了Windows环境的许多基本功能,如OLE, ODBC等。通过ODBC这项功能,可以非常容易地连接FoxPro, Access, dBASE等多种数据库,而无需考虑各种数据库结构的差异。
以下是笔者用VC++4.0编写的一个用Win CGI连接数据库的范例。使用者可在屏幕上选择,以查询ISP服务商提供的internet服务价格表。系统环境采用Windows 95,数据库采用FoxP ro2.5, WWW Server采用Website。

1.建立数据库
本例的CGI程序是通过ODBC连接数据库,因此数据库建完后,应用32位ODBC驱动器加以登记。

2.编写HTML程序
使用者可在屏幕上选择一服务类型,再按"提交"键,即可查询这一服务类型的各价格栏目。其HTML文本描述如下:
<HTML>
<HEAD>{TITLE>维科公司internet服务收费标准</TITLE></HEAD>
<pre><H1>维科公司internet服务收费标准</H1>
</P>
<hr><form method="POST" action="cgi-win/wincgi.exe">
您要查询的类型是:
<UL><LI>A类用户<input name="usertype" type=radio value="A">
<LI>B类用户<input name="usertype" type=radio value="B">
<LI>C类用户<input name="usertype" type=radio value="C">
<LI>D类用户<input name="usertype" type=radio value="D">
</UL>
<center>
<input type=submit value="提交"> <input type=reset value="取消"></center>
</pre></form><hr>
</HTML>

3.编写VC++CGI程序

Website为C++程序员提供了一个CCGI类,可在website目录下找到。该类提供了一些方便的函数,无需程序员编写一些直接与CGI界面打 交道的底层工作,充分体现面向对象语言的优势。在VC++4.0中建立一个"Dialog based"工程框架。将CCGI类引入框架,即将cgi.h,cgi .cpp加入程序。然后用VC++的ClassWizard工具创建一个与数据库相对应的CUserSet类,该类继承MFC类库中的 CRecordSet类。
主要代码加在wincgi.cpp文件中。

//程序:wincgi.cpp
#include "stdafx.h"
#include "wincgi.h"
#include "cgi.h"
#include "userset.h"
……
void ProcessCGI(CCGI *cgi);
BOOL CBaseApp::InitInstance()
{
CCGI cgi(m-ipCmdLine); //实例化CCGI类,并用命令行参数初始化
if(cgi.CalledAsCGI())
{
try
{
ProcessCGI(&cgi);
//在此做所有真正的工作
}
catch(CException* e)
{
cgi.HandleException(e);
//异常处理
e->Delete();
}
}
return FALSE;
}
void ProcessCGI(CCGI *cgi)
{
int i;
CString strTemp, strWebmaster, strReferer;
strWebmaster=cgi->GetCGIVar("Server Admin");
//获得Server管理者的E-mail地址。
strReferer=cgi->GetCGIVar("Referer"); //获得主页的URL路径。
CStringArray csaFields;
cgi->EnumFormFieldNames(csaFields);
//取得所有变量名,放在数组中。
cgi->WriteHTMLHeader();
cgi->WriteHTMLBody("<HEAD><TITLE>VC++CGI test</TITLE></HEAD>1512");
cgi->WriteHTMLBody("<BODY>1512");
CString csaFieldVal;
csaFieldVal=cgi->GetFormField(csaFields[0]);
//得到第一个变量的值,即"usertype"变量的值。
cgi->WriteHTMLBody("<h1>internet服务收费标准查询结果</h1><hr>");
CUserSet m-user;
//实例化CUserSet类
char sfilter[80];
wsprintf(sfilter,"USER-TYPE=´%s´´´,csaFieldVal);
m-user.m-strFilter=sfilter;
//设置筛选器。
m-user.Open();
strTemp="<h2>"+m-user.m-USER-TYPE+"类用户"+"</h2>1512";
cgi->WriteHTMLBody(strTemp);
strTemp="<P>入网费:"+m-user-FARE-INI+".</P>1512";
cgi->WriteHTMLBody(strTemp);
……
strTemp="<P>通信费:"+m-user.m-FARE-COM+".</P>1512"
;
cgi->WriteHTMLBody(strTemp);
m-user.Close();
if(!strReferer.IsEmpty())
//设置回到主页的锚点。
{
cgi->WriteHTMLBody("<P>Go<A HREF="");
cgi->WriteHTMLBody(strReferer);
cgi->WriteHTMLBody("">Back</A>where you came from.</P>1512");
}
if(!strWebmaster.IsEmpty())
//设置Server管理者的E-mail地址。
{
cgi->WriteHTMLBody("<P>Please email comments to");
cgi->WriteHTMLBody("<A HREF="mailto:");
cgi->WriteHTMLBody(strWebmaster);
cgi->WriteHTMLBody("">");
cgi->WriteHTMLBody(strWebmaster);
cgi->WriteHTMLBody("</A>.</P>1512");
}
cgi->WriteHTMLBody("</BODY>1512");
cgi->WriteHTMLFooter();
}

4.结论
将程序编译后,把wincgi.exe拷入website/cgi-win/目录下,用浏览器查询结果。至此简单地阐述了用VC++编写Win CGI程序的整个过程,C程序员也可以用自己熟悉的语言编写CGI程序了。利用VC++的强大功能,你的WWW Server将无所不能。

Read: 899

丽莎·凯莉 Lisa Kelly

       你或许未曾欣赏过大河之舞灿烂夺目的歌舞魅力 但你一定听过大河之舞背后那些天籁般的悠远乐音。被喻为塞尔特民谣新声天后的丽莎·凯莉(Lisa Kelly),以着极为纯净雄厚嗓音实力,击败诸位实力派歌手,雀屏中选为大河之舞一线女主唱,不用怀疑,如果你聆听过她的专辑,你将明白为何声音澄澈如 水晶般的丽莎,如何以着她多层次的歌声深度诠释宽广音域,遑论是大河之舞这般情节繁复的歌舞剧献声。在这张专辑里,丽莎除了原声呈现在大河之舞里的精湛歌 艺,精选Lift the Wings与Home and the Heartland两曲,另外更节选九首不同风格的曲目,一展凯尔特民谣多面的悠然曲风。开场之曲,丽莎即以妙的歌声引领乐迷进入人气票选第一的情歌民谣 Siuil A Run之中,时而开阔时而微渺的高音转折,让聆听者更感如沐春风。而被专业乐评评为"a nice surprise"的The Soft Goodbye更是将丽莎温柔的嗓音展现其中,感受一段美好的旋律,就像是爱乐者理想中的伊甸园。除此,专辑中Dubhdarra和The Deer’s Cry两曲让乐迷更能欣赏到名作曲家Shaun avey与丽莎的完美配合,转音结尾等在细节中一一流露默契,而从热门电影《魔戒》的May it Be,以及《神鬼战士》电影原声带中那首优美但也凄凉至极的Now We Are Free更是丽莎歌唱实力的最佳诠释。
        人生里,你或许已经错过许多事,也错过了大河之舞,但这次,你绝不可错过丽莎凯莉。

Read: 754