www.pudn.com > rbScanner.rar > CNetBios.cpp


// CNetBios.cpp: implementation of the CNetBios class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "try4.h" 
#include "CNetBios.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
 
#include  
#include  
#include  
 
 
 
#pragma comment(lib,"mpr") 
#pragma comment(lib,"netapi32") 
 
 
#define LOCALDRIVE "x:" 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CNetBios::CNetBios() 
{ 
 
} 
 
CNetBios::~CNetBios() 
{ 
 
} 
 
 
BOOL CNetBios::OpenSession(PTSTR server) 
{ 
	 
	NETRESOURCE nr; 
	DWORD       ret; 
	TCHAR       username[100]=_T(""); 
	TCHAR       password[100]=_T(""); 
 
	wsprintf(ipc,_T("\\\\%s\\ipc$"),server); 
 
    //nr.dwScope = RESOURCE_GLOBALNET;  
	nr.lpLocalName=NULL; 
	nr.lpProvider=NULL; 
	nr.dwType=RESOURCETYPE_ANY; 
	nr.lpRemoteName = ipc; 
 
	ret=WNetAddConnection2(&nr,username,password,NULL); 
 
	if(ret!=ERROR_SUCCESS) 
	    	return false ;	 
	else 
			return true; 
 
 
} 
 
BOOL CNetBios::CloseSession(char *ipc) 
{ 
	DWORD ret;	 
  
	ret=WNetCancelConnection2(ipc,0,TRUE);  
 
	if(ret!=ERROR_SUCCESS) 
	{ 
		return false; 
	} 
	else 
		return true; 
} 
 
int CNetBios::GetUsers(PTSTR server,CString &strOutput) 
{ 
//	char txt[2000]; 
 
	CFile fileUsers("UserInfo.txt",CFile::modeWrite|CFile::modeCreate); 
	 
 
	PNET_DISPLAY_USER  pBuf,pBuffer; 
	DWORD              nStatus; 
	DWORD              dwRec; 
	DWORD              i=0; 
	DWORD              lerror; 
	DWORD              dwLevel; 
	char lpwStr[100]=_T("");  //保存server的双字节形式 
 
 
	dwLevel=1; 
 
	strOutput=_T(""); 
 
 
	MultiByteToWideChar(CP_ACP, 0, server, -1, (unsigned short *)lpwStr, 100);  
 
	do 
	{ 
		nStatus=NetQueryDisplayInformation((unsigned short *)lpwStr,dwLevel,i,100,0xFFFFFFFF,&dwRec,(PVOID *)&pBuf); 
		if((nStatus==ERROR_SUCCESS) || (nStatus==ERROR_MORE_DATA)) 
		{ 
			CFile fileUsersTemp("users.txt",CFile::modeWrite|CFile::modeCreate); 
 
			pBuffer=pBuf; 
			for(;dwRec>0;dwRec--) 
			{ 
				char szTemp[256]; 
				//将双字节形式字符串转换为单字节形式 
				WideCharToMultiByte(CP_ACP,0,pBuffer->usri1_name,-1,szTemp,256,0,0); 
 
				CString str; 
				str.Format("\r\n用户名:  %s",szTemp); 
				strOutput+="\r\n"+_T(str); 
			//	UpdateData(false); 
 
				CString str1; 
				str1.Format("%s\r\n",szTemp); 
				fileUsersTemp.Write(str1,str1.GetLength()); 
 
 
				WideCharToMultiByte(CP_ACP,0,pBuffer->usri1_full_name,-1,szTemp,256,0,0); 
 
 
			    str.Format("用户全名:   %s",szTemp); 
				strOutput+="\r\n"+_T(str); 
 
			//	UpdateData(false); 
 
				str.Format("用户 ID:   %u",pBuffer->usri1_user_id); 
				strOutput+="\r\n"+_T(str); 
			//	UpdateData(false); 
 
 
				WideCharToMultiByte(CP_ACP,0,pBuffer->usri1_comment,-1,szTemp,256,0,0); 
 
				str.Format("附注 :    %s",szTemp); 
				strOutput+="\r\n"+_T(str); 
			//	UpdateData(false); 
 
		 
				i=pBuffer->usri1_next_index; 
				pBuffer++; 
			} 
 
			fileUsersTemp.Close(); 
		} 
		else 
		{   
			lerror=GetLastError(); 
			if(lerror==997) 
			{ 
				AfxMessageBox(_T("\nUsers:\t\tOverlapped I/O operation is in progress.\n")); 
			} 
			else 
			{ 
				CString str; 
				str.Format("Users Error:   %d ",lerror); 
				AfxMessageBox(str); 
			} 
		} 
  		if(pBuf!=NULL) 
		{ 
	           	NetApiBufferFree(pBuf); 
		} 
	}while(nStatus==ERROR_MORE_DATA); 
 
//	wsprintf(txt,"%s",strOutput); 
 
	fileUsers.Write(strOutput,strOutput.GetLength()); 
	fileUsers.Close(); 
 
	return 0; 
 
} 
 
int CNetBios::FingerPrint(PTSTR server,CString &strOutput) 
{ 
	CFile fingerprint("ServerInfo.txt",CFile::modeWrite|CFile::modeCreate); 
 
	DWORD              dwlength;  
	DWORD              dwLevel;  
	NET_API_STATUS     nStatus; 
	PSERVER_INFO_101   pBuf; 
	DWORD              lerror; 
	char lpwStr[100]=_T("");  //保存server的双字节形式 
  
	dwLevel=101; 
	pBuf=NULL;  
	dwlength=_tcslen(server); 
 
	strOutput=_T(""); 
 
// 
    MultiByteToWideChar (CP_ACP, 0, server, -1, (unsigned short *)lpwStr, 100);  
    //将server由单字节转换为双字节,否则不对 
 
	nStatus=NetServerGetInfo(lpwStr,dwLevel,(PBYTE *)&pBuf);//第一个参数要求为双字节 
	 
	if(nStatus==NERR_Success) 
	{ 
		CString str; 
 
		str.Format("计算机名:    %s",pBuf->sv101_name); 
        strOutput+="\r\n"+str; 
		 
		str.Format("操作系统id: %d",pBuf->sv101_platform_id); 
        strOutput+="\r\n"+str; 
		 
		str.Format("版本号:  %d.%d",pBuf->sv101_version_major,pBuf->sv101_version_minor); 
        strOutput+="\r\n"+str; 
 
	} 
	else 
	{ 
		lerror=GetLastError(); 
		if(lerror==997) 
		{ 
		AfxMessageBox("\nFingerprint:\tOverlapped I/O operation is in progress.\n"); 
		} 
		else 
		{ 
			CString str; 
			str.Format(("Fingerprint Error:    %d"),lerror); 
           	AfxMessageBox(str); 
		} 
	} 
 	if(pBuf!=NULL) 
	{ 
		NetApiBufferFree(pBuf); 
	} 
 
	fingerprint.Write(strOutput,strOutput.GetLength()); 
	fingerprint.Close(); 
 
	return 0; 
 
} 
 
int CNetBios::GetShareList(PTSTR server,CString &strOutput) 
{ 
	CFile fileShare("ShareInfo.txt",CFile::modeWrite|CFile::modeCreate); 
 
	DWORD              er,tr,resume; 
	DWORD              i,dwLength,dwLevel; 
	PSHARE_INFO_1      pBuf,pBuffer; 
	NET_API_STATUS     nStatus; 
	DWORD              lerror; 
	char lpwStr[100]=_T("");  //保存server的双字节形式 
 
 
	er=0;              
	tr=0; 
	resume=1; 
	dwLevel=1; 
	dwLength=_tcslen(server); 
 
     strOutput=_T(""); 
 
	 MultiByteToWideChar (CP_ACP, 0, server, -1, (unsigned short *)lpwStr, 100);  
 
	do 
	{                                                 
		nStatus=NetShareEnum(lpwStr,dwLevel,(PBYTE *)&pBuf,MAX_PREFERRED_LENGTH,&er,&tr,&resume); 
		if((nStatus==ERROR_SUCCESS) || (nStatus==ERROR_MORE_DATA)) 
		{ 
	        pBuffer=pBuf; 
	        for(i=1;i<=er;i++)   
			{ 
				char szTemp[256]; 
				//将双字节形式字符串转换为单字节形式 
				WideCharToMultiByte(CP_ACP,0,(unsigned short *)pBuffer->shi1_netname,-1,szTemp,256,0,0); 
 
		 
				CString str; 
				str.Format("\r\n共享名 :  %s",szTemp); 
				strOutput+="\r\n"+str; 
 
 
				WideCharToMultiByte(CP_ACP,0,(unsigned short *)pBuffer->shi1_remark,-1,szTemp,256,0,0); 
 
	            str.Format("附注 :  %s",szTemp); 
				strOutput+="\r\n"+str; 
 
			 
				strOutput+="\r\n类型 :"; 
 
				if(pBuffer->shi1_type==STYPE_DISKTREE)      
				{  
					strOutput+=_T("Disk drive."); 
				} 
				else if(pBuffer->shi1_type==STYPE_PRINTQ)   
				{ 
					strOutput+=_T("Print queue."); 
				} 
				else if(pBuffer->shi1_type==STYPE_DEVICE) 
				{ 
					strOutput+=_T("Communication device."); 
				} 
				else if(pBuffer->shi1_type==STYPE_IPC)    
				{ 
					strOutput+=_T("Interprocess communication (IPC).");   
				} 
				else if(pBuffer->shi1_type==STYPE_SPECIAL)  
				{ 
					strOutput+=_T("Special share reserved for interprocess communication (IPC$) or remote administration of the server (ADMIN$)."); 
				} 
				else 
				{ 
					strOutput+=_T("\r\n"); 
				} 
				pBuffer++; 
			} 
		} 
		else 
		{ 
			lerror=GetLastError(); 
			if(lerror==997) 
			{ 
				AfxMessageBox(_T("\nNetbios:\tOverlapped I/O operation is in progress.\n")); 
			} 
			else  
			{ 
				CString str; 
				str.Format("\nNetbios Error:\t%d\n",lerror); 
				AfxMessageBox(str); 
			} 
		} 
           	if(pBuf!=NULL) 
		{ 
           	    	NetApiBufferFree(pBuf); 
		} 
	} 
	while(nStatus==ERROR_MORE_DATA); 
 
	fileShare.Write(strOutput,strOutput.GetLength()); 
	fileShare.Close(); 
 
	return 0; 
} 
 
/* 
void CNetBios::GetUsersToFile(PTSTR server) 
{ 
	CFile fUsers; 
 
	NET_API_STATUS nStatus=0; 
	LPBYTE *buf=NULL; 
	DWORD entread=0,totent=0,rhand=0; 
	DWORD maxlen=0xffffffff; 
	PUSER_INFO_0  pBuf; 
	UINT i; 
	int cc=0; 
	char lpwStr[100]=_T("");  //保存server的双字节形式 
 
 
	MultiByteToWideChar(CP_ACP, 0, server, -1, (unsigned short *)lpwStr, 100);  
	 
	buf=(unsigned char**)malloc(5000); 
 
	nStatus=::NetUserEnum((unsigned short *)lpwStr,0,0,buf,maxlen,&entread,&totent,&rhand); 
 
	if(nStatus!=NERR_Success) 
	{ 
		AfxMessageBox("Couldn't Enum Users!"); 
		return; 
	} 
 
	cc=sizeof(USER_INFO_0)*entread; 
 
 
	if((pBuf=(USER_INFO_0 *)malloc(cc))==NULL) 
	{ 
		AfxMessageBox("Malloc Error!"); 
		return; 
	} 
 
    fUsers.Open("users.txt",CFile::modeWrite|CFile::modeCreate); 
     
	memcpy(pBuf,*buf,cc); 
 
	for(i=0;i