5

我有一个可供 .NET(特别是 C#)中的所有用户(管理员或受限用户)使用的应用程序。

当应用程序首次启动时 - 它会在 C:\Documents and Settings\All Users\Documents\ 中创建一些文件,供所有后续启动使用。

如果 XP 中的受限用户是第一个启动应用程序的用户,它会正常创建文件,受限用户和管理员都可以正常运行。

但是,如果管理员(或者我猜是不同的受限用户)是第一个启动应用程序的人,那么受限用户将无法运行该应用程序。

如果由管理员创建,它无法读取/写入的两个文件是 Log4Net 日志文件和 SQLite db 文件。

SQLite 数据库文件是用一个 straitforward .NET File.Copy(sourcepath,destinationpath) 创建的。源路径是与应用程序一起安装的种子数据库文件 - 所以首先运行它会从 C:\Program Files\app install\seed.db 复制它

复制文件时有没有办法设置文件的权限?File.SetAccessControl() 也许?我不清楚它是如何工作的。

另一个问题是 log4Net 滚动文件附加程序不会滚动旧文件并创建新文件,因为旧文件是管理员用户在运行应用程序时创建的。

有任何想法吗?具有讽刺意味的是,这一切在 Vista 中使用受限/管理员帐户都可以正常工作 - 这仅在 XP 中使用管理员/受限帐户发生。

4

2 回答 2

6

我认为SetAccessControl是要走的路。也许是这样的:

// get the existing access controls
FileSecurity fs = File.GetAccessControl(yourFilename);

// add the new rule to the existing settings
fs.AddAccessRule(new FileSystemAccessRule(
    @"DOMAIN\Users",  // or "BUILTIN\Users", "COMPUTER\AccountName" etc
    FileSystemRights.Modify,
    AccessControlType.Allow));

// set the updated access controls
File.SetAccessControl(yourFilename, fs);

注意:从文件中获取现有的访问控制列表,然后将新规则添加到该列表中,这一点很重要。如果您只是从头开始创建一个新的访问控制列表,那么它将完全覆盖现有的权限。

于 2009-02-11T00:34:24.680 回答
2

是的,没错,就是 SetAccessControl 方法,这里有一个很好的例子 来自 satankidneypie 的帖子)

祝你好运

于 2009-02-11T00:31:08.993 回答