Вернуться к статье


 

Таблица 1. Типы ACE и соответствующие им структуры данных.
Тип записи контроля доступа Наименование соответствующей структуры
ACCESS_ALLOWED_ACE_TYPE ACCESS_ALLOWED_ACE
ACCESS_ALLOWED_OBJECT_ACE_TYPE ACCESS_ALLOWED_OBJECT_ACE
ACCESS_DENIED_ACE_TYPE ACCESS_DENIED_ACE
ACCESS_DENIED_OBJECT_ACE_TYPE ACCESS_DENIED_OBJECT_ACE.
SYSTEM_AUDIT_ACE_TYPE SYSTEM_AUDIT_ACE
SYSTEM_AUDIT_OBJECT_ACE_TYPE SYSTEM_AUDIT_OBJECT_ACE

 

Таблица 2. Описание параметров функции GetVolumeInformation.
IN lpRootPathName Корневой каталог раздела
OUT lpVolumeNameBuffer Имя дискового раздела
IN nVolumeNameSize Размер буфера, в котором возвращается имя раздела
OUT lpVolumeSerialNumber Номер дискового раздела
OUT LpMaximumComponentLength Максимальная длина имени файла, возможная для этого раздела
OUT lpFileSystemFlags Набор флагов, описывающих св-ва раздела
OUT lpFileSystemNameBuffer Буфер, в котором будет возвращено название операционной системы
IN nFileSystemNameSize Размер буфера, в котором возвращается имя операционной системы

 


Вернуться к статье


 

Листинг 1. Список дисковых разделов на локальном компьютере.

void LoadDrives() 
{ 
LPBYTE lpBuf; 
DWORD dwReaded; 
DWORD dwTotal; 
PWCHAR      p; 
DWORD        i; 
CString      csStr; 
CString      csFileSystemName; 
int        nItem; 
BOOL        bIsACL; 
if( NetServerDiskEnum( NULL,0,&lpBuf,MAX_ 
PREFERRED_ LENGTH,&dwReaded, 
&dwTotal,NULL ) == NERR_Success ) 
{ 
p = (PWCHAR)lpBuf; 
for( i = 0; i < dwReaded; i++ ) 
{ 
csStr = p; 
csStr = csStr + "\\"; 
nItem = m_listDrive.InsertItem( i,csStr,0); 
GetPartitionTypeEx( csStr,csFileSystemName, 
bIsACL ); 
… 
p = p + 3; 
} 
NetApiBufferFree( lpBuf ); 
} 
}

 


Вернуться к статье


 

Листинг 2. Информация о логическом дисковом разделе.

int GetPartitionTypeEx( LPCTSTR szName, CString &csFileSystemName, BOOL &bIsACL ) 
{ 
char szVolumeNameBuffer[MAX_PATH + 1]; 
DWORD dwMaximumComponentLength; 
DWORD dwFileSystemFlags; 
DWORD dwVolumeSerialNumber; 
char szFileSystemNameBuffer[MAX_PATH + 1]; 
if( GetVolumeInformation( szName, szVolumeNameBuffer, MAX_PATH, &dwVolumeSerialNumber, 
&dwMaximumComponentLength, &dwFileSystemFlags, szFileSystemNameBuffer, MAX_PATH ) ) 
{ 
csFileSystemName = szFileSystemNameBuffer; 
bIsACL = ( dwFileSystemFlags & FS_PERSISTENT_ACLS ) == FS_PERSISTENT_ACLS; 
} 
else 
{ 
csFileSystemName = "unknown"; 
bIsACL = FALSE; 
} 
return 1; 
}

 


Вернуться к статье


 

Листинг 3. Получение информации о правах доступа к объекту.

BOOL GetObjectPermissions( LPTSTR szObjectName ) 
{ 
PSECURITY_DESCRIPTOR lpSec; 
PACL pDACL; 
PSID lpOwnerSID; 
SID_NAME_USE eUse; 
TCHAR szName[ACE_NAME_SIZE + 1]; 
unsigned long nNameSize = ACE_NAME_SIZE; 
TCHAR szDomain[ACE_NAME_SIZE + 1]; 
unsigned long nDomainSize = ACE_NAME_SIZE; 
int i;  ACE_HEADER *lpACEHeader; 
ACCESS_ALLOWED_ACE *lpAllowedACE; 
LPOBJECTACCESS_MASK lpAccess; 
if( GetNamedSecurityInfo( szObjectName, SE_FILE_OBJECT, DACL_ 
SECURITY_INFORMATION, (void**)&lpOwnerSID, NULL, &pDACL, 
NULL, NULL ) == ERROR_SUCCESS ) 
{ 
if( ( pDACL != NULL ) && ( pDACL->AceCount > 0 ) ) 
{ 
lpACEHeader = (ACE_HEADER*)((char*)pDACL + sizeof(ACL) ); 
i = 0; 
while( GetAce( pDACL,i,(void**)&lpACEHeader ) ) 
{ 
nNameSize = ACE_NAME_SIZE; 
nDomainSize = ACE_NAME_SIZE; 
switch( lpACEHeader->AceType ) 
{ 
case ACCESS_ALLOWED_OBJECT_ACE_TYPE: 
break; 
case ACCESS_DENIED_ACE_TYPE: 
break; 
case ACCESS_DENIED_OBJECT_ACE_TYPE: 
break; 
case ACCESS_ALLOWED_ACE_TYPE: 
lpAllowedACE = (ACCESS_ALLOWED_ACE*)lpACEHeader; 
if( LookupAccountSid( NULL, (void*)&lpAllowedACE->SidStart, 
szName, &nNameSize, szDomain, &nDomainSize, &eUse ) ) 
{ 
lpAccess = (LPOBJECTACCESS_MASK)&lpAllowedACE 
->Mask; 
if( lpAccess->StandardRights == 31 ) 
{ 
// Full Control          
} 
if( lpAccess->StandardRights == 18 ) 
{ 
// Read 
} 
if( lpAccess->StandardRights == 19 ) 
{ 
// Write (change) 
} 
} 
break; 
} 
i++; 
} 
……… 
LocalFree( lpSec ); 
} 
} 
return TRUE; 
}

 


Вернуться к статье


 

Листинг 4. Получение списка разделяемых ресурсов и прав на них.

void ScanShares( … ) 
{ 
DWORD dwReaded; 
DWORD dwTotal; 
LPSHARE_INFO_502 lpShareInfo; 
LPSHARE_INFO_502 lpShare; 
PSECURITY_DESCRIPTOR lpSecDescr; 
BOOL bDaclPresent; 
PACL pDACL; 
BOOL bDaclDefaulted; 
DWORD i; 
int j; 
ACE_HEADER *lpACEHeader; 
ACCESS_ALLOWED_ACE *lpAllowedACE; 
TCHAR szName[ACE_NAME_SIZE + 1]; 
unsigned long nNameSize  = ACE_NAME_SIZE; 
TCHAR szDomain[ACE_NAME_SIZE + 1]; 
unsigned long nDomainSize  = ACE_NAME_SIZE; 
SID_NAME_USE eUse; 
TCHAR szBuf[ACE_NAME_SIZE + 1]; 
CString csShareName; 
CString csPath; 
CString csCommand; 
CString csDelCommand; 
TCHAR szCompName[MAX_COMPUTERNAME_LENGTH + 1]; 
DWORD dwCompNameSize   = MAX_COMPUTERNAME_LENGTH; 
LPOBJECTACCESS_MASK  lpAccess; 
m_nSharesCount = 0; 
if( NetShareEnum( NULL,502,(LPBYTE*)&lpShareInfo,0xFFFFFFFF, 
&dwReaded,&dwTotal,NULL ) == NERR_Success ) 
{ 
for( i = 0; i < dwReaded; i++ ) 
{ 
WideCharToMultiByte( CP_ACP,0,(unsigned short*)lpShareInfo[i] 
.shi502_path,-1,szBuf,ACE_NAME_SIZE,NULL,NULL ); 
csPath = szBuf;      
if( IsPathExists( csPath ) || ( !m_checkShareValid.GetCheck() ) ) 
{ 
if( NetShareGetInfo( NULL,lpShareInfo[i].shi502_netname,502, 
(LPBYTE*)&lpShare ) == NERR_Success ) 
{ 
lpSecDescr = lpShare->shi502_security_descriptor; 
if( lpSecDescr != NULL ) 
{ 
if( GetSecurityDescriptorDacl( lpSecDescr,&bDaclPresent, 
&pDACL,&bDaclDefaulted ) ) 
{ 
j = 0; 
while( GetAce( pDACL,j,(void**)&lpACEHeader ) ) 
{ 
nNameSize = ACE_NAME_SIZE; 
nDomainSize = ACE_NAME_SIZE; 
switch( lpACEHeader->AceType ) 
{ 
case ACCESS_ALLOWED_ACE_TYPE: 
lpAllowedACE = (ACCESS_ALLOWED_ACE*)lpACEHeader; 
if( LookupAccountSid( NULL,(void*)&lpAllowedACE->SidStart, 
szName,&nNameSize, szDomain,&nDomainSize, &eUse ) ) 
{ 
lpAccess = (LPOBJECTACCESS_MASK) 
&lpAllowedACE->Mask; 
if( lpAccess->StandardRights == 31 
{ 
… 
} 
else 
{ 
if( lpAccess->StandardRights == 18 ) 
{ 
… 
} 
else 
{ 
if( lpAccess->StandardRights == 19 ) 
} 
… 
} 
} 
} 
} 
break; 
} 
j++; 
} 
} 
} 
NetApiBufferFree( (LPVOID)lpShare ); 
WriteStringToFile( hFile,TRUE,csDelCommand ); 
WriteStringToFile( hFile,TRUE,csCommand ); 
m_nSharesCount++; 
ShowStatistics(); 
} 
} 
} 
NetApiBufferFree( (LPVOID)lpShareInfo ); 
} 
} 

 


Вернуться к статье