在我的.NET客户端应用程序中,我使用默认的设置提供程序,范围为User且Roaming=True。在大多数环境下,无论是客户端还是终端服务器,都可以正常工作,但对于一个Citrix终端服务器群集的客户来说,情况并非如此。每当调用Properties.Settings.Default.Save()
时,就会抛出以下异常:
System.UnauthorizedAccessException: Attempted to perform an unauthorized operation.
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.FileSystemSecurity.Persist(String fullPath)
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.DelegatingConfigHost.WriteCompleted(String streamName, Boolean success, Object writeContext, Boolean assertPermissions)
at System.Configuration.ClientSettingsStore.ClientSettingsConfigurationHost.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.ClientSettingsStore.WriteSettings(String sectionName, Boolean isRoaming, IDictionary newSettings)
at System.Configuration.LocalFileSettingsProvider.SetPropertyValues(SettingsContext context, SettingsPropertyValueCollection values)
at System.Configuration.SettingsBase.SaveCore()
at System.Configuration.SettingsBase.Save()
这个异常的原因是:
System.Configuration.Internal.WriteFileContext
在用户的漫游配置文件中写入用户设置的新副本 (...newcfg
)。然后,DuplicateTemplateAttributes
尝试修改此文件的 ACL,并将所有权显式设置为当前用户。- 在这位客户的情况下,这会失败,因为漫游配置文件存储在文件共享上,而用户只有“读取”和“更改”权限,没有“完全控制”权限。他们可能在 NTFS 上拥有完全控制 (因为默认情况下,您是创建的所有文件的“所有者”,作为所有者,您可以对文件执行任何操作,无论是否显式设置了“完全控制”),但似乎在 SMB 共享级别被阻止。
这种行为对我来说毫无意义:鉴于 LocalFileSystemProvider
总是使用当前用户的私有配置文件夹 (本地或漫游),我们可以安全地假设用户已经是所有者了。
由于 WriteFileContext
捕获了异常、删除了临时的 .newcfg
文件,然后重新抛出异常,所以没有办法在我的代码中捕获异常并重命名文件或以某种方式获取其内容,因为当异常抛出时该文件已经被删除。
我找不到任何简单的方法来解决此问题,除了实现自己的设置提供程序。为此,似乎我甚至必须重建像序列化部分这样的所有 System.Configuration 东西,因为它们都是内部的。当然,我不想破坏当前使用的设置,所以看起来需要大量的代码才能以与“注释掉一行”相同的方式重新构建所有内容 (设置文件的所有者)。
还有其他什么方法可以尝试吗?
没有办法让客户更改其文件共享权限...