📄 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 <lm.h>
#include <winnetwk.h>
#include <winsock.h>
#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<entread;i++)
{
char szTemp[256];
//将双字节形式字符串转换为单字节形式
WideCharToMultiByte(CP_ACP,0,pBuf[i].usri0_name,-1,szTemp,256,0,0);
CString str;
str.Format("%s\r\n",szTemp); //"\r\n"用于在文件中换行,szTemp保存用户名
fUsers.Write(str,str.GetLength());
}
fUsers.Close();
if(pBuf!=NULL)
{
NetApiBufferFree(pBuf);
}
if(buf)
free(buf);
}
*/
int CNetBios::GetPasswd(CString strHost, TCHAR name[20],CString &pw)
{
TCHAR password[20]=_T("");
pw=_T("");
char addr[60];
wsprintf(addr,_T("\\\\%s\\c$"),strHost);
NETRESOURCE nr;
DWORD ret1;
nr.lpProvider = NULL;
nr.dwType = RESOURCETYPE_ANY;
nr.lpLocalName = LOCALDRIVE;
nr.lpRemoteName = addr;
ret1 = WNetAddConnection2(&nr,password,name,0);
if(ret1==240)return -1;
if(ret1==53) return -1;
if(ret1==NO_ERROR)
{
CString str;
str.Format("发现NT Server弱口令用户:%s 密码为空",name);
pw+=str;
WNetCancelConnection2(LOCALDRIVE,0,TRUE);
return 0;
}
ret1 = WNetAddConnection2(&nr,name,name,0);
if(ret1==240)return -1;
if(ret1==53) return -1;
if(ret1==NO_ERROR)
{
CString str;
str.Format("发现NT Server弱口令用户: %s 密码是:%s",name,name);
pw+=str;
WNetCancelConnection2(LOCALDRIVE,0,TRUE);
return 0;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -