C# 服务器共享可以在Windows文件资源管理器中列出,但net view\\MyServerName返回错误53

C# 服务器共享可以在Windows文件资源管理器中列出,但net view\\MyServerName返回错误53,c#,windows,network-share,C#,Windows,Network Share,我正在努力寻找在远程服务器上获取共享列表的方法。该服务器是一个基于Linux的视频服务器,在更改设置等方面,我无法访问它。 我的问题是,在本地计算机上启动服务器客户端管理器软件后,只需输入\\MyServerName作为路径,就可以在普通的文件资源管理器窗口中列出所有共享 但所有试图通过net view或C#DirectoryInfo(..)访问共享列表的人都返回错误53。 我尝试了在网上找到的所有想法: 在本地计算机用户帐户vault中添加登录名 net use\\MyServerName/u

我正在努力寻找在远程服务器上获取共享列表的方法。该服务器是一个基于Linux的视频服务器,在更改设置等方面,我无法访问它。 我的问题是,在本地计算机上启动服务器客户端管理器软件后,只需输入\\MyServerName作为路径,就可以在普通的文件资源管理器窗口中列出所有共享 但所有试图通过net view或C#DirectoryInfo(..)访问共享列表的人都返回错误53。 我尝试了在网上找到的所有想法:

  • 在本地计算机用户帐户vault中添加登录名
  • net use\\MyServerName/user:MyID MyPassword
  • PowerShell获取WmiObject Win32_MappedLogicalDisk-计算机|选择名称,提供程序名称(返回RPC服务器不可用)
  • 奇怪的是,文件资源管理器在列出共享时没有问题! 如果我使用服务器上的一个现有共享创建DirectoryInfo,则它可以正常工作:

    var d = new DirectoryInfo(@"\\MyServerName\OneOfTheShares");
    
    我知道DirectoryInfo不能只使用服务器名。它需要一个文件夹。但我不明白的是,为什么文件资源管理器可以列出共享,而
    net view\\MyServerName
    不能


    谁能帮我想一想吗?

    好吧,被安东·安皮洛戈夫戏弄了;-)为了对这个问题进行WinApi分析,我找到了Rob Manderson的一个有16年历史的代码项目 这让我走上了正确的道路:-) 通过使用WNetEnumResource枚举连接的服务器资源,并使用已知的服务器名称对其进行筛选,我可以返回该服务器上所有共享的列表

    result = WNetOpenEnum(scope, type, usage, pRsrc, out handle);
    if (result == ErrorCodes.NO_ERROR)
    {
        do
        {
            result = WNetEnumResource(handle, ref cEntries, buffer, ref bufferSize);
            if (result == ErrorCodes.NO_ERROR)
            {
                Marshal.PtrToStructure(buffer, pRsrc);
                if(pRsrc.lpRemoteName.StartsWith(<MyServerName>))
            {
                 Shares.Add(pRsrc.lpRemoteName);
            }
        }
        else if (result != ErrorCodes.ERROR_NO_MORE_ITEMS)
            break;
    } while (result != ErrorCodes.ERROR_NO_MORE_ITEMS);
    
    WNetCloseEnum(handle);
    
    result=WNetOpenEnum(范围、类型、用法、pRsrc、输出句柄);
    如果(结果==错误代码。无错误)
    {
    做
    {
    结果=WNetEnumResource(句柄、引用中心、缓冲区、引用缓冲区大小);
    如果(结果==错误代码。无错误)
    {
    结构(缓冲区,pRsrc);
    if(pRsrc.lpRemoteName.StartsWith())
    {
    Shares.Add(pRsrc.lpRemoteName);
    }
    }
    else if(结果!=错误代码。错误\u无\u更多项目)
    打破
    }while(结果!=ErrorCodes.ERROR\u NO\u MORE\u ITEMS);
    WNetCloseEnum(句柄);
    
    }

    代码显然需要一些整理,但它是有效的!
    塔克斯

    Samba共享不仅可以包含文件夹,还可以包含打印机等。。。所以不能使用DirectoryInfo列出它。我考虑使用WiAPI获取股票的列表。