【问题标题】:Lock and Unlock a folder using windows service developed using c#使用 c# 开发的 Windows 服务锁定和解锁文件夹
【发布时间】:2019-02-07 06:54:23
【问题描述】:

我知道类似的问题已经被问过很多次了,但没有什么符合我的要求。如果匹配,请随时指导我找到正确的答案。

我有一个用c#,.net framework 4.6开发的windows服务。
此 Windows 服务每 1 小时从其他服务接收一个任务(这在这个问题中并不重要)。它实际上处理它接收到的任务。完成每个任务大约需要 10-15 分钟。 在任务执行过程中,它会在服务器的一个文件夹中生成多个文件。
在 App.config 中,我保存了文件夹路径。例如,我有 appsetting,其值为“C:\Test”。
每个任务都有一个taskid,例如它是Task1。所以我们创建一个像“C:\Test\Task1”这样的文件夹。所有文件都在这里生成。一旦执行完成,这个文件夹就会被删除。

现在我的要求是从收到任务到执行完成,我必须锁定生成这些文件的文件夹。
执行完成后,我需要立即解锁文件夹。锁定是指,没有人应该能够打开此文件夹。

我知道文件可以被锁定。但是如何在这里锁定文件夹。任何人都可以在这里帮助我或指导我正确的文章。
这会很有帮助。非常感谢!

【问题讨论】:

  • 这个“锁”是为了防止什么?意外访问还是恶意访问?具体来说,您要防范什么?
  • 我认为,解决方案将是特定于操作系统(Windows)的。也许你应该添加 windows 标签。
  • @Damien_The_Unbeliever,我的意思是锁,它不应该是可访问的。原因是,我们正在客户的服务器中部署此服务。以及作为一些机密信息生成的文件。而且我们不希望客户访问这些文件。
  • 那么不要把它们放在他们的电脑上。您试图阻止访问的任何其他操作都被规避。

标签: c# windows windows-services .net-4.6


【解决方案1】:

这是可能的,而且我认为有不止一种方法可以做到这一点。

首先,您必须创建一个临时的windows account。为什么?仅允许一个用户访问此指定目录并删除对其他帐户的访问权限。您可以使用 System.Security.AccessControl 命名空间中的 DirectorySecurity 类来完成此操作。

还有一个例子。

PS:msdn也有类似的帖子

【讨论】:

  • 但是,如果本应阻止访问此文件夹的人是这台机器上的管理员,他们只会在中途终止服务进程并获得该文件夹的所有权。 “锁定”被击败,访问被授予。 OP 想要做的事情并不是真正可以实现的(如果是的话,游戏和电影行业显然在消除盗版的努力中都错过了它)
【解决方案2】:

锁定磁盘上的文件是一件很难做到/正确的事情。您可能希望考虑的一种替代方法是改用Memory-Mapped files,特别是非持久内存映射文件

非持久文件是与磁盘上的文件无关的内存映射文件。当最后一个进程完成对文件的处理时,数据会丢失,文件会被垃圾回收器回收。这些文件适用于为进程间通信 (IPC) 创建共享内存。

这是一个非常简短的示例,展示了创建非持久内存映射文件、写入和读取文件:

static void Main(string[] args)
{
    var file = CreateFile("Mary had a little lamb, its fleece was white as snow...");

    var contentFromFile = ReadFile(file);

    Console.WriteLine(contentFromFile);
}

private static MemoryMappedFile CreateFile(string content)
{
    var file = MemoryMappedFile.CreateNew("temp.csv", 1048576);

    using (var stream = file.CreateViewStream())
    {
        using (var writer = new StreamWriter(stream))
        {
            writer.WriteLine(content);
        }
    }

    return file;
}

private static string ReadFile(MemoryMappedFile file)
{
    using (var stream = file.CreateViewStream())
    {
        using (var reader = new StreamReader(stream))
        {
            var contentReadFromStream = reader.ReadLine();
            return contentReadFromStream;
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    • 2020-01-12
    • 2016-12-11
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多