1

別の AppDomain でいくつかのコードを起動していますが、コードは SQLite データベースにクエリを実行できる必要があります。AppDomain の PermissionState を Unrestricted に設定すると、すべてが機能します。ただし、AppDomain には、そのタスクを完了するために必要な最小限のアクセス許可を付与したいと考えています。

試行錯誤とともに多くの調査を行った結果、次のセキュリティ アクセス許可が必要であると判断しました: Execution、UnmanagedCode、SkipVerification。AppDomain で実行されているアセンブリを含むディレクトリには、PathDiscovery と Read の FileIOPermissions が必要です。SQLite db3 ファイルを含むディレクトリには、PathDiscovery、Read、および Write の FileIOPermissions が必要です。

ただし、これらの権限により、SQLite DB を開こうとすると、次の役に立たない例外が発生します。

System.Security.SecurityException はユーザー コードによって処理され
ませんでした。HResult=-2146233078 Message=Request failed.
ソース = System.Data.SQLite StackTrace: System.Data.SQLite.SQLiteConnectionHandle.op_Implicit(IntPtr db) で System.Data.SQLite.SQLite3.Open(String strFilename, SQLiteOpenFlagsEnum flags, Int32 maxPoolSize, Boolean usePool) で System.Data .SQLite.SQLiteConnection.Open() ...

AppDomain を生成するコードは次のとおりです。

public static ServerCacheSandboxer GetDomainInstance(string cachePath)
{
    string assembliesPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, ADENIUM_SERVER_ASSEMBLIES_FOLDER);
    AppDomainSetup appDomainSetup = new AppDomainSetup();
    appDomainSetup.ApplicationBase = assembliesPath;
    appDomainSetup.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;

    PermissionSet permissionSet = new PermissionSet(PermissionState.None);
    permissionSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution | SecurityPermissionFlag.UnmanagedCode | SecurityPermissionFlag.SkipVerification));
    permissionSet.AddPermission(new FileIOPermission(FileIOPermissionAccess.PathDiscovery | FileIOPermissionAccess.Read, assembliesPath));
    permissionSet.AddPermission(new FileIOPermission(FileIOPermissionAccess.PathDiscovery | FileIOPermissionAccess.Read | FileIOPermissionAccess.Write, cachePath));

    StrongName fullTrustAssembly = typeof(ServerCacheSandboxer).Assembly.Evidence.GetHostEvidence<StrongName>();
    AppDomain appDomain = AppDomain.CreateDomain("ServerCacheSandbox", null, appDomainSetup, permissionSet, fullTrustAssembly);
    ObjectHandle objectHandle = Activator.CreateInstanceFrom(appDomain, typeof(ServerCacheSandboxer).Assembly.ManifestModule.FullyQualifiedName, typeof(ServerCacheSandboxer).FullName);
    ServerCacheSandboxer domainInstance = objectHandle.Unwrap() as ServerCacheSandboxer;

    return domainInstance;
}
4

0 に答える 0