在C#中模拟用户进行本地文件访问

时间:2013-11-20 00:35:39

标签: c# impersonation

我想解决的问题是:我正在编写一个多个用户可以访问的应用程序。根据Windows对文件夹的权限限制访问 - 如果需要,将授予用户访问包含应用程序的文件夹的权限。

无论好坏,应用程序将其数据存储在与应用程序相同的网络中的文件中。我不希望用户能够直接编辑数据,因此我计划限制对数据文件的访问。

我一直试图使用的方法是拥有一个“服务用户”,它具有对数据的读/写访问权限,并在应用程序中使用模拟作为服务用户“登录”,执行所需读/写,并返回原始用户。

在没有运气的情况下,我做了几次不同的尝试。也许最简单/最有希望的是基于马克约翰逊的回答:

How do you do Impersonation in .NET?

我按如下方式使用它:

            using (new Impersonation(serviceAccount.Domain, serviceAccount.UserName, serviceAccount.Password))
            {
                DoImport(app);
            }

其中'DoImport(app)'执行数据读取。

然而,这会产生错误'访问路径'......'被拒绝'。我正在尝试在本地运行它(路径是C:...),我已经限制了对我登录的用户的路径的访问权限,但我正在尝试模拟的用户具有访问权限。

我在这里做错了吗?有没有更好的方法来实现我的目标?

谢谢,

安德鲁

3 个答案:

答案 0 :(得分:2)

以下链接中的代码似乎可以执行我之后的操作:

http://www.codeproject.com/Articles/10090/A-small-C-Class-for-impersonating-a-User

我认为令牌重复是重要的部分,但我不确定原因。

我确实还有另外一个问题 - 需要为“DoImport(...)'在模仿之后无法加载功能,由于某种原因访问被拒绝(对于模糊性,我没有时间研究这个)。确保他们在进行模拟之前加载,通过一些虚拟函数调用或强制加载的代码(参见例如Is there a way to force all referenced assemblies to be loaded into the app domain?)就可以了。

答案 1 :(得分:1)

登录的用户(或您尝试模拟的用户)拥有对文件的访问权限这一事实 NOT 暗示您正在运行的应用程序拥有权利

您是否考虑过以管理员权限运行该应用程序? (您必须将文件的访问权限授予应用程序!) 或者,如果您使用调试并从VisualStuido(或其他IDE)运行它,请尝试首先以管理员权限运行IDE。

在大多数情况下,这可以解决问题,但是,将数据存储在驱动器上,用户可以对其进行物理访问,这绝不是我建议的,您是否考虑过存储和访问数据的不同方法?或者这样做的原因是什么?

答案 2 :(得分:1)

如果没有管理员权限,您无法访问其他useraccounts,但您是否考虑过将这些文件放在共享文件夹中?如果要识别文件的创建者/所有者,可以使用getowner。或者您可以在共享文件夹中使用子文件夹。我希望这会有所帮助。