将配置文件放置在重定向文件夹中时,Configuration.Save 方法会引发未经授权的访问错误

Posted

技术标签:

【中文标题】将配置文件放置在重定向文件夹中时,Configuration.Save 方法会引发未经授权的访问错误【英文标题】:Configuration.Save method throws Unauthorized access error when the config file is placed in redirected folder 【发布时间】:2017-05-15 09:34:03 【问题描述】:

我已经实现了一个 winform 应用程序。我使用配置类将应用程序的用户设置存储在配置文件中。我将 exe 与配置文件一起存储在文件夹下

C:\Users\\AppData\Local

这在正常情况下工作正常,但在用户将 Appdata 文件夹重定向到某个服务器地址的情况下,我会遇到问题。在这种情况下,我会遇到异常:

试图执行未经授权的操作。

我在这里发现了一些类似的问题,但没有一个有任何令人满意的答案。我尝试在运行 Configuration.Save 命令之前删除配置文件,但出现异常:

配置文件已被另一个程序更改。

那么,我该如何解决这个问题。 这是我更新配置文件的代码:

string exePath = Path.Combine(Path.GetDirectoryName(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)), @"Local\<folder name>\<exe file name>");
Configuration configFile = ConfigurationManager.OpenExeConfiguration(exePath);
if (configFile.AppSettings.Settings[key] != null)

    configFile.AppSettings.Settings.Remove(key);

if (param)

    configFile.AppSettings.Settings.Add(key, value);

configFile.Save(ConfigurationSaveMode.Modified);

这是异常的堆栈跟踪:

at System.Security.AccessControl.Win32.SetSecurityInfo(ResourceType
 type, String name, SafeHandle handle, SecurityInfos securityInformation, SecurityIdentifier owner, SecurityIdentifier group, GenericAcl sacl, GenericAcl dacl)    
at System.Security.AccessControl.NativeObjectSecurity.Persist(String
 name, SafeHandle handle, AccessControlSections includeSections, Object
 exceptionContext)    
at System.Security.AccessControl.NativeObjectSecurity.Persist(String
 name, AccessControlSections includeSections, Object exceptionContext) 
at System.Security.AccessControl.NativeObjectSecurity.Persist(String
 name, AccessControlSections includeSections)    
at System.Security.AccessControl.FileSystemSecurity.Persist(String
 fullPath)    
at System.IO.File.SetAccessControl(String path, FileSecurity fileSecurity)    
at System.Configuration.Internal.WriteFileContext.DuplicateTemplateAttributes(String source, String destination)    
at System.Configuration.Internal.WriteFileContext.DuplicateFileAttributes(String source, String destination)    
at System.Configuration.Internal.WriteFileContext.Complete(String
filename, Boolean success)    
at  System.Configuration.Internal.InternalConfigHost.StaticWriteCompleted(String
streamName, Boolean success, Object writeContext, Boolean assertPermissions)    at System.Configuration.Internal.InternalConfigHost.System.Configuration.Internal.IInternalConfigHost.WriteCompleted(String streamName, Boolean success, Object writeContext, Boolean assertPermissions)    
at System.Configuration.Internal.InternalConfigHost.System.Configuration.Internal.IInternalConfigHost.WriteCompleted(String streamName, Boolean success, Object writeContext)    
at
 System.Configuration.Internal.DelegatingConfigHost.WriteCompleted(String streamName, Boolean success, Object writeContext)    
at System.Configuration.UpdateConfigHost.WriteCompleted(String
streamName, Boolean success, Object writeContext)    
at System.Configuration.MgmtConfigurationRecord.SaveAs(String filename,
ConfigurationSaveMode saveMode, Boolean forceUpdateAll)    
at System.Configuration.Configuration.SaveAsImpl(String filename, ConfigurationSaveMode saveMode, Boolean forceSaveAll)    
at UtilityClasses.ConfigurationHandler.UpdateConfigFile(String key, String value, Boolean param)

【问题讨论】:

请分享您的代码 @S.Petrosov 添加了代码。 我认为问题在于运行应用程序的用户没有该路径的权限 @S.Petrosov 用户拥有完全权限,我可以在此位置创建和修改 xml 文件。 好的。让我们尝试以下。打开该文件夹的共享,然后重试 【参考方案1】:

在使用ConfigurationManager 更改存储在网络共享上的配置文件时,我有非常相似的经历。

事实证明,Configuration.Save 最初在同一位置创建了一个临时文件,desired access 设置为 Write DAC(写入目录访问控制)。

它甚至在documentation中这么说:

当“创建者所有者”列在 包含配置文件的目录,保存的当前用户 成为文件的新所有者并继承授予的权限 到“创作者所有者”。这会导致权限提升 当前用户和删除前所有者的权限。

我可以在我的环境中找到的唯一解决方法是将配置复制到本地目录,在本地更改文件,然后将其复制回来。

【讨论】:

【参考方案2】:

你有两种方法可以解决这个问题: 1.共享网络文件夹,使同一网络的用户不会自动授权。 2. 使用用户凭据通过授权并连接到网络路径。

【讨论】:

但这似乎不是连接问题,因为我还在同一路径创建和修改了许多 xml 和文本文件。它们没有任何问题。只有配置文件给出问题。 我还为这个问题添加了堆栈跟踪。【参考方案3】:

解决方法

    检查共享文件夹上特定用户的属性。它可能缺少 WriteExtended 属性。

    检查共享文件夹的创建者,该文件夹继承了创建者的所有权限。

    检查是否可以将共享文件夹的配置更改为非 c: 驱动器文件夹。

【讨论】:

以上是关于将配置文件放置在重定向文件夹中时,Configuration.Save 方法会引发未经授权的访问错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在重定向后通过wget下载文件名

Magento安装卡在重定向循环中[关闭]

spring security 在重定向到 logout.jsp 时给出错误

放置在外部脚本文件中时 Javascript 不执行

laravel 4.2在重定向时重新生成会话

Laravel 表单请求动态字段在重定向时消失