防止用户删除、修改、分机

Posted

技术标签:

【中文标题】防止用户删除、修改、分机【英文标题】:Preventing a user from deleting, modifying, ext 【发布时间】:2015-05-15 08:54:29 【问题描述】:

我需要制作一个从文本文件中读取数据并根据文本文件中找到的特定数据更改程序状态的程序,其中我的程序需要读取、写入和创建文本文件的权限。

我希望阻止用户甚至其他软件删除、修改或复制文件。我将如何开始实施呢?

【问题讨论】:

尝试详细说明,展示一些示例等等。现在完全不清楚你在问什么,你的问题是什么。 让我重新表述一下,以确保我理解:您的软件从配置文件中读取数据,并且您希望确保没有人篡改该文件。对吗? 我猜他在找那个安德烈。到目前为止,您尝试了什么? 是的@AndreiV。我希望我的程序读取文本文件的内容并调整程序状态,例如显示一个页面以创建管理员帐户或以用户 ext 登录 无法阻止用户或其他程序读取或修改文件。 Windows 上的程序只能与运行该程序的用户具有相同的访问权限。您可以做的是创建另一个运行程序的用户,并仅为该用户设置文件的访问权限,但该用户当然将拥有对该文件的完全访问权限,并且同一用户将运行的任何其他程序将也有访问权限。 【参考方案1】:

您可以通过三种方式实现这一目标:

1) 应用程序启动后立即获取您的文件句柄并锁定文件。这当然只有在应用程序一直运行(例如作为服务)时才有效

2) 调整文件安全选项卡中的权限并将其设置为只读。为写访问创建技术用户(在域中效果最好)。在使用模拟 (WindowsImpersonationContext) 时与技术用户一起在您的程序中打开文件。使用很简单:

using (new Impersonation(domain, username, password))

    // do whatever you want

一个示例类,它将为您提供一个 WindowsImpersonationContext(应该像一个魅力一样工作):

[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
public class Impersonation : IDisposable

    private readonly SafeTokenHandle _handle;
    private readonly WindowsImpersonationContext _context;

    const int LOGON32_LOGON_NEW_CREDENTIALS = 9;

    public Impersonation(string domain, string username, string password)
    
        var ok = LogonUser(username, domain, password,
                       LOGON32_LOGON_NEW_CREDENTIALS, 0, out this._handle);
        if (!ok)
        
            var errorCode = Marshal.GetLastWin32Error();
            throw new ApplicationException(string.Format("Could not impersonate the elevated user.  LogonUser returned error code 0.", errorCode));
        

        this._context = WindowsIdentity.Impersonate(this._handle.DangerousGetHandle());
    

    public void Dispose()
    
        this._context.Dispose();
        this._handle.Dispose();
    

    [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    private static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, out SafeTokenHandle phToken);

    public sealed class SafeTokenHandle : SafeHandleZeroOrMinusOneIsInvalid
    
        private SafeTokenHandle()
            : base(true)  

        [DllImport("kernel32.dll")]
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
        [SuppressUnmanagedCodeSecurity]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool CloseHandle(IntPtr handle);

        protected override bool ReleaseHandle()
        
            return CloseHandle(handle);
        
    

此处显示了另一种尝试(包括使用):Open a shared file under another user and domain?

3) 显然以具有访问权限的不同用户身份运行程序 - 所有其他用户都具有只读权限(在注册为服务或使用 runas /user 命令时使用技术用户)

【讨论】:

【参考方案2】:

您可以使用特定的访问条件 (https://msdn.microsoft.com/de-de/library/s67691sb(v=vs.110).aspx) 打开文件。 如果您在此处拒绝该权限,应用程序将无法修改数据。 为了明确这一点,您的应用程序访问权限是只读的,您无法修改它。

在 C# 中无法阻止其他应用程序或用户删除/修改/任何您的文本文件。您可以限制文件系统中的权限,仅此而已。

如果这很重要,那么您应该重新考虑您的实施。 C# 在应用程序配置中提供资源文件,例如实例或应用程序特定参数。

【讨论】:

以上是关于防止用户删除、修改、分机的主要内容,如果未能解决你的问题,请参考以下文章

如何防止Linux系统中某个关键文件被修改

解决root用户都没有权限执行的问题

完整修改删除,防止数据库字符串攻击

linux下修改rm命令防止误删除

如何防止删除 blob?

sticky 特殊权限