当用户是管理员时,为啥 .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 应用程序不能覆盖文件?的主要内容,如果未能解决你的问题,请参考以下文章
为啥身份验证类型 - 当我们创建新的 Web APi 服务时,.NET Core 中 Web API 的个人用户帐户不可用