【问题标题】:GetAccessControl throws UnauthorizedAccessException accessing SystemData directoryGetAccessControl 抛出 UnauthorizedAccessException 访问 SystemData 目录
【发布时间】:2019-05-23 05:05:56
【问题描述】:

我一直在使用 C#,特别是 UWP/WPF 框架,编辑 C:\\ProgramData\\Microsoft\\Windows\\SystemData 的一些子目录,以便编辑和删除存储在 C:\\ProgramData\\Microsoft\\Windows\\SystemData\\ID\\ReadOnly 中的锁屏图像。

我最初只是手动更改了ProgramData目录的权限,然后是SystemData目录的权限,但是每当系统修改SystemData目录中的文件时,它的权限就会被重置。 (我希望我的程序的最终产品被安排定期运行,因此我不能每次都手动执行此操作。)只需调用:Directory.GetAccessControl("C:\\ProgramData\\Microsoft\\Windows\\SystemData"); 产生System.UnauthorizedAccessException: 'Attempted to perform an unauthorized operation.'

目录的默认权限不允许我在不修改其管理员权限的情况下读取目录的属性或访问其文件。由于我可以手动执行此操作(编辑权限以赋予自己完全控制权),我假设在 C# 中有一些方法可以这样做。我的app.manifest 确实有requireAdministrator 作为requestedExecutionLevel,我目前没有使用任何模拟,当前WindowsIdentity 显示为LAPTOP-ID\\USERNAME

当我什至无法获得对需要编辑权限的目录的访问控制时,如何执行这些更改?

【问题讨论】:

  • 设置锁屏图片可以用LockScreen.SetImageFileAsync来接近,为什么要修改文件夹访问权限?
  • 我一直在使用LockScreen.SetImageFileAsync,但是我发现锁屏的工作方式是ReadOnly的子目录名为LockScreen_ALockScreen_B等,当锁定屏幕设置(使用上述功能或手动设置),在目录中创建 4 个图像文件 - 原始版本和 3 个调整大小的版本。只有当用户注销时,才会创建第 5 个图像,即锁定屏幕图像。调用上述函数时,它只设置前 4 张图像,因此我需要在调用函数之前删除我认为的第 5 张图像

标签: c# wpf uwp readonly unauthorizedaccessexcepti


【解决方案1】:

调用上述函数时,它只设置前 4 张图像,因此我需要在调用该函数之前删除我认为的第 5 张。

您的描述是正确的。请检查以下屏幕截图,默认锁屏图像存储在LockScreen_o 文件夹中。每次调用上述方法(LockScreen.SetImageFileAsync)时,它都会创建一个新文件夹,并按 a-z 顺序命名文件夹名称。这意味着每个锁屏图像都有自己的文件夹,因此您无需删除锁屏后创建的第 5 个图像。文件夹的默认所有者是 无法使用 uwp 代码修改的系统

我使用以下代码设置锁屏,它适用于每张图片。

private async void Button_Click(object sender, RoutedEventArgs e)
{
    var picker = new Windows.Storage.Pickers.FileOpenPicker();
    picker.ViewMode = Windows.Storage.Pickers.PickerViewMode.Thumbnail;
    picker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.PicturesLibrary;
    picker.FileTypeFilter.Add(".jpg");
    picker.FileTypeFilter.Add(".jpeg");
    picker.FileTypeFilter.Add(".png");

    Windows.Storage.StorageFile file = await picker.PickSingleFileAsync();
    if (file != null)
    {
        await LockScreen.SetImageFileAsync(file);
    }
    else
    {

    }

}

【讨论】:

  • 我的相关代码如下:StorageFile file = await StorageFile.GetFileFromPathAsync(files[r.Next(0, files.Count)]); await LockScreen.SetImageFileAsync(file);(其余的在这里,是的,它还有许多其他不相关的问题:pastebin.com/4iZ53aRu)。我知道file.Path 是有效的,但是我仍然发现只有LockScreen_A 被更改,并且仍然只有前4 个图像被更改为file 指定的新图像。注销/锁定/重新启动我的计算机后,第 5 个甚至没有变化
  • 案例回复中的代码仅适用于uwp。我检查了您的 wpf 项目代码。其实我并不清楚你的问题。
  • 所以我尝试测试上面提供的代码只是为了看看我是否可以让它产生一些结果来为我提供一些见解,但是在我的空白 UWP 应用程序中 Windows.System.UserProfile 不包含 LockScreen for一些奇怪的原因,即使它存在于我的 WPF 应用程序中。这是什么原因造成的?
  • uwp中没有LockScreenknown folder这样的,uwp只提供换锁屏的方法,不提供锁屏文件夹的路径。
  • 对不起,如果我不清楚,但我指的是 LockScreen 内的类(即Windows.System.UserProfile.LockScreen),我似乎无法在 UWP 中访问,但我可以访问它在 WPF 中。我可以访问Windows.System.UserProfile 中的所有其他类,除了LockScreen 和可能还有一两个其他类
猜你喜欢
  • 1970-01-01
  • 2012-02-17
  • 2017-11-12
  • 2022-01-21
  • 2016-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多