当用户是管理员时,为啥 .NET 应用程序不能覆盖文件?

Posted

技术标签:

【中文标题】当用户是管理员时,为啥 .NET 应用程序不能覆盖文件?【英文标题】:Why can .NET app not overwrite file when user is Administrator?当用户是管理员时,为什么 .NET 应用程序不能覆盖文件? 【发布时间】:2019-09-25 01:46:56 【问题描述】:

我的 WPF 应用程序将文件下载并缓存到 C:\ProgramData\CompanyName\ProductName\Data\ 目录。

如果其他用户在下载(创建)文件时已登录,即使我是管理员,我也无法覆盖该文件来更新它。

为什么我也是管理员用户时没有写入权限? 屏幕截图显示了我无法覆盖的文件的文件权限。

我知道我必须提升流程以执行“管理”任务 (as explained here),但看到其他用户是管理员(我也是),文件的“所有者”是'管理员' - 为什么我对所有者在同一组中的文件没有写权限?为什么我们不共享相同的特权?

【问题讨论】:

管理权限不是这样工作的。即使您是管理员组的成员,您也必须请求提升才能使用管理权限。请参阅:Elevation: Accquiring the Admin Token in Administrator vs Standard Accounts in Windows 相关:What precisely does 'Run as administrator' do? Run as Administrator vs. Administrator group的可能重复 【参考方案1】:

下载并保存文件后,您可以通过如下代码为所有用户(或任何其他适当的组)设置完全访问权限:

var fileSecurity = File.GetAccessControl(path);

fileSecurity.AddAccessRule(
    new FileSystemAccessRule(
        new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null),
        FileSystemRights.FullControl,
        AccessControlType.Allow));

File.SetAccessControl(path, fileSecurity);

【讨论】:

允许所有用户修改文件存在安全风险,尤其是对于使用该目录中的可执行文件的应用程序 @Ferrybig 我们说的是 C:\ProgramData,而不是 C:\Programs。 OP 正在询问一些下载和缓存的文件,这些文件本质上应该是临时的。 @Clemens 但是为什么如果我授予新组“NewGroup”的权限,如果当前组“管理员”的所有成员都没有权限,那么为什么所有成员都具有写入权限?有什么区别? @DefenestrationDay 您为您喜欢的任何 SecurityIdentifier 明确设置了 FileSystemRights.FullControl。看看 WellKnownSidType 枚举。

以上是关于当用户是管理员时,为啥 .NET 应用程序不能覆盖文件?的主要内容,如果未能解决你的问题,请参考以下文章

更新:为啥当用户是管理员时关系有效,但当普通用户时不会?

当应用被用户杀死时,工作管理器不工作。为啥?

为啥我的windows里开启来宾账户,但是来宾账户不能登录

为啥我们不能在 C# 中覆盖方法时更改访问修饰符?

为啥身份验证类型 - 当我们创建新的 Web APi 服务时,.NET Core 中 Web API 的个人用户帐户不可用

当 Windows 用户不是管理员时,ReadXml 的不同行为