6

私の .NET クライアント アプリケーションでは、Scope=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 のものは内部であるため、シリアライゼーション部分などを再構築する必要があるようです。そしてもちろん今使っている設定を崩したくないので、「1行コメントアウト」(ファイルの所有者の設定)だけでそのまま再構築するだけでもとんでもない量のコードに見えます。

他に何を試すことができますか?

お客様がファイル共有のアクセス許可を変更することはできません...

4

1 に答える 1