仅允许管理员删除文件?

2024-01-03

我正在编写一个 C# 应用程序,我想设置(在应用程序启动时)权限,以便只有管理员才能删除应用程序使用的文件。所有其他用户不应删除它或修改其权限。

应保护该文件免受标准文件系统使用的影响(因此,除了管理员之外,没有人可以删除它)。只有管​​理员应该能够设置文件权限。此外,其他用户应该能够读/写它。

这可能吗?我在这里找到了一些代码示例,但它们都不起作用。 我正在尝试的代码:

FileSecurity fSecurity = File.GetAccessControl("database.sdf");

        AuthorizationRuleCollection rules = fSecurity.GetAccessRules(true, true, typeof(System.Security.Principal.SecurityIdentifier));
        foreach (AuthorizationRule rule in rules)
        {
            System.Security.Principal.NTAccount account =
                (System.Security.Principal.NTAccount)rule.IdentityReference.Translate(typeof(System.Security.Principal.NTAccount));
            if (account.Value != "BUILTIN\\Administrators")
            {
                fSecurity.AddAccessRule(new FileSystemAccessRule(account.Value, FileSystemRights.Delete, AccessControlType.Deny));
            }
        }

        File.SetAccessControl("database.sdf", fSecurity);    

当以普通用户而非管理员身份运行应用程序时,我可以通过编程方式配置文件权限和所有者吗?

谢谢你!

PS 该文件是 SQL Server Compact 数据库。


在我们开始之前,我先说一下:

System.Security.Principal.NTAccount account =
    (System.Security.Principal.NTAccount)rule.IdentityReference.Translate(typeof(System.Security.Principal.NTAccount));
if (account.Value != "BUILTIN\\Administrators")

is 完全没有必要.

内置的管理员组是一个知名安全主体 https://support.microsoft.com/en-us/kb/243330,并保证always具有相同的安全标识符(S-1-5-32-544),易于比较。


您当前为所有已经拥有访问规则的主体显式授予“拒绝删除”的过程也可能会适得其反。

假设 ACL 中已存在具有以下特征的访问规则:

身份:每个人
访问权: Read
控制类型: Allow

恭喜!你现在已经含蓄地否认了everyone删除文件的权利,包括管理员组。

你想做的是:

  1. 确保管理员组是文件的所有者
  2. 删除所有授予“允许删除”权限的现有访问规则(明确or隐含地)
  3. 添加单个访问规则,授予管理员组允许完全控制权
  4. 删除所有继承的规则并保护 ACL 免遭继承

// Way safer than string comparison against "BUILTIN\\Administrators"
IdentityReference BuiltinAdministrators = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null);

// Grab ACL from file
FileSecurity FileACL = File.GetAccessControl(TargetFilePath);

// Check if correct owner is set
if (FileACL.GetOwner(typeof(SecurityIdentifier)) != BuiltinAdministrators)
{
    // If not, make it so!
    FileACL.SetOwner(BuiltinAdministrators);
}

foreach (FileSystemAccessRule fsRule in FileACL.GetAccessRules(true, false, typeof(SecurityIdentifier)))
{
    // Check if rule grants delete
    if ((fsRule.FileSystemRights & FileSystemRights.Delete) == FileSystemRights.Delete)
    {
        // If so, nuke it!
        FileACL.RemoveAccessRule(fsRule);
    }
}

// Add a single explicit rule to allow FullControl
FileACL.AddAccessRule(new FileSystemAccessRule(BuiltinAdministrators, FileSystemRights.FullControl, AccessControlType.Allow));

// Enable protection from inheritance, remove existing inherited rules
FileACL.SetAccessRuleProtection(true, false);

// Write ACL back to file
File.SetAccessControl(TargetFilePath, FileACL);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

仅允许管理员删除文件? 的相关文章

  • 如何检查QProcess是否正确执行?

    QProcess process sdcompare QString command sdcompare QStringList args sdcompare command sdcompare diff args sdcompare lt
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • 在新的浏览器进程中打开 URL

    我需要在新的浏览器进程中打开 URL 当浏览器进程退出时我需要收到通知 我当前使用的代码如下 Process browser new Process browser EnableRaisingEvents true browser Star
  • 在 Unity 进程和另一个 C# 进程之间进行本地 IPC 的最快方法 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我希望每秒大约 30 次从 C 应用程序向我的 Unity 应用程序传送大量数据 由于 Unity 不支持映射内存和管道 我考虑了 t
  • C# Dns.GetHostEntry 不返回连接到 WiFi 的移动设备的名称

    我有一个 C 中的 Windows 窗体应用程序 我试图获取列表中所有客户端的主机名 下面给出的是 ra00l 来自此链接的代码示例 GetHostEntry 非常慢 https stackoverflow com questions 99
  • 无法在 Windows 运行时组件库的 UserControl 中创建依赖项属性

    我想在用户控件内创建数据可绑定属性 这个用户控件包含一个 Windows 运行时组件 项目 我使用下面的代码来创建属性 public MyItem CurrentItem get return MyItem GetValue Current
  • 单击 form2 上的按钮触发 form 1 中的方法

    我对 Windows 窗体很陌生 我想知道是否可以通过单击表单 2 中的按钮来触发表单 1 中的方法 我的表格 1 有一个组合框 我的 Form 2 有一个 保存 按钮 我想要实现的是 当用户单击表单 2 中的 保存 时 我需要检查表单 1
  • 将 Excel 导入到 Datagridview

    我使用此代码打开 Excel 文件并将其保存在 DataGridView 中 string name Items string constr Provider Microsoft Jet OLEDB 4 0 Data Source Dial
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • std::async 与重载函数

    可能的重复 std bind 重载解析 https stackoverflow com questions 4159487 stdbind overload resolution 考虑以下 C 示例 class A public int f
  • .NET中的LinkedList是循环链表吗?

    我需要一个循环链表 所以我想知道是否LinkedList是循环链表吗 每当您想要移动列表中的 下一个 块时 以循环方式使用它的快速解决方案 current current Next current List First 电流在哪里Linke
  • 用于 C# 的 TripleDES IV?

    所以当我说这样的话 TripleDES tripledes TripleDES Create Rfc2898DeriveBytes pdb new Rfc2898DeriveBytes password plain tripledes Ke
  • Server.MapPath - 给定的物理路径,预期的虚拟路径

    我正在使用这行代码 var files Directory GetFiles Server MapPath E ftproot sales 在文件夹中查找文件 但是我收到错误消息说 给定物理路径但虚拟路径 预期的 我对在 C 中使用 Sys
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • 如何将 Roslyn 语义模型返回的类型符号名称与 Mono.Cecil 返回的类型符号名称相匹配?

    我有以下代码 var paramDeclType m semanticModel GetTypeInfo paramDecl Type Type Where paramDeclType ToString returns System Col
  • 如何使用 Word Automation 获取页面范围

    如何使用办公自动化找到 Microsoft Word 中第 n 页的范围 似乎没有 getPageRange n 函数 并且不清楚它们是如何划分的 这就是您从 VBA 执行此操作的方法 转换为 Matlab COM 调用应该相当简单 Pub

随机推荐

  • 在CFScript中获取新插入的记录ID

    我有一些代码将记录与请求信息一起插入到日志中 发送请求并发回响应后 我将使用响应信息更新记录 有没有办法获取新插入记录的 ID 以便我可以引用它并在收到响应后更新它 我知道使用 CF 标签可以使用 SET NO COUNT 但它似乎在 CF
  • websockets项目的jetty运行错误

    我正在尝试让 websockets 与 jetty 一起使用 我正在日食 当我尝试运行它时 控制台上出现以下错误 java lang NoClassDefFoundError org objectweb asm ClassVisitor 我
  • Ruby 中的类和该类的单例有什么区别?

    好吧 我正在尝试用 Ruby 进行一些元编程 但我有点困惑 根据我读过的几篇文章 例如this one http ryanangilly com post 234897271 dynamically adding class methods
  • 根据 WooCommerce 中的产品或类别隐藏特定运输选项

    我的 WooCommerce 网站使用 3 种不同的运输类型 皇家邮件签收 7 天 保证第二天 已记录的交付 有些产品只能使用选项 1 发货 当该产品添加到购物车时 我创建的运输类别有助于在购物车中显示选项 1 但其他两个选项仍然可见 不允
  • 如何在 Mac 中打开 conda shell

    我是 conda 和 mac 的新手 我主要使用 Ubuntu 和 pip mac 上有 conda shell吗 我想我在某处读到没有 如果是这种情况 我该如何运行如下命令 conda env create f environment y
  • 将图像数据存储在 MySQL 数据库中?

    我正在实施一个处理大量图像的项目 您认为以下两种方法的优缺点是什么 我需要存储数千个项目 每个项目作为多个字符串属性和一个图像 每个项目作为 ID 整数 MyISAM 表 How would you store the images 方法1
  • Android和PHP登录认证

    我正在尝试在 android 上制作一个应用程序 其中用户需要登录应用程序才能使用它 登录验证将由 PHP Web 服务完成 我有一个login java class CustomeHTTPClient这是我从互联网上获得的示例代码 有一种
  • 提高字典模糊字符串匹配的性能

    所以我目前正在使用第二弦 http secondstring sourceforge net 对于模糊字符串匹配 我有一个大字典可以比较 字典中的每个条目都有一个关联的非唯一标识符 我目前正在使用 hashMap 来存储这本字典 当我想要进
  • 需要加入列表的元素,但加入后保留元素周围的 ''

    我的清单是 example a b c 如果我使用 join example 去除 围绕元素 我希望我的输出是 example a b c 有什么优雅的方法可以做到吗 不确定它是否优雅 但它可以工作 基于默认表示list对象 因此根本不灵活
  • Google App Engine——Java 还是 Python? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我注意到这是在以下帖子 https stackoverflow com questions 1085898 choosing java vs p
  • 如何使用 vue-i18n 加载我真正需要的语言文件?

    使用 vue i18n 可以很容易地翻译你的 Vue js 应用程序 但随着项目的增长 您不想加载所有语言的所有消息 大多数用户从不切换语言 我们为每种语言都有单独的域 并且切换语言的情况极为罕见 所以 vue i18n 似乎支持延迟加载
  • Kubernetes 上的多代理 Kafka 如何设置 KAFKA_ADVERTISED_HOST_NAME

    我当前包含 3 个 Kafka 代理的 Kafka 部署文件如下所示 apiVersion apps v1beta1 kind StatefulSet metadata name kafka spec selector matchLabel
  • 如何在 Android 中在按钮上显示动态文本并自动调整其大小?

    我正在开发一个项目 需要我根据用户在按钮上的选择来显示一些动态文本 我知道如何进行文本显示部分 但我一直困惑于如何在固定大小的按钮上正确显示不同的文本 例如 苹果 和 我有一个苹果 如何才能达到显示 苹果 时文字尺寸变大适合按钮 而显示 我
  • pylint 1.4 报告所有 C 扩展上的 E1101(无成员)

    我们一直是pylint 它的静态分析已经成为我们所有 python 项目的关键部分 并且节省了大量的时间来追踪隐藏的错误 但从 1 3 gt 1 4 升级后 几乎所有编译的 c 扩展都会导致 E1101 no member 错误 之前运行完
  • 如何在Python中合并两个嵌套的字典?

    我有两个嵌套的字典数据 我想将它们合并以在 python 中创建一本字典 词典数据 dict1 employee dev1 Roy dict2 employee dev2 Biswas 现在我试图用它们创建一个像下面这样的字典 所需输出 d
  • 从文件路径中提取文件扩展名

    如何提取给定文件路径的文件扩展名作为字符 我知道我可以通过正则表达式来做到这一点regexpr alnum x 但想知道是否有内置函数可以处理这个问题 使用 R 基本工具很容易找到这种东西 例如 路径 无论如何 加载tools打包并读取 f
  • 允许使用 docker-machine 配置的主机中存在不安全的注册表

    有没有什么可以配置的 允许不安全 ssl用于使用 docker machine 创建的 docker 守护进程 命令 docker machine create driver virtualbox dev eval docker machi
  • 不同状态下不同的词法分析器规则

    我一直在为 HTML 中嵌入的某些模板语言 FreeMarker 开发解析器 例如 abc h1 Welcome user lt if user Big Joe gt our beloved leader h1 p Our latest p
  • 是否可以创建一个没有 EOF 标记的文件?

    我们有一个读取平面文件并解析数据的应用程序 该文件不包含用于进行校验和的标头信息或总数据 所以我想创建测试用例以确保我们的应用程序正确处理 不完整 文件 有没有办法创建没有 EOF 标记的平面文件 也许有一个工具可以用来从现有文本文件中删除
  • 仅允许管理员删除文件?

    我正在编写一个 C 应用程序 我想设置 在应用程序启动时 权限 以便只有管理员才能删除应用程序使用的文件 所有其他用户不应删除它或修改其权限 应保护该文件免受标准文件系统使用的影响 因此 除了管理员之外 没有人可以删除它 只有管 理员应该能