【问题标题】:How to access local network (SMB) in UWP?如何在 UWP 中访问本地网络 (SMB)?
【发布时间】:2018-06-19 14:39:36
【问题描述】:

我现在正在寻找很长一段时间,但我找不到任何有效的解决方案来解决这个特定问题。我的目标是为主 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 地址的错误消息。

使用存储文件/文件夹:

    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,我不能依赖文件选择器,因为它目前没有。无论如何,选择器似乎仍然可以工作,如果我可以创建一个自定义文件选择器,那也是一个可以接受的解决方案......如果可能的话。

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

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

您好!

【问题讨论】:

  • 你能分享更多关于 smb 个人资料的细节吗?
  • 问题自行解决。这是一个愚蠢的错误,尽管我不确定。最近几天我可能只使用了通往 IP 的路径,我在其中进行了更改,可能附带解决了问题。

标签: uwp share file-permissions smb


【解决方案1】:

只是为了回答我自己的问题,看起来我已经解决了,我想总结一下我做了什么(我还发现其中只有一部分是必要的,但也许这只是暂时的。 ..无论哪种方式,这些都可能会给出提示):

  • 在 Package.appxmanifest 中添加循环功能:Internet、Private Networks、Proximity、Enterprise Authentification。
  • 在那里,还添加声明:给定文件的文件类型关联并添加“共享目标”。这些东西可以在可视化展示中设置,不需要代码视图。
  • 确保在共享文件夹中正确设置了权限,并考虑来宾权限。这是必填项。
  • 使用正确的路径: 。 . . StorageFolder 文件夹 = 等待 StorageFolder.GetFolderFromPathAsync (@"\\142.24.56.10\TestShare");或 (@"\\JOHNS-COMPUTER\TestShare");

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

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

编辑:似乎罪魁祸首实际上是我的“共享目标”声明。如果您声明了 0 个文件类型关联,或者您没有声明“共享目标”,则它将不起作用。

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

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

【讨论】:

  • 访问 samba 共享似乎可以在默认的 c++/winrt 单页项目中工作(我使用了文件选择器)。我得到零个文件,因为我在提交给 CreateFileQueryWithOptions 的查询选项中使用了 IndexerOption::OnlyUseIndexer。
猜你喜欢
  • 2015-09-08
  • 1970-01-01
  • 1970-01-01
  • 2021-05-22
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 2017-05-08
  • 2019-02-18
相关资源
最近更新 更多