在C#中模拟用户以获取本地文件访问权限

4
我需要解决的情况是:我正在编写一个应用程序,多个用户将可以访问。访问基于Windows文件夹权限进行限制 - 如果需要,将授予用户访问包含应用程序的文件夹的权限。
好或坏,应用程序将其数据存储在与应用程序相同的网络上的文件中。我不希望用户能够直接编辑数据,因此我计划限制对数据文件的访问。
我一直试图使用的方法是具有对数据进行读/写访问权限的“服务用户”,并在应用程序中使用模拟登录作为服务用户,执行所需的读/写操作,然后返回到原始用户。
我尝试了几种不同的方法都没有成功。也许最简单/最有前途的方法是基于Mark Johnson在这里的答案: 如何在.NET中进行模拟? 我按照以下方式使用它:
            using (new Impersonation(serviceAccount.Domain, serviceAccount.UserName, serviceAccount.Password))
            {
                DoImport(app);
            }

“DoImport(app)”执行数据读取操作。

然而,这会出现错误“拒绝访问路径'...'”。我正在尝试在本地运行此代码(路径为C:...),我已经限制了登录用户对该路径的访问权限,但是我要模拟的用户具有访问权限。

我做错了什么吗?有更好的方法来实现我的目标吗?

谢谢,

安德鲁

3个回答

3
下面链接中的代码似乎可以实现我想要的功能:http://www.codeproject.com/Articles/10090/A-small-C-Class-for-impersonating-a-User。我认为令牌复制是重要的部分,但我不确定为什么。在进行模拟操作后,我遇到了另一个问题 - 任何需要加载以用于“DoImport(...)”函数的程序集都无法加载,由于某种原因而被拒绝访问(抱歉说得含糊,我没有时间去研究)。通过一些虚拟调用或强制加载的代码来确保在进行模拟操作之前加载它们(请参见例如有没有一种方法可以强制所有引用的程序集被加载到应用程序域中?)解决了这个问题。

1

用户(已登录的或您试图模拟的)具有文件访问权限,并不意味着您运行的应用程序具有这些权限。请注意,这两者是不同的。

您是否考虑以管理员权限运行应用程序?(您需要授予应用程序对这些文件的访问权限!) 或者,如果您正在使用调试并从Visual Studio(或其他IDE)运行它,请先以管理员权限运行IDE。

这通常可以解决大多数问题,但是,将数据存储在用户可以物理访问的驱动器上绝非我推荐的做法。您有没有考虑过不同的数据存储和访问方式?或者采用这种方式的原因是什么?


我不想授予应用程序的每个用户管理员权限(我上面概述的是我测试模拟的方式,在“实际”情况下将有其他用户运行它),所以不幸的是我不能真正使用那种方法。这个想法是让用户没有物理访问数据,这就是为什么我试图通过模拟来实现它 - 我拒绝了他们的常规访问,但当他们使用应用程序时,它会通过模拟为他们加载数据。 - andrewnd

1
你没有管理员权限就不能访问其他用户账户,但你考虑过把文件放在共享文件夹里吗?如果你想识别文件的创建者/所有者,可以使用 getowner。或者你也可以在共享文件夹中使用子文件夹。希望这能帮到你。

所以听起来你的答案是我不能做我正在尝试的事情...这很有帮助,谢谢。我的目标是限制用户独立访问文件(比如通过Windows资源管理器),因此我尝试使用模拟来访问受限文件夹。 - andrewnd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接