📄 shareenum.cpp
字号:
{
}
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 + -