如何枚举远程计算机上的卷?
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.
这是因为只有 Administrators 或 Server Operators 本地组 的成员才能成功执行 NetServerDiskEnum
功能远程计算机。
相反,成功执行 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
我的家庭网络中有 运行 三台计算机,都在同一个工作组中。现在我想在我的计算机上找出哪些卷在我网络中的其他计算机上是 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.
这是因为只有 Administrators 或 Server Operators 本地组 的成员才能成功执行 NetServerDiskEnum
功能远程计算机。
相反,成功执行 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