使用Win32 API拒绝UWP文件夹访问权限

时间:2016-06-29 03:49:47

标签: uwp

我正在移植libgit2以获得Git GUI for UWP。方案是让用户使用FolderPicker::PickSingleFolderAsync选择一个存储库文件夹,然后将其添加到FutureAccessList,以便应用程序可以访问它以获取常用的Git功能。问题是底层的Git代码在很大程度上依赖于Win32 API文件和文件夹访问权限,例如FindFirstFileMoveFileEx,...用于文件和文件夹statopen, ...并且在尝试访问时,应用程序报告权限被拒绝。 (该代码适用于应用程序本地存储中的文件夹。我还检查过通常stdio只在那里工作。除此之外不能fopen。)

这是否有可行的解决方案?不应该在不同支持的API中获得许可,我可能错过了什么? (我不敢尝试移植libgit2所需的所有POSIX。一方面,它将保证效率低下。另一方面,它极易出错,如写mmapopen配合得很好。)

1 个答案:

答案 0 :(得分:1)

实现这样的事情不可能

根据@RobCaplan https://blogs.msdn.microsoft.com/wsdevsol/2012/12/04/skip-the-path-stick-to-the-storagefile/,微软的天才发明了一种安全存储解决方案,既不强安全也不<强>向后兼容又名制作开发者&#39;生活更轻松:用户授予应用StorageFolder后,应用可能会使用提供的StorageFile API对其造成严重破坏。以下代码

auto folderPicker = ref new Windows::Storage::Pickers::FolderPicker();
folderPicker->FileTypeFilter->Clear();
folderPicker->FileTypeFilter->Append("*");

create_task(folderPicker->PickSingleFolderAsync()).then([](Windows::Storage::StorageFolder^ folder)
{
    if (folder == nullptr)
        cancel_current_task();
    Windows::Storage::AccessCache::StorageApplicationPermissions::FutureAccessList->Add(folder);
    create_task(folder->GetItemsAsync()).then([](IVectorView<IStorageItem^>^ items)
    {
        // Delete the folder content or encrypt it and demand money
        auto iter = items->First();
        while (iter->HasCurrent)
        {
            create_task(iter->Current->DeleteAsync(StorageDeleteOption::PermanentDelete));
            iter->MoveNext();
        }
    });
});

很乐意清除不幸用户选择的文件夹。恶意应用程序甚至不需要使用Win32 API来执行此操作。从逻辑上讲, API不是安全问题的原因。现有的UWP Win32 API显然可以正确处理本地存储访问,因此在Win32 API中支持FutureAccessList只需要很少的工作量。使UWP发展困难的这种愿望必须是有意的。 (毫无疑问,Centenial 会飞。没有人想要从Win32的灵活性转移到UWP监狱。)

编辑:我应该写

  

实现我想要的方式是不可能的!

因为文章确实提出了一个快速且非常智能的解决方案

  

如果库没有这样的接口而您无法添加,那么您需要将StorageFile内容复制到应用程序数据文件夹(可能在TemporaryFolder中),然后将路径传递给临时副本到库

所以在我的情况下,每次用户选择一个存储库文件夹时,我都可以将整个文件夹复制到本地存储,对它们进行操作,然后将整个文件复制回原来的位置。当然&#34;我想要的方式&#34;上面指的是高效的,你不必来回复制。