Просмотр сетевых сеансов

В операционных система Windows имеется интересный инструмент «Общие папки», являющийся средством для просмотра общих ресурсов локального компьютера, открытых сетевых сеансов и используемых файлов, для того чтобы запустить данное приложение, нужно набрать в командной строке fsmgmt.msc:
Просмотр сетевых сеансов
Хочу сразу отметить, что у данного приложения есть один большой недостаток, отсутствие автоматического обновления, вот это мы и будем исправлять. Для того чтобы наша программа могла получать данные о текущих сеансах .открытых файлах и созданных общих ресурсов компьютера, воспользуемся группой функций: Network Share Management Functions. В эту группу включены API функции по работе с протоколом Server Messaging Block (SMB), более подробно можете прочесть в соответствующей ветке MSDN. Для возможности реализации функций приложения «Общие папки», использовалась среда разработки MS Visual Studio 6.0, тип проекта, основанный на диалоге. Далее будут приведены исходные тексты функций, вывод информации осуществляется в элемент управления «Edit Box».

Функция перечисления сессий:

LPSESSION_INFO_10 pBuf = NULL;
DWORD dwPrefMaxLen     = MAX_PREFERRED_LENGTH;
DWORD dwEntriesRead    = 0;
DWORD dwTotalEntries   = 0;
DWORD dwResumeHandle   = 0;
DWORD i;
NET_API_STATUS nStatus;
 
        do
        {
                nStatus = NetSessionEnum(NULL,NULL,NULL,10,(LPBYTE*)&pBuf,dwPrefMaxLen,
                                                                 &dwEntriesRead,&dwTotalEntries,&dwResumeHandle);
 
                if ((nStatus == NERR_Success) || (nStatus == ERROR_MORE_DATA))
                {
                        if (pBuf != NULL)
                        {
                                for (i=0;i<dwEntriesRead;i++)
                                {
                                        SetTextEdit((LPCWSTR)pBuf->sesi10_cname);
                                        SetTextEdit((LPCWSTR)pBuf->sesi10_username);
                                        FileEnum((char *)pBuf->sesi10_username);
                                        pBuf++;
                                }
                         }
                  }else SetTextEdit("A system error has occurred"+nStatus);
     
        }while (nStatus == ERROR_MORE_DATA);
 
NetApiBufferFree(pBuf);pBuf = NULL;

Функция перечисления открытых файлов:

void CNetSessionDlg::FileEnum(char * mk)
{
        LPFILE_INFO_3          pBuf = NULL;
        DWORD dwPrefMaxLen     = MAX_PREFERRED_LENGTH;
        DWORD dwEntriesRead    = 0;
        DWORD dwTotalEntries   = 0;
        DWORD dwResumeHandle   = 0;
        DWORD i;
        NET_API_STATUS nStatus;
 
        do
        {
                nStatus = NetFileEnum(NULL,NULL,mk,3,
                                                         (LPBYTE*)&pBuf,
                                                         dwPrefMaxLen,
                                                         &dwEntriesRead,
                                                         &dwTotalEntries,
                                                         &dwResumeHandle);
                if ((nStatus == NERR_Success) || (nStatus == ERROR_MORE_DATA))
                {
                        if (pBuf != NULL)
                        {
                                for (i=0;i<dwEntriesRead;i++)
                                {
                                        SetTextEdit((LPCWSTR)pBuf->fi3_pathname);
                                    pBuf++;
                                }
                        }
                }else SetTextEdit("A system error has occurred"+nStatus);
      
        }while (nStatus == ERROR_MORE_DATA);
 
NetApiBufferFree(pBuf);pBuf = NULL;
 
}

Функция вывода информации в Edit Box:

void CNetSessionDlg::SetTextEdit(CString m_string)
{
        m_string += "\r\n";
        m_edit_log.SetSel(m_edit_log.GetWindowTextLength(),
                          m_edit_log.GetWindowTextLength());
        m_edit_log.ReplaceSel(m_string);
        
}

Результат работы программы:
Просмотр сетевых сеансов