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

时间:2018-06-19 14:39:37

标签: uwp share file-permissions smb

我已经寻找了很长一段时间,但是对于该特定问题我找不到任何可行的解决方案。我的目标是为主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 /文件夹:

    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:\”访问的本地文件夹。还设置了文件类型关联。

我听到很多评论说UWP不支持SMB,但是我听到有关使它起作用的人的评论(尽管这对我不起作用)。我还听说SMB 1不再被允许。我真的很感谢您的帮助,因为这当然不是我的专业领域。

问候!

1 个答案:

答案 0 :(得分:1)

仅回答我自己的问题,就好像我解决了这个问题一样,我想总结一下我所做的事情(我还发现其中的一部分甚至是必要的,但也许只是暂时起作用。 ..无论哪种方式,这些都可能仍会提示):

  • 在Package.appxmanifest中添加以下功能:Internet,专用网络,邻近性,企业身份验证。
  • 在此处,还添加声明:文件类型给定文件的关联并添加“共享目标”。这些内容可以在可视显示中进行设置,无需查看代码。
  • 确保在共享文件夹中正确设置了权限,并考虑来宾权限。这是强制性的。
  • 使用正确的路径进行: 。 。 StorageFolder文件夹=等待StorageFolder.GetFolderFromPathAsync(@“ \\ 142.24.56.10 \ TestShare”);或(@“ \\ JOHNS-COMPUTER \ TestShare”);

->从那里开始,您将拥有基于您的计算机和Windows帐户授予的权限(至少我认为是这样)。

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

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

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

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