c++ - 如何枚举远程计算机上的卷?
问题描述
我在我的家庭网络中运行三台计算机,它们都在同一个工作组中。现在我想在我的计算机上找出哪些卷存在/安装在我的网络中的其他计算机上,并且我想在我的 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;
}
该代码为我提供了家庭网络中所有计算机的完美列表。现在我尝试弄清楚如何获取当前用户可以访问的卷和/或目录的名称。这可能需要我一段时间,我会带着更多的结果回来。
解决方案
我已经尝试过 NetServerDiskEnum 函数但收到 ERROR_ACCESS_DENIED。
这是因为只有Administrators或Server Operators 本地组NetServerDiskEnum
的成员才能在远程计算机上成功执行该功能。
相反,成功执行NetServerEnum函数不需要特殊的组成员身份。
还有其他功能可以解决问题吗?
考虑到您在自己的家庭网络上运行这些计算机,您可以简单地将域用户设置为具有管理员权限。
如果您不想设置管理员权限,WMI 是另一种选择。当然,实现方法会比调用复杂NetServerDiskEnum
。
使用Get-Volume获取指定的 Volume 对象,如果没有提供过滤器,则获取所有 Volume 对象。
类似案例:如何获取远程计算机的磁盘容量和可用空间
WMI 不仅可以依靠PowerShell
他们的方法来实现,还可以依靠 C++。如果你有兴趣,从这个例子中学习是一个很好的开始。
回到正题,默认情况下允许Administrators组的成员远程连接电脑。但是您可以为某些用户和组授予 DCOM 远程启动和激活权限。
推荐阅读
- powerbi-desktop - 问:Power BI,有 2 列的表被两个不同的切片器过滤
- sql - 带有 union all 的存储过程循环
- c# - 显示包含从某个基础派生的类型列表的属性编辑器
- ios - TestFlight:除非禁用“包含 iOS 内容的位码”,否则 iOS 应用程序无法完成处理
- ms-access - Access 中的唯一随机数生成
- sql - 如何在bigquery中提取第一次出现的7到10位字符串?
- amazon-web-services - 错误:错误列出 SNS 主题的标签,而策略授予该 arn 的权限
- openssl - 如何使用 openssl x509 为每个证书生成随机序列号?
- function - Powershell - 从变量调用子函数
- javascript - 将 png 转换为 gltf 3d 模型纹理 three.js 和 fabric.js