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

使用Win32 API拒绝UWP文件夹访问权限,uwp,Uwp,我正在移植以获得一个。一种方案是让用户使用选择一个存储库文件夹,然后将其添加到中,这样应用程序就可以使用常见的Git功能访问它。问题是底层Git代码严重依赖Win32 API文件和文件夹访问,例如FindFirstFile,MoveFileEx。。。对于文件和文件夹stat,open。。。应用程序报告在尝试访问它时权限被拒绝。(该代码适用于应用程序本地存储中的文件夹。我还检查了通常的stdio仅适用于该文件夹。除此之外,不能使用fopen。) 有没有可行的解决办法?难道不应该在不同的受支持API

我正在移植以获得一个。一种方案是让用户使用选择一个存储库文件夹,然后将其添加到中,这样应用程序就可以使用常见的Git功能访问它。问题是底层Git代码严重依赖Win32 API文件和文件夹访问,例如
FindFirstFile
MoveFileEx
。。。对于文件和文件夹
stat
open
。。。应用程序报告在尝试访问它时权限被拒绝。(该代码适用于应用程序本地存储中的文件夹。我还检查了通常的
stdio
仅适用于该文件夹。除此之外,不能使用
fopen
。)


有没有可行的解决办法?难道不应该在不同的受支持API之间尊重权限吗?我可能错过了这一点?(我不敢尝试移植
libgit2
所需的所有POSIX。一方面,它将保证效率低下。另一方面,它极易出错,例如编写
mmap
,它与
open
配合得很好)

实现这样的目标是不可能的

根据@RobCaplan的说法,微软的天才们已经发明了一种既不安全也不向后兼容的安全存储解决方案。也就是说,让开发人员的生活更轻松:一旦用户授予应用程序
存储文件夹
,应用程序可以使用提供的
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();
        }
    });
});
auto folderPicker=ref new Windows::Storage::picker::folderPicker();
folderPicker->FileTypeFilter->Clear();
folderPicker->FileTypeFilter->Append(“*”);
创建任务(folderPicker->PickSingleFolderAsync()),然后([](Windows::Storage::StorageFolder^文件夹)
{
如果(文件夹==nullptr)
取消当前任务();
Windows::Storage::AccessCache::StorageApplicationPermissions::FutureAccessList->添加(文件夹);
创建任务(文件夹->GetItemsAsync())。然后([](IVectorView^项)
{
//删除文件夹内容或对其进行加密并要求付款
自动iter=项目->第一个();
while(国际热核实验堆->电流)
{
创建任务(iter->Current->DeleteAsync(StorageDeleteOption::PermanentDelete));
iter->MoveNext();
}
});
});
将很高兴地清除一个不幸的用户选择的文件夹。恶意应用甚至不需要使用Win32 API来实现这一点。从逻辑上讲,API不是安全问题的原因。现有的UWP Win32 API显然能够正确地处理本地存储访问,因此在Win32 API中支持
FutureAccessList
,需要花费最少的努力;这种使UWP开发变得困难的愿望必须是有意的。(毫无疑问,Centennial不会飞。没有人愿意从Win32的巨大灵活性转移到UWP监狱。)

编辑:我应该写

按我所希望的方式做这样的事是不可能的

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

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


因此,在我的情况下,每次用户选择一个存储库文件夹时,我都可以将整个文件夹复制到本地存储,对其进行操作,然后将整个文件夹复制回其原始位置。当然,上面的“我想要的方式”指的是一种高效的方式,你不必来回复制东西。

你说得对。StoreApp/UWP应用程序使用“应用程序容器”完整性级别(IL)。通过使用此IL,操作系统可以为应用程序创建一个沙箱-从本问题开始,应用程序无法访问开箱即用。但是,对于centennial,它使用“中等”完整性级别。此级别与普通win32应用程序相同。这意味着centennial应用程序没有uwp那样的沙箱。但是…但是…这也会造成安全风险。这是一把双刃剑…@pnp0a03正如我所写,我不认为API访问是安全问题。在现实世界安全漏洞的最新历史中,主要问题始终是用户和生活中的事实,这使得实现系统的可用性友好和安全性变得不可能:通常,有人被愚弄了,他/她仍然可以在UWP中(例如,我可以将上述代码更改为勒索软件)。因此,Win32应用程序没有安全风险。(事实上,当涉及到C/C++时,大多数漏洞都来自缓冲区溢出,这是指针固有的危险。)试试这个解决方案——尽管它可能并不完全适合您。@PeterTorr MSFT感谢您的指针。可悲的是,原则上确实如此,但对我的情况没有多大帮助。问题是,大多数需要文件访问的软件都是通过文件路径访问的。对于所讨论的案例,
libgit2
不提供通过文件夹句柄打开存储库的API。除非我执行查找和重定向库正在使用的所有可能的Win32 API(如
MapViewOfFile
等)的不希望的操作,否则它将无法工作。明白。这是当前平台的已知限制。@PeterTorr MSFT感谢您承认此问题。如果可以升级Win32以无缝方式考虑到
StorageFile
权限,那就太好了。(我的意思是当用户通过选择器选择
存储(文件|文件夹)
时,应用程序应该能够通过传统的API端点访问底层存储。)您可以向上投票。