【问题标题】:How to Enumerate Volumes on Remote Computer?如何枚举远程计算机上的卷?
【发布时间】:2021-04-09 01:37:13
【问题描述】:

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

方法 NetServerEnum 工作正常,并在我的网络中提供计算机名称,但现在我卡住了,无法识别列出此类命名“远程”计算机的卷的函数。我已经尝试过 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;
}

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

【问题讨论】:

  • @Alan:谢谢你的评论。我会试一试,让你知道我的成功。
  • 嗨,这个例子需要我一段时间。我已经使用 C# 多年了,必须重新学习才能使用 C++。
  • @Alan:嘿,函数 NetShareEnum 对我有用。问题是我必须使用 level=1 (而不是需要管理员权限的 level=2)。而且我不必使用 C++(这可能非常强大,但要花费我太多时间才能达到足够的水平。谢谢。

标签: c++ winapi remote-access remote-server


【解决方案1】:

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

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

参考:NetServerDiskEnum Remarks

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

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

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

参考: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

【讨论】:

  • 感谢您快速详细的回复——给了我很多尝试。我回来告诉你结果。
  • 太糟糕了,我没有仔细阅读 NetDiskServerEnum 的文档。确实,我希望代码以当前用户代码的权限执行。
  • 嗨,这个答案能解决你的问题吗?如果您有任何问题,请随时告诉我,如果有帮助也请接受。
  • 嗨,我还没说完。剩下的最后一件事是查看“这个例子”,但我无法让它工作(还没有?)。即使我提供了用户名和密码,该方法也无法连接到任何服务器并以错误代码终止。详细说明这个例子将花费我一些时间。我已经使用 C# 多年,现在必须重新学习才能使用 C++。
  • @Strive Sun:再次感谢您的详细回答;它让我走上了正轨。我已恢复为 NetShareEnum,它为我提供了我需要的信息(假设该级别不需要管理员权限)。
猜你喜欢
  • 2013-08-04
  • 1970-01-01
  • 2013-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-02
  • 1970-01-01
相关资源
最近更新 更多