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



我现在正在寻找很长时间,但我只是找不到针对这个特定问题的任何工作解决方案。我的目标是为主 HoloLens 应用程序创建一个后台应用程序(这意味着必须在 UWP 中完成(,该应用程序应该能够访问本地文件和本地网络 (SMB(,以便它可以映射文件层次结构,以便将它们中继到 Unity 中的主应用程序,该应用程序将以 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>'

到目前为止,我还没有成功地对与 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:\"访问的本地文件夹。还设置了文件类型关联。

我听到很多评论说 UWP 不支持 SMB,但我听到了关于让它工作的人的评论(虽然这对我不起作用(。我还听说 SMB 1 不再被允许了。我真的很感激任何帮助,因为这肯定不是我的专业领域。

问候!

只是为了回答我自己的问题,因为似乎我解决了它,我想总结一下我所做的(我也发现其中只有一部分甚至是必要的,但也许这只是暂时的......无论哪种方式,这些可能仍然会给出提示(:

  • 在 Package.appxmanifest 中添加旋转的功能:Internet、专用网络、邻近性、企业身份验证。
  • 在那里,还要添加声明:给定文件的文件类型关联,并添加"共享目标"。这些东西可以在可视化显示中设置,不需要代码视图。
  • 确保在共享文件夹中正确设置了权限,并考虑来宾权限。这是强制性的。
  • 将正确的路径用于: . . .StorageFolder folder = await StorageFolder.GetFolderFromPathAsync (@"\\142.24.56.10\TestShare"(;或 (@"\\JOHNS-COMPUTER\TESTShare"(;

->从那里开始,您可以根据您的计算机和Windows帐户授予权限(至少我假设(。

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

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

另一个信息:"broadFileSystemAccess"也非常有用,它减轻了标准文件类型的限制。没有这个,您将无法获得未声明的文件和没有扩展名的文件。不过,它有自己的规则,请阅读它。

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

最新更新