公用文件夹上的 Windows 窗体 app.config

Posted

技术标签:

【中文标题】公用文件夹上的 Windows 窗体 app.config【英文标题】:windows forms app.config on common files folder 【发布时间】:2012-05-17 07:08:51 【问题描述】:

我有一个在 app.config 文件中存储单个用户名和密码的应用程序。 我目前有 app.config 在运行时可写,以便用户能够更改它。

问题从使用安装项目安装开始,app.config 安装在任何用户都不可写的程序文件上。

所以,我在安装时将 app.config 位置更改为公共文件夹,以便所有用户都可以读取和写入。

现在,在安装时,存储在那里的数据似乎根本无法访问,例如使用 ConfigurationManager.AppSettings["networkPath"] 返回空字符串。

我做错了什么?

【问题讨论】:

您需要做的是从您的安装程序中仅授予对程序文件中的应用程序配置文件的访问权限。你用什么设置? 我使用默认设置和部署项目,我如何授予对应用配置文件的访问权限? 你是指来自visual studio的msi吗?尽管我不太确定,但它必须有一个选项。但是忘记它,您可以从您的 C# 应用程序中执行此操作。看我的回答 您可以改用应用程序设置文件吗?这会将自身本地化到用户的应用程序数据文件夹,因此不会涉及对安装项目的任何权限更改(通常意味着只有在 Program Files 目录中时才能读取)。 @Reddog 访问 appconfig 文件,默认的更快,因为它是在加载程序集时加载的。每次你想要一个值时,它都不需要写。但是是的,这也是一种选择 【参考方案1】:

您可以通过两种方式做到这一点:

    由您的安装程序授予对程序文件中的应用程序配置文件的特殊权限。我们使用 innosetup 来完成。如果你做不到,那么从你的程序启动开始:

    static void Main()
    
        GrantAccess()
    
    
    private static bool GrantAccess()
    
        FileInfo fInfo = new FileInfo(Assembly.GetEntryAssembly().Location + ".config");
        FileSecurity dSecurity = fInfo .GetAccessControl();
        fSecurity.AddAccessRule(new FileSystemAccessRule("everyone", 
                                                         FileSystemRights.FullControl, 
                                                         AccessControlType.Allow));
        fInfo .SetAccessControl(fSecurity);
        return true;
    
    

    否则你可以选择另一个位置来放置你的 appconfig 文件,然后像这样读取它:

    ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
    fileMap.ExeConfigFilename = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), Assembly.GetEntryAssembly().GetName().Name) + ".exe.config";
    Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, 
                                                                           ConfigurationUserLevel.None);
    return config.AppSettings.Settings["Key"].Value);
    

在我看来,这是一个糟糕的选择。

【讨论】:

以上是关于公用文件夹上的 Windows 窗体 app.config的主要内容,如果未能解决你的问题,请参考以下文章

重定向到 Lumen (Laravel) 上的公用文件夹

Windows 窗体上的甘特图控件 [关闭]

在Windows server 2008R2系统下,IIS7上的网站怎么和Apache公用一个80端口呢?

捕获托管在 mfc 对话框上的 windows 窗体事件(c#)

屏幕截图窗口窗体

控件上的Windows窗体键盘快捷键