65.9K
CodeProject 正在变化。 阅读更多。
Home

简要讨论如何使用三种网络管理功能

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.44/5 (14投票s)

2004年3月15日

2分钟阅读

viewsIcon

155836

downloadIcon

1375

关于如何使用 NetShareEnum、NetConnectionEnum 和 NetFileEnum 的简要讨论

引言

本文只是对三个网络管理函数的使用进行简要讨论:NetShareEnum()NetConnectionEnum()NetFileEnum()。 前两个函数可以一起使用,以获取给定服务器上共享资源的列表,然后获取到每个共享资源的连接列表。 后一个函数用于获取服务器上打开文件的列表。 您可以在计算机管理管理工具中查看这些函数的示例。

列出共享

要获取服务器上共享资源的列表,包括函数正在运行的服务器上的共享资源,请使用 NetShareEnum()。 顾名思义,它枚举网络共享。 其用法如下:

DWORD          dwStatus,
               dwReadEntries,
               dwTotalEntries,
               dwIndex;
LPSHARE_INFO_2 pShareBuffer,
               pShareTemp;

dwStatus = NetShareEnum(_T("solomon"),
                        2,
                        (LPBYTE *) &pShareBuffer,
                        MAX_PREFERRED_LENGTH,
                        &dwReadEntries,
                        &dwTotalEntries,
                        NULL);
if (NERR_Success == dwStatus && dwSharesRead > 0)
{
    pShareTemp = pShareBuffer;
    for (dwIndex = 0; dwIndex < dwReadEntries; dwIndex++, pShareTemp++)
        ...

    NetApiBufferFree(pShareBuffer);
}

需要注意的是,对于此函数和其他两个函数,服务器名称不必以 \\ 开头。 MSDN 声明必须以 \\ 开头,但我的测试发现两种方式都可以接受。

第四个参数 prefmaxlen 指示要返回多少数据。 我找不到任何理由在这里使用 MAX_PREFERRED_LENGTH。 也许在过去,当可用 RAM 有限时。

列出共享连接

要获取先前收集的每个共享资源的连接列表,请使用 NetConnectionEnum()。 顾名思义,它枚举到网络共享的连接。 其用法如下:

DWORD               dwStatus,
                    dwConnectionsRead,
                    dwTotalConnections;
LPCONNECTION_INFO_1 pConnBuffer,
                    pConnTemp;

dwStatus = NetConnectionEnum(_T("solomon"),
                             pShareTemp->shi2_netname,
                             1,
                             (LPBYTE *) &pConnBuffer,
                             MAX_PREFERRED_LENGTH,
                             &dwConnectionsRead,
                             &dwTotalConnections,
                             NULL);
if (NERR_Success == dwStatus && dwConnectionsRead > 0)
{
    pConnTemp = pConnBuffer; 
    while (dwConnectionsRead > 0)    
    {        
        ...        
        dwConnectionsRead--;        
        pConnTemp++;
    } 

    NetApiBufferFree(pConnBuffer);
} 

第二个参数 qualifier 是先前对 NetShareEnum() 的调用返回的共享名称。 将这两个函数放在一起,会得到如下所示的结果。 我使用树形控件,以便可以看到共享及其连接之间的关系。

列出打开的文件

要获取服务器上打开文件的列表,请使用 NetFileEnum()。 顾名思义,它枚举网络上的文件。 其用法如下:

DWORD         dwIndex,
              dwStatus,
              dwReadEntries,
              dwTotalEntries;
LPFILE_INFO_3 pBuffer,
              pCurrent;

dwStatus = NetFileEnum(_T("solomon"),
                       NULL,
                       NULL,
                       3,
                       (LPBYTE *) &pBuffer,
                       MAX_PREFERRED_LENGTH,
                       &dwReadEntries,
                       &dwTotalEntries,
                       NULL);
if (NERR_Success == dwStatus && dwReadEntries > 0)
{
    pCurrent = pBuffer;    

    for (dwIndex = 0; dwIndex < dwReadEntries; dwIndex++, pCurrent++)
        ... 
    
    NetApiBufferFree(pBuffer);
}

您可以查看哪些文件已打开以及由谁打开。 关于 FILE_INFO_3 结构的 fi3_permissions 成员的一个有趣之处是,它可以有比 MSDN 注释的更多的四个值。 这些值是 ACCESS_EXECACCESS_DELETEACCESS_ATRIBACCESS_PERM

此函数的输出结果如下:

注释

这些函数中的每一个都根据调用进程的成员资格运行。 如果调用进程是管理员组的成员,则一切正常。 否则,需要额外的代码来模拟此类组的成员资格。 使用 OpenProcessToken()AdjustTokenPrivileges() 来实现此目的。

© . All rights reserved.