【发布时间】:2010-11-18 15:53:35
【问题描述】:
我有一个将某些文件存储在目录中的 Windows 应用程序。我想知道.net中是否有一种方法可以限制用户不能直接访问它(只需转到Windows中的该目录并获取文件),因此只有我的应用程序可以添加/验证/删除该目录中的文件。
【问题讨论】:
标签: c# windows security permissions windows-xp
我有一个将某些文件存储在目录中的 Windows 应用程序。我想知道.net中是否有一种方法可以限制用户不能直接访问它(只需转到Windows中的该目录并获取文件),因此只有我的应用程序可以添加/验证/删除该目录中的文件。
【问题讨论】:
标签: c# windows security permissions windows-xp
只有当您的应用程序使用与运行应用程序的用户不同的凭据运行时,这才有可能。
默认情况下,所有应用程序都使用启动进程的用户的凭据运行。这意味着应用程序具有与用户相同的目录和文件限制。如果没有不同的帐户,应用程序只能降低它访问文件系统的能力,而不能增加它。
处理文件系统通常是邪恶的。即使您可以让用户不在该目录中播放,您仍然不能相信结果将处于与您离开它们完全相同的状态。其他用户、物理磁盘损坏或任何数量的其他因素都可能损坏您的文件。
对文件系统进行合理编程的唯一方法是从一开始就期待失败,并在它实际工作时算自己幸运。
【讨论】:
应用程序需要以特定用户身份运行 - 该用户将始终拥有与您的应用程序相同的权限。您可能会创建一个以管理员身份运行的服务来阻止标准用户访问目录,但管理员仍然可以更改目录中的内容。
我建议您为您的问题寻找另一种方法。有潜在的替代方案 - 也许您应该考虑在目录内容上保留某种类型的加密哈希。这至少可以让您验证内容没有被更改,尽管它不会阻止更改发生。
【讨论】:
查看 FileSystemWatcher - 它不会阻止目录更改,但允许通知程序有关目录的更改。
【讨论】:
正如其他人所提到的,您需要应用程序充当与当前登录的用户不同的用户。您应该查看“模拟”,这里有一些链接可以让您开始让您的应用程序充当执行某些任务时的不同用户:
http://csharptuning.blogspot.com/2007/06/impersonation-in-c.html
【讨论】:
最简单(尽管不安全)的方法是使用用户一无所知的隐藏文件夹。所以 \servername\hiddenfiles$
更安全的替代方法是更改程序用于访问文件夹的凭据。他们是否有必要以自己的身份访问它?
另一种方法是为每个不知道密码的用户创建一个虚拟帐户。使其与他们的 Windows 登录相关,因此 domain\myname 变为 domain\mynamehidden。然后使用它连接到目录。
这将确保一切都可以很好地审计。
【讨论】:
您可以在 .Net 中使用独立存储吗?虽然它不一定限制在您的用户之外,但它可能更难找到......(存储在本地设置\应用程序数据\登录用户的隔离存储下)
通过使用/导入 System.Io.IsolatedStorage 的代码,您可以创建目录、文件等...正常。
您也不必跟踪它所在的 HD 上的实际目录,因为 .Net 对此进行了管理。也许是一个不错的加分项。
【讨论】: