更改文件所有者会导致 UnauthorizedAccessException

问题描述 投票:0回答:1

我有一个小型 WinForms 工具,它偶尔会在执行关键修改之前创建文件的 ZIP 存档。该工具还实现了备份修剪,在这里我偶然发现了一个问题。如果较旧的备份是由管理员用户创建的,则低权限用户无法对其进行修剪。

我尝试将新创建的 ZIP 文件的所有者从当前用户更改为

BUILTIN\Users
(这适合我的目的):

private static void ChangeBackupOwner(string FilePath)
{
    try
    {
        FileInfo fi = new(FilePath);
        FileSecurity fs = fi.GetAccessControl(AccessControlSections.Owner);
        var sid = System.Security.Principal.WellKnownSidType.WinBuiltinIUsersSid;
        System.Security.Principal.SecurityIdentifier identity = new(sid, null);
        fs.SetOwner(identity);
        fi.SetAccessControl(fs);
    }
    catch (Exception ex)
    {
        Logger.PostMessage(ex.ToString());
    }
}

在 Windows 10 上,代码似乎正在执行其应该执行的操作,但

try
块中的最后一行抛出
System.UnauthorizedAccessException: Attempted to perform an unauthorized operation.

研究这个问题后,我发现了几个类似的SO问题,但它们都与访问权限的更改有关,而不是所有者,而且大多数都是旧的并且引用.NET Framework。

可以在 .NET 中完成吗?如果可以,如何实现?

附注我绝对希望避免任何形式的流程提升,因为这对于这项工作来说完全是一种过度的杀伤力。如果在不触发 UAC 的情况下无法完成,那就这样吧 - 我将跳过有限用户下不可删除的文件,以便下次管理员进行备份时,他们将能够修剪自己的内容。不过,我很好奇如何做到这一点。

c# winforms .net-8.0 file-ownership
1个回答
0
投票

虽然我仍然没有得到问题的答案,但我似乎已经找到了原来问题的解决方案。

经过大量研究文件和文件夹的权限后,我注意到应用程序放置备份的父文件夹没有

FullControl
组的
BUILTIN\Users
权限。一旦我设置它,受限用户就可以删除任何文件。

话虽如此,我还是很期待知道这个问题的答案。

© www.soinside.com 2019 - 2024. All rights reserved.