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

如何在UWP中访问本地网络(SMB)?,uwp,share,file-permissions,smb,Uwp,Share,File Permissions,Smb,我正在寻找相当长的一段时间了,但我只是找不到任何工作的解决方案,为这个特定的问题。我的目标是为主HoloLens应用程序创建一个后台应用程序(这意味着它必须在UWP中完成),它应该能够访问本地文件和本地网络(SMB),以便它能够映射文件层次结构,以便将它们以统一的方式中继到主应用程序,该应用程序将以3D/2D方式显示文件 到目前为止,我尝试了几种方法,包括:常规的StorageFolder/StorageFile交互(如果这一方法有效,那就太好了,因为已经实现了本地文件交互)、SharpCifs

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

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

夏普CIFS:

    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>'
后者成功地获取了文件夹,但未能对其执行任何操作。但这是我能做的最远的了。我还启用了以下功能:

<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交互不需要用户名和密码(因此失败?)。我看到必须添加这些功能。。。但这并不是所需要的全部。文件选择器也只是解决本地文件权限问题的解决方案,但不能解决网络问题(客户端不能允许自己访问主机上的文件)。另外,对于全息镜头,我不能依赖文件选择器,因为它目前没有。无论如何,选择器似乎仍然可以工作,如果我可以创建一个自定义文件选择器,那也是一个可以接受的解决方案。。。如果可能的话

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

我听到不少评论说UWP不支持SMB,但我听到一些评论说是谁让它起作用的(虽然这对我来说不起作用)。我还听说SMB 1不再被允许。我非常感谢您的帮助,因为这肯定不是我的专业领域


你好

为了回答我自己的问题,似乎我已经解决了这个问题,我想总结一下我所做的事情(我还发现这其中只有一部分是必要的,但可能只是暂时起作用……无论哪种方式,这些都可能会给你一个提示):

  • 在Package.appxmanifest中添加以下功能:Internet、专用网络、邻近性、企业身份验证
  • 同时,还要添加声明:给定文件的文件类型关联,并添加“共享目标”。这些东西可以设置在可视化显示中,不需要代码视图
  • 确保在共享文件夹中正确设置权限并考虑客户权限。这是强制性的
  • 使用正确的路径:。StorageFolder folder=Wait StorageFolder.GetFolderFromPathAsync(@“\\142.24.56.10\TestShare”);或(@“\\JOHNS-COMPUTER\TestShare”)
->从那时起,您就拥有了基于您的计算机和windows帐户授予的权限(至少我认为是这样)

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

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

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


一个小提示:Visual Studio在xml中将其标为绿色,好像有错误一样,但它仍然有效。

您能否分享有关smb配置文件的更多详细信息?问题自行解决。这是一个愚蠢的错误,尽管我不确定。最近几天,我可能只使用了到IP的路径,在这几天中,我做了一些更改,这些更改可能解决了相关问题。在默认的c++/winrt单页项目中,访问samba共享似乎是可行的(我使用了一个文件选择器)。我没有得到任何文件,因为我在提交给CreateFileQueryWithOptions的查询选项中使用了IndexerOption::OnlyUseIndexer。
<Capabilities>
    <Capability Name="internetClientServer" />
    <Capability Name="internetClient" />
    <Capability Name="privateNetworkClientServer" />
    <uap:Capability Name="sharedUserCertificates" />
    <uap:Capability Name="enterpriseAuthentication" />
    <DeviceCapability Name="proximity" />
</Capabilities>