首页 > 解决方案 > 如何枚举远程计算机上的卷?

问题描述

我在我的家庭网络中运行三台计算机,它们都在同一个工作组中。现在我想在我的计算机上找出哪些卷存在/安装在我的网络中的其他计算机上,并且我想在我的 C++/C# 代码中执行此操作。

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

有人对我有提示吗?

更新 (2021-04-08) 感谢 Alan,他给了我很多尝试。我决定继续使用不需要任何提升权限的 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;
}

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

标签: c++winapiremote-accessremote-server

解决方案


我已经尝试过 NetServerDiskEnum 函数但收到 ERROR_ACCESS_DENIED。

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

参考:NetServerDiskEnum 备注

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

还有其他功能可以解决问题吗?

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

参考:如何设置域用户的管理员权限?

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

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

类似案例:如何获取远程计算机的磁盘容量和可用空间

WMI 不仅可以依靠PowerShell他们的方法来实现,还可以依靠 C++。如果你有兴趣,从这个例子中学习是一个很好的开始。

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

步骤:设置 DCOM 安全性以允许用户远程访问计算机


推荐阅读