コード アクセス セキュリティ例外のトラブルシューティング

アクセス許可によって、コードの実行権限を制御します。 アプリケーションを実行するときに、ランタイムによってアクセス許可が与えられます。 十分なアクセス許可があれば正常に実行され、ない場合はセキュリティ例外が発生します。

コードに与えられるアクセス許可は、アプリケーションが実行された場所 (インターネット、イントラネット、ローカル コンピューターなど) や、アプリケーションが実行されているコンピューターのセキュリティ設定によって決まります。 この設定はコンピューターによって異なるため、コードに十分なアクセス許可があるかどうかを確実に予想できません。

アクセス許可を要求することで、ローカル コンピューターのセキュリティ ポリシーで許可されている場合に、コードを確実に実行できます。 必要なアクセス許可を要求しないと、コードが実行されない可能性があります。 コードのアクセス許可と許可要求の詳細については、「コード アクセス許可」または「Requesting Permissions」を参照してください。 Try...Catch ブロックの詳細については、「Try...Catch...Finally ステートメント (Visual Basic)」を参照してください。

ClickOnce アプリケーションは、必要に応じて追加のアクセス許可を要求できます。この場合、アプリケーション デザイナーの [セキュリティ ページ] を使用します。 詳細については、「方法 : ClickOnce アプリケーションのカスタム アクセス許可を設定する」を参照してください。

コード アクセス セキュリティ例外には、次の原因が考えられます。

  • クリップボード。 クリップボードからプログラムで貼り付ける機能は、マネージ コードでは制限されています。これは、クリップボードに機密情報が含まれる可能性があるためです。

  • レジストリまたはファイル システムのアクセス。 ローカル ファイル システムへのアクセスは制限されています。 アセンブリと共に配置されているファイルまたはリソースにアクセスしている場合、コード Assembly.GetExecutingAssembly.Location を使用して、アセンブリへのパスを取得します。

  • ネットワーク アクセス。 アセンブリで、アセンブリを読み込むときと同じプロトコルを使用するようにします。 一般に、ネットワーク通信は、アセンブリの送信元である URL にのみ許可されます。

  • 印刷。 インターネット ゾーンで実行されているソフトウェアを印刷できるのは、コモン ダイアログを使用した場合のみです。 ユーザーにプリンターの選択を許可するときにコモン ダイアログを使用する場合、通常使うプリンターに限定されます。

  • シリアル化。 任意のデータからオブジェクトをリビルドする機能は、完全に信頼されて実行されているコードに限定されます。 XML をシリアル化する場合、一部のみコードを信頼することで、XmlSerializer 型を技術的には使用できます。 XmlSerializer 型の詳細については、「XmlSerializer クラス」を参照してください。

  • リフレクション。 ランタイムのリフレクション関係の機能は、一部しか信頼されていないコードでは使用が制限されていることがよくあります。

コードをテストしてコード アクセス セキュリティ例外をスローするかどうかを判断する

CodeAccessSecurityException をスローする可能性があるコードのブロックがある場合は、Try...Catch ブロックを使用し、可能な場合はコードの実行を許可し、できない場合はエラーに対処します。

ホスト システムで付与したアクセス許可によって動作を調整するように、アプリケーションをデザインすることもできます。 たとえば、アプリケーションに印刷の許可がない場合、メニューの [印刷] コマンドを無効にできます。

これをテストするには、FileIOPermission などの CodeAccessPermission 派生クラスのインスタンスを作成できます。 これで、Try...Catch ブロック内にある権限で、Demand メソッドを実行できるようになります。 例外がスローされると、アセンブリにアクセス許可はなくなります。

次の例では、EventLogPermission の実行または作成によって、アセンブリに EventLogPermission アクセス許可があるかどうかをテストしています。また、Try...Catch ブロック内の Demand メソッドを実行して、Demand が成功するかどうかを判断します。

Try
    Dim MyPermission As New EventLogPermission
    MyPermission.Demand()
    MsgBox(MyPermission.ToString())
Catch ex As Exception
    MsgBox("Assembly lacks EventLogPermission.")
End Try

参照

概念

コード アクセス許可

コード アクセス セキュリティの基礎

その他の技術情報

Requesting Permissions