⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shareenum.cpp

📁 网络共享资源的枚举
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	{
	}

protected:
	void UpdateStatus()
	{
		TCHAR msg[ MAX_PATH ];
		if ( g.ThreadCount )
			_stprintf( msg, _T("%d request%s pending..."), g.ThreadCount, g.ThreadCount == 1 ? _T("") : _T("s") );
		else
			msg[0] = 0;
		SetWindowText( GetDlgItem( g.hMainDlg, IDC_STATUS ), msg );
	}

	static DWORD WINAPI Work( void * This )
	{
		CWorker * obj = (CWorker *)This;
		obj->Work();
		return 0;
	}

	virtual void Work() = 0;

	void Finish()
	{
		if ( InterlockedDecrement( &g.ThreadCount ) == 0 )  {
			// We're done enumerating
			PostMessage( g.hMainDlg, WM_APP_ENUM_COMPLETE, 0, 0 );
		}
		UpdateStatus();
		delete this;
	}
};



class CEnumerateShares : public CWorker {
	HWND			m_hListview;
	const bstr_t	m_ComputerName;
	const bstr_t	m_domain;

public:
	CEnumerateShares( HWND hListview, const TCHAR * ComputerName, const TCHAR * domain ) :
					m_hListview( hListview ), m_ComputerName( ComputerName ), m_domain( domain )
	{
	}

	~CEnumerateShares()
	{
	}

private:

	void Work()
	{
		// Enumerate shares on the server
		DWORD				resume = 0;
		NET_API_STATUS		res;

		do {
			DWORD				er = 0;
			DWORD				tr = 0;
			SHARE_INFO_0	*	Info0;

			if ( g.Abort )
				break;

			// Get list of shares
			res = NetShareEnum( m_ComputerName, 0, (LPBYTE *) &Info0, MAX_PREFERRED_LENGTH, &er, &tr, &resume );
			if ( res != ERROR_SUCCESS  &&  res != ERROR_MORE_DATA )  {

				TCHAR	msg[ 1000 ];
				DWORD	nb = FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM, NULL, res, 0, msg, sizeof msg/sizeof msg[0], NULL );
				if ( nb )  {
					while ( nb > 0  &&  isspace( msg[nb-1] ) )
						msg[--nb] = 0;
				} else {
					GetLastError();
					_stprintf( msg, _T("Error %d"), res );
				}
				AddListviewRow( m_hListview, m_ComputerName, m_domain, msg, _T("???"), _T(""), _T(""), _T(""), _T("") );
				break;
			}
			if ( er >= 10000 )  {
				TCHAR	msg[ 100 ];
				_stprintf( msg, _T("NetShareEnum returned %d shares (bogus)"), er );
				AddListviewRow( m_hListview, m_ComputerName, m_domain, msg, _T("???"), _T(""), _T(""), _T(""), _T("") );
				break;
			}

			// Loop through the shares;
			for ( DWORD i = 0; i < er; i++ )  {

				if ( g.Abort )
					break;

				// Compute share name
				TCHAR shareName[ MAX_PATH ];
				_stprintf( shareName, _T("%s\\%s"), (const TCHAR *)m_ComputerName, Info0[i].shi0_netname );

				// Get detailed info about the share
				SHARE_INFO_502 * Info502 = NULL;
				res = NetShareGetInfo( m_ComputerName, Info0[i].shi0_netname, 502, (BYTE **)&Info502 );
				if ( res != 0 )  {
					TCHAR	msg[ 1000 ];
					DWORD	nb = FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM, NULL, res, 0, msg, sizeof msg/sizeof msg[0], NULL );
					if ( nb )  {
						while ( nb > 0  &&  isspace( msg[nb-1] ) )
							msg[--nb] = 0;
					} else {
						GetLastError();
						_stprintf( msg, _T("Error %d"), res );
					}
					AddListviewRow( m_hListview, m_ComputerName, m_domain, Info0[i].shi0_netname, msg, _T(""), _T(""), _T(""), _T("") );
					continue;
				}

				// Get type of resource
				const TCHAR * type = _T("Unknown");
				if ( Info502->shi502_type == STYPE_DISKTREE )  {
					type = _T("Disk");
				} else if ( Info502->shi502_type == STYPE_PRINTQ )  {
					type = _T("Printer");
	// 					continue;
				} else {
					continue;
				}

#define MISSING_DACL		((PACL) 0xFFFFFFFF)

				BOOL	present, defaulted;
				PACL	pacl = MISSING_DACL;

				// Get DACL that NetShareEnum sees
				if ( Info502->shi502_security_descriptor == NULL )  {
					// if no security descriptor then everyone has access
					pacl = NULL;
				} else if ( IsValidSecurityDescriptor( Info502->shi502_security_descriptor ) )  {
					// get the dacl
					if ( GetSecurityDescriptorDacl( Info502->shi502_security_descriptor, &present, &pacl, &defaulted ) )
						if ( !present )
							pacl = MISSING_DACL;
				} else {
					// can't say anything about security (missing)
				}

				// Get DACL that GetFileSecurity sees
				PSECURITY_DESCRIPTOR	sd2 = NULL;
				DWORD					nb = 0;

				// Get permissions
				TCHAR		EveryoneRead[ MAX_TEXT ];
				TCHAR		EveryoneWrite[ MAX_TEXT ];
				TCHAR		OtherRead[ MAX_TEXT ];
				TCHAR		OtherWrite[ MAX_TEXT ];
				TCHAR		deny[ MAX_TEXT ];

				EveryoneRead[0]		= 0;
				EveryoneWrite[0]	= 0;
				OtherRead[0]		= 0;
				OtherWrite[0]		= 0;
				deny[0]				= 0;


				// Analyze DACL
				if ( pacl == MISSING_DACL )  {
					_tcscpy( EveryoneRead, _T("???") );
				} else if ( pacl == NULL )  {
					// null acl implies all access
					_tcscpy( EveryoneRead, _T("Read/Write") );
				} else {
					// convert acl to text
					ACLtext( pacl, m_ComputerName, EveryoneRead, EveryoneWrite, OtherRead, OtherWrite, deny );

					// Combine EveryoneRead and EveryoneWrite into EveryoneReadWrite
					if ( EveryoneRead[0] == 'E'  && EveryoneWrite[0] == 'E' )
						_tcscpy( EveryoneRead, _T("Read/Write") );
					else if ( EveryoneRead[0] == 'E' )
						_tcscpy( EveryoneRead, _T("Read") );
					else if ( EveryoneWrite[0] == 'E' )
						_tcscpy( EveryoneRead, _T("Write") );

					// Trim trailing commas in lists
					TCHAR * end;
					for ( end = _tcschr( OtherRead, 0 ) - 1; end >= OtherRead && (*end == ' '  ||  *end == ','); --end )
						*end = 0;
					for ( end = _tcschr( OtherWrite, 0 ) - 1; end >= OtherWrite && (*end == ' '  ||  *end == ','); --end )
						*end = 0;
				}

				free( sd2 );

				// Add to list view
				AddListviewRow( m_hListview, shareName, m_domain, Info502->shi502_path, type, EveryoneRead, OtherRead, OtherWrite, deny );

				NetApiBufferFree( Info502 );
			}

			NetApiBufferFree( Info0 );

		} while ( res == ERROR_MORE_DATA );

		Finish();
	} // Work
}; // EnumerateShares



class CEnumerateComputers : public CWorker {
	HWND			m_hListview;
	const bstr_t	m_domain;

public:
	CEnumerateComputers( HWND hListview, const TCHAR * domain ) :
						m_hListview( hListview ), m_domain( domain )
	{
	}

	~CEnumerateComputers()
	{
	}

private:
	void Work()
	{
		// Enumerate servers/containers in domain
		NETRESOURCE	resource	= { 0 };
		resource.dwScope		= RESOURCE_GLOBALNET;
		resource.dwType			= RESOURCETYPE_ANY;
		resource.dwDisplayType	= RESOURCEDISPLAYTYPE_DOMAIN;
		resource.dwUsage		= RESOURCEUSAGE_CONTAINER;
		resource.lpLocalName	= NULL;
		resource.lpRemoteName	= m_domain;

		HANDLE		hEnum = NULL;
		WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK, RESOURCEUSAGE_CONTAINER, &resource, &hEnum );

		// Iterate, reading blocks of resources
		for (;;) {
			if ( g.Abort )
				break;

			NETRESOURCE			NetResourceList[ 512 ];
			DWORD				NetResourceMax	= -1;
			DWORD				nb				= sizeof NetResourceList;
			DWORD				dwResult		= WNetEnumResource( hEnum, &NetResourceMax, NetResourceList, &nb );

			if ( dwResult == ERROR_NO_MORE_ITEMS )
				// Done!
				break;

			if ( dwResult != ERROR_MORE_DATA  &&  dwResult != NO_ERROR ) 
				// Error!
				break;

			// Read items
			for ( DWORD i = 0; i < NetResourceMax; i++ )  {
				NETRESOURCE	*	rp = NetResourceList + i;

				if ( g.Abort )
					break;

				if ( rp->dwDisplayType == RESOURCEDISPLAYTYPE_SERVER )  {
					// Found a computer, so enumerate its shares
					CEnumerateShares * e = new CEnumerateShares( m_hListview, rp->lpRemoteName, m_domain );
					e->Start();
				}
			}
		}

		WNetCloseEnum( hEnum );
		Finish();
	}
};





bool EnumerateDomains( HWND hCombo, NETRESOURCE * resource )
{
	// Enumerate servers/containers in container
	HANDLE		hEnum = NULL;
	WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK, RESOURCEUSAGE_CONTAINER, resource, &hEnum );

	// Iterate, reading blocks of resources
	for (;;) {
		NETRESOURCE		NetResourceList[ 100 ];
		DWORD			NetResourceMax			= -1;
		DWORD			nb			= sizeof NetResourceList;
		DWORD			dwResult	= WNetEnumResource( hEnum, &NetResourceMax, NetResourceList, &nb );

		if ( dwResult == ERROR_NO_MORE_ITEMS ) {
			// Done!
			break;
		} else if ( dwResult != NO_ERROR )  {
			// Error!
			break;
		} else {
			// Read items
			for ( DWORD i = 0; i < NetResourceMax; i++ )  {
				NETRESOURCE	*	rp = NetResourceList + i;

				if ( g.Abort )
					break;

				if ( rp->dwDisplayType == RESOURCEDISPLAYTYPE_DOMAIN )  {
					// add to list
					SendMessage( hCombo, CB_ADDSTRING, 0, (LPARAM) rp->lpRemoteName );
					// don't recurse below domain level
					continue;
				}

				if ( (rp->dwUsage & RESOURCEUSAGE_CONTAINER) == RESOURCEUSAGE_CONTAINER )  {
					// Recurse
					EnumerateDomains( hCombo, rp );
				}
			}
		}
	}
	WNetCloseEnum( hEnum );
	return true;
}





bool ExportFile( HWND hListView, const TCHAR * path )
{
	HANDLE	hFile = CreateFile( path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
	if ( hFile == INVALID_HANDLE_VALUE )
		return false;

	LV_ITEM		lvi;
	DWORD		nb;

	// Mark file as unicode
#if UNICODE
	WORD uni = 0xFEFF;
	WriteFile( hFile, &uni, sizeof uni, &nb, NULL );
#endif

	// print headers
	for ( lvi.iSubItem = 0; lvi.iSubItem < sizeof(Columns)/sizeof(Columns[0])-1; ++lvi.iSubItem )  {
		WriteFile( hFile, _T("\""), sizeof(TCHAR), &nb, NULL );
		WriteFile( hFile, Columns[lvi.iSubItem].Title, _tcslen(Columns[lvi.iSubItem].Title)*sizeof(TCHAR), &nb, NULL );
		WriteFile( hFile, _T("\"\t"), 2*sizeof(TCHAR), &nb, NULL );
	}
	WriteFile( hFile, _T("\r\n"), 2*sizeof(TCHAR), &nb, NULL );

	// Get text
	int	max = ListView_GetItemCount( hListView );

	for ( lvi.iItem = 0; lvi.iItem < max; ++lvi.iItem )  {

		// Get item
		lvi.mask = TVIF_TEXT;

		for ( lvi.iSubItem = 0; lvi.iSubItem < sizeof(Columns)/sizeof(Columns[0])-1; ++lvi.iSubItem )  {

			TCHAR Item[ MAX_TEXT ];
			lvi.pszText		= Item;
			lvi.cchTextMax	= MAX_TEXT;

			if ( ! ListView_GetItem( hListView, &lvi ) )
				*Item = 0;

			for ( int i = 0; Item[i]; ++i )
				if ( Item[i] == ',' && Item[i+1] == ' ' )  {
					Item[i] = ' ';
					Item[i+1] = 0x0A;
				}

			WriteFile( hFile, _T("\""), sizeof(TCHAR), &nb, NULL );
			WriteFile( hFile, Item, _tcslen(Item)*sizeof(TCHAR), &nb, NULL );
			WriteFile( hFile, _T("\"\t"), 2*sizeof(TCHAR), &nb, NULL );
		}

		WriteFile( hFile, _T("\r\n"), 2*sizeof(TCHAR), &nb, NULL );
	}

	CloseHandle( hFile );

	return true;
}





INT_PTR CALLBACK AbortDialog( HWND hDlg, UINT message, UINT wParam, LONG lParam ) 
{
	RECT	parentRc, childRc;

	switch ( message )  {
		case WM_INITDIALOG:
			GetWindowRect( GetParent(hDlg), &parentRc );
			GetWindowRect( hDlg, &childRc );
			parentRc.left = ((parentRc.left + parentRc.right) - (childRc.right - childRc.left)) / 2;
			parentRc.top  = ((parentRc.top + parentRc.bottom) - (childRc.bottom - childRc.top)) / 2;
			MoveWindow( hDlg, parentRc.left, parentRc.top, childRc.right - childRc.left, childRc.bottom - childRc.top, TRUE );
			return TRUE;

		case WM_CLOSE:
			EndDialog( hDlg, 0 );
			return TRUE;

		default:
			break;
	}
    return FALSE;

}


INT_PTR CALLBACK AboutDialog( HWND hDlg, UINT message, UINT wParam, LONG lParam ) 
{
	RECT	parentRc, childRc;
	static HWND		hLink;
	static BOOL		underline_link;
	static HFONT	hFontNormal = NULL;
	static HFONT	hFontUnderline = NULL;
	static HCURSOR	hHandCursor = NULL;
	static HCURSOR	hRegularCursor;
	LOGFONT			logfont;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -