11

Microsoft .Net Framework--Application Development Foundation Training Kit book の第 8 章レッスン 2: アプリケーション ドメインの構成に取り組んでいます。

ShowWinIni は、実行したいプログラムのアセンブリ名です

object[] hostEvidence = { new Zone(SecurityZone.MyComputer) };
Evidence e = new Evidence(hostEvidence, null);

// Create an AppDomain.
AppDomain d = AppDomain.CreateDomain("New Domain", e);

// Run the assembly
d.ExecuteAssemblyByName("ShowWinIni");

私が実行すると:

AppDomain d = AppDomain.CreateDomain("New Domain", e);

次のメッセージが表示されます。「このメソッドは、.NET Framework によって廃止された CAS ポリシーを暗黙的に使用しています。互換性の理由から CAS ポリシーを有効にするには、NetFx40_LegacySecurityPolicy 構成スイッチを使用してください。http: //go.microsoftを参照してください。詳細については、 .com/fwlink/?LinkID=155570をご覧ください。"

Evidence オブジェクトなしで AppDomain を作成すると、アセンブリを正常に実行できます。

もちろん、私はhttp://go.microsoft.com/fwlink/?LinkID=155570にアクセスしましたが、指定された特権を持つアプリケーション ドメインを作成する方法についてまだ混乱しています。

次に見つけた最も役立つサイトはhttp://msdn.microsoft.com/en-us/library/bb763046.aspxでしたが、StrongName オブジェクトは NULL に計算されます。

StrongName fullTrustAssembly =
     typeof(Program).Assembly.Evidence.GetHostEvidence<StrongName>();

プログラムは、このすべてのコードを実装するクラスの名前です。

あなたのアドバイスとヒントを事前にありがとう!

4

2 に答える 2

12

NetFX40_LegacySecurityPolicy を有効にしなくても元のコード例を機能させる方法を見つけました。

EvidenceBase[] hostEvidence = { new Zone(SecurityZone.MyComputer) };
Evidence e = new Evidence(hostEvidence, null);

AppDomain d = AppDomain.CreateDomain("New Domain", e);

d.ExecuteAssemblyByName("ShowWinIni");

SecurityZone を Internet に変更すると、これは機能しません。廃止された CAS セキュリティ ポリシーを使用しようとするため、NotSupportedException が発生します。私が欲しいのは SecurityException です...実行したいアセンブリに必要なアクセス許可がないことを意味します。

アクセス許可が制限された AppDomain でアセンブリを実行するには、サンドボックスを使用する必要があります。私が見つけたサンドボックス化の最良の例はここにあります: http://www.simple-talk.com/dotnet/.net-framework/whats-new-in-code-access-security-in-.net-framework-4.0- --part-i/

そのページは、4.0 で CAS に加えられた変更も非常によく説明していると思います!

MSDN を含む多くの情報源から、呼び出し時に StrongName 配列を提供する必要があると確信しました。

AppDomain.CreateDomain( string friendlyName,
                        Evidence securityInfo,
                        AppDomainSetup info,
                        PermissionSet grantSet,
                        params StrongName[] fullTrustAssemblies);

元の投稿で述べたように、私は (そして今も) の代わりに StrongName オブジェクトを取得するのに問題がありましたnull。私はそれを必要としなかったことが判明しました!

これは、サンドボックス化の私の完成した例です:

Evidence ev = new Evidence();
ev.AddHostEvidence(new Zone(SecurityZone.Internet));
PermissionSet internetPS = SecurityManager.GetStandardSandbox(ev);

AppDomainSetup adSetup = new AppDomainSetup();
adSetup.ApplicationBase = Path.GetFullPath(pathToUntrusted);

AppDomain newDomain = AppDomain.CreateDomain("Sandbox Domain", null, adSetup, internetPS);

newDomain.ExecuteAssemblyByName(untrustedAssembly);

pathToUntrusted= アセンブリへのファイル パスの文字列表現

untrustedAssembly= アセンブリ名の文字列表現

于 2011-02-07T17:37:21.360 に答える
7

同僚に助けを求めた後、私はこれを機能させました。

どうやらこの本の演習は、.Net の 3.5 フレームワークで使用するように設計されていたようですが、私は 4.0 を使用しています。私のプロジェクトと ShowWinIni プロジェクトのプロパティの両方を変更して 3.5 フレームワークを使用した後、すべてが機能しました... しかし、私はまだこれを 4.0 フレームワークで機能させたいと思っていました。

次のメッセージに対処するには: 「このメソッドは、.NET Framework によって廃止された CAS ポリシーを暗黙的に使用します。互換性の理由で CAS ポリシーを有効にするには、NetFx40_LegacySecurityPolicy 構成スイッチを使用してください。http: //go.microsoftを参照してください。詳細については、 .com/fwlink/?LinkID=155570をご覧ください。"

app.config ファイルを作成し、以下を追加しました。

<configuration>
   <runtime>
      <NetFx40_LegacySecurityPolicy enabled="true"/>
   </runtime>
</configuration>

NetFx40_LegacySecurityPolicy の詳細については、 http://msdn.microsoft.com/en-us/library/dd409253.aspx を参照してください。

これにより、プログラムが信頼できないアプリケーションになり、デバッグしようとするとセキュリティ例外がスローされました。アプリケーションを再び信頼できるものにするために、ClickOnce セキュリティ設定を有効にし、プロジェクトのプロパティで「これは完全に信頼できるアプリケーションです」とマークしました。

この時点で、プログラムをデバッグできましたが、次のステートメントを実行するとセキュリティ例外がスローされました。

d.ExecuteAssemblyByName("ShowWinIni");

AppDomain オブジェクトを作成するときに Evidence オブジェクトを含めようとする前は、このステートメントは正常に機能していました。別の方法があることが判明しました... AppDomain.ExecuteAssemblyByName(string,evidence)、http://msdn.microsoft.com/en-us/library/5kd4z003.aspxで読むことができます。そこで、上記のコード スニペットを次のコードに置き換えました。

d.ExecuteAssemblyByName("ShowWinIni", e);

「e」は、元の質問で作成された証拠オブジェクトです。

今、これが最善の解決策だとは思いません。理想的には、自分のプログラムに NetFx40_LegacySecurityPolicy の使用を強制したくありません。また、実際のアプリは廃止されたメソッドに依存すべきではないと考えています。誰かが私と同じ本を読んでいるなら、この解決策は投稿する価値があると思いました.

于 2011-01-29T15:36:13.717 に答える