首页 文章

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

提问于
浏览
3

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

有这个可行的解决方案吗?不应该试图移植 libgit2 所需的所有POSIX . 一方面,它将保证效率低下 . 另一方面,它非常容易出错,例如写 mmapopen 配合得很好 . )

1 回答

  • 1

    实现这样的事情是 IMPOSSIBLE

    根据@RobCaplan https://blogs.msdn.microsoft.com/wsdevsol/2012/12/04/skip-the-path-stick-to-the-storagefile/,微软的天才发明了一种安全存储解决方案,既不会让开发人员的生活变得更轻松也更容易:一旦用户授予应用程序 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监狱 . )

    EDIT :我应该写的

    以我想要的方式实现这样的事情是不可能的!

    因为文章确实提出了一个快速而非常聪明的解决方案

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

    所以在我的情况下,每次用户选择一个存储库文件夹时,我都可以将整个文件夹复制到本地存储,对它们进行操作,然后将整个文件复制回原来的位置 . 当然,上面的"the way I wanted"指的是有效的,你不必来回复制东西 .

相关问题