如何枚举远程计算机上的卷?

How to Enumerate Volumes on Remote Computer?

我的家庭网络中有 运行 三台计算机,都在同一个工作组中。现在我想在我的计算机上找出哪些卷在我网络中的其他计算机上是 present/mounted,我想在我的 C++/C# 代码中完成。

方法 NetServerEnum 工作正常并在我的网络中提供计算机名称,但现在我卡住了,无法识别列出此类命名 'remote' 计算机的卷的函数。我已经尝试过函数 NetServerDiskEnum 但收到 ERROR_ACCESS_DENIED。还有其他功能可以解决问题吗? (任何文件对话框都可以执行此操作,但我需要将其包含到我的代码中 - 而且无需操作员干预。

有人给我提示吗?

更新 (2021-04-08) 感谢艾伦,他给了我很多尝试的机会。我决定继续使用不需要任何提升权限的 WNetEnumResource。这是我的代码:

#include <windows.h>

int main ( int nArgc, char** lppszArgv )
{
    DWORD ErrCode;
    HANDLE hEnum;
    DWORD dwCount;
    DWORD BfSize = 0x1000;

    ErrCode = WNetOpenEnum ( RESOURCE_CONTEXT, RESOURCETYPE_ANY, RESOURCEUSAGE_ALL, NULL, &hEnum );
    if ( ErrCode == NO_ERROR )
    {
        BYTE ucBuffer[0x1000];
        NETRESOURCE* lpNr = (NETRESOURCE*)ucBuffer;

        do
        {
            dwCount = 1;
            ErrCode = WNetEnumResource ( hEnum, &dwCount, ucBuffer, (LPDWORD)&BfSize );
        }
        while ( ErrCode == NO_ERROR && dwCount == 1 );

        ErrCode = WNetCloseEnum ( hEnum );
    }

    return 0;
}

该代码为我提供了家庭网络中所有计算机的完美列表。现在我试着弄清楚如何获取当前用户有权访问的卷 and/or 目录的名称。这可能需要我一段时间,我会带来更多结果。

I have already tried function NetServerDiskEnum but receive ERROR_ACCESS_DENIED.

这是因为只有 AdministratorsServer Operators 本地组 的成员才能成功执行 NetServerDiskEnum 功能远程计算机。

参考:NetServerDiskEnum Remarks

相反,成功执行 NetServerEnum 功能不需要特殊的组成员身份。

Is there another function that does the trick?

考虑到你是运行这些计算机在你自己的家庭网络中,你可以简单地设置域用户具有管理员权限。

参考:How to set administrator rights to domain user?

如果您不想设置管理员权限,WMI 是另一种选择。当然,实现方法会比调用NetServerDiskEnum.

复杂一些

使用 Get-Volume 获取指定的 Volume 对象,如果没有提供过滤器,则获取所有 Volume 对象。

相似案例:How to get disk capacity and free space of remote computer

WMI不仅可以依赖PowerShell来实现它们的方法,还可以依赖C++。有兴趣的可以从this example.

开始学习

回到正题,默认允许Administrators组成员远程连接电脑。但您可以为某些用户和组授予 DCOM 远程启动和激活权限。

步数:Setting DCOM Security to Allow a User to Access a Computer Remotely