如何在 UWP 中访问本地网络 (SMB)?

How to access local network (SMB) in UWP?

我已经找了很长时间了,但就是找不到针对这个特定问题的任何有效解决方案。我的目标是为主要的 HoloLens 应用程序创建一个后台应用程序(这意味着它必须在 UWP 中完成),它应该能够访问本地文件和本地网络 (SMB),以便它可以将文件层次结构映射到为了将它们中继到 Unity 中的主应用程序,它将以 3D/2D 方式显示文件。

到目前为止,我尝试了几种方法,包括:常规 StorageFolder/StorageFile 交互(如果这个能用就太好了,因为本地文件交互已经实现),SharpCifs.Smb 和 Xb.Net.SmbTree.

SharpCifs:

    public SmbFile GetFile ()
    {
        //smb://UserName:Password@ServerIP/ShareName/Folder/FileName.txt
        SmbFile file = new SmbFile ("smb:\winAccName:password@123.45.67.11\TestShare");
        file.Connect (); // Or any file action.
        return file;
    }
    // Exception User-Unhandled -- SharpCifs.Util.Sharpen.UnknownHostException: '..MSBROWSE__.<01>'

直到现在我都没有成功地对与 SmbFile 相关的所有事情做任何事情。通常我会收到无法连接到 IP 地址的错误消息。

与StorageFile/Folders:

    async public void OpenFile ()
    {
        StorageFolder folder = await StorageFolder.GetFolderFromPathAsync ("\\ServerName.local");
        if (folder != null) CreateMessage ("Got the folder: " + folder.Name);

        StorageFile file = await folder.GetFileAsync ("abc.txt");
        CreateMessage ("Success: " + file.Path);
    }
    // Exception User-Unhandled -- System.Runtime.InteropServices.COMException: 'Error HRESULT E_FAIL has been returned from a call to a COM component.'

后一个成功获取到文件夹,但没有对其进行任何操作。但那是我到目前为止能做的最远的。我还启用了以下功能:

<Capabilities>
    <Capability Name="internetClientServer" />
    <Capability Name="internetClient" />
    <Capability Name="privateNetworkClientServer" />
    <uap:Capability Name="sharedUserCertificates" />
    <uap:Capability Name="enterpriseAuthentication" />
    <DeviceCapability Name="proximity" />
</Capabilities>

我想我遇到了权限问题,我想知道为什么 SmbTree / SmbFile 交互一直需要用户名和密码,而 StorageFile/StorageFolder 交互不要求它(因此失败?)。我看到必须添加功能......但这并不是所需要的全部。文件选择器也只是解决本地文件权限问题的解决方案,而不是网络的解决方案(客户端不能允许自己访问主机上的文件)。另外,对于 HoloLens,我不能依赖文件选择器,因为它目前有 none。无论如何,选择器似乎仍然有效,如果我可以创建一个自定义文件选择器,那也是一个可以接受的解决方案……如果可能的话。

Ps: 我也试过 运行 Visual Studio 作为管理员。并且还设置了共享文件夹权限(即使是访客)。当前共享文件夹是可通过 "A:\" 访问的本地文件夹。还设置了文件类型关联。

我听到很多评论说 UWP 不支持 SMB,但我听到有关使它起作用的人的评论(虽然对我不起作用)。我还听说不再允许使用 SMB 1。如果有任何帮助,我将不胜感激,因为这当然不是我的专业领域。

您好!

只是为了回答我自己的问题,因为看起来我已经解决了它,我想总结一下我所做的事情(我也发现其中只有一部分是必要的,但也许只是继续工作暂时......无论哪种方式,这些可能仍然会给出提示):

  • 在 Package.appxmanifest 中添加围绕以下方面的功能:Internet、专用网络、接近度、企业身份验证。
  • 同时添加声明:给定文件的文件类型关联并添加 "Share Target"。这些东西都可以在可视化展示中设置,不需要代码查看。
  • 确保在共享文件夹中正确设置权限,同时考虑来宾权限。这个是必须的。
  • 使用正确的路径:。 . . StorageFolder 文件夹 = await StorageFolder.GetFolderFromPathAsync (@"\\142.24.56.10\TestShare");或 (@"\\JOHNS-COMPUTER\TestShare");

-> 从那里开始,您将获得基于您的计算机和 windows 帐户授予的权限(至少我假设)。

不需要其他任何东西:既不是特殊的身份验证,也不是 SMB 特定的库。它仅通过 StorageFile/StorageFolder 系统工作,并且可以使用与本地文件系统相同的方法导航网络。

编辑:看来罪魁祸首实际上是我的 "Share Target" 声明。如果您声明了 0 个文件类型关联,或者您没有声明 "Share Target",它将不起作用。

另一个信息:"broadFileSystemAccess" 也很有用,它可以让您摆脱标准文件类型的限制。没有这个,您将无法获得未声明的文件和没有扩展名的文件。虽然它有自己的规则,请仔细阅读。

一个小提示:Visual Studio 在 xml 中用绿色下划线,好像有错误,但它仍然有效。